Bài 1 — Lần đầu đăng nhập
Trang này hướng dẫn đăng nhập lần đầu sau khi deploy và cấp quyền owner khởi tạo, để bạn có quyền quản trị trước khi tạo Space và mời team.
Đối tượng: quản trị viên hệ thống, ngay sau deploy đầu tiên. Bối cảnh: database mới hoàn toàn. Phân quyền fail-closed nên chưa ai có quyền gì, kể cả bạn. Thời gian: ~10 phút.
Vì sao bạn bị 403 — luồng danh tính
Mọi request đi qua 4 tầng phân giải danh tính theo thứ tự ưu tiên cứng (không tầng nào vượt tầng trước):
Điểm mấu chốt: role không bao giờ đến từ header (server cố tình bỏ qua x-forwarded-role
để chặn tự nâng quyền). Database mới = chưa ai là member của Space nào = 403 khắp nơi.
Bài này khắc phục bằng cách grant owner đầu tiên từ phía server.
Các bước
- Mở
https://agentjira.yourcompany.com. Cloudflare Access yêu cầu đăng nhập SSO. - Sau khi qua SSO, bạn vào được UI nhưng danh sách Space trống và mọi hành động trả 403 — đúng như thiết kế, chưa phải lỗi.
- Trên server, đặt email của bạn vào biến bootstrap (
/opt/agentjira/.env):
AGENTBOARD_BOOTSTRAP_OWNERS=lead@yourcompany.com
- Restart server và xác nhận grant:
docker compose -f docker-compose.prod.yml up -d agentjira_server
docker compose -f docker-compose.prod.yml logs agentjira_server | grep '\[rbac\]'
# → [rbac] applied 1 bootstrap owner grant(s) from AGENTBOARD_BOOTSTRAP_OWNERS
- Refresh UI → bạn là
ownertrên mọi Space đang tồn tại.
Server chỉ grant cho Space chưa có member nào (Space đã có người quản trị thì bỏ qua), nên lệnh này idempotent — chạy lại không nhân đôi quyền.
Xác minh
curl http://<host>/api/me | jq .
# → { "actor": { "id": "human:lead@yourcompany.com", "type": "human",
# "email": "lead@yourcompany.com", "role": "member" } }
# (role ở đây là role mặc định của actor; quyền thật theo từng Space xem ở Bài 2)
curl http://<host>/api/projects | jq 'length'
# → số Space bạn thấy được (không còn 0)
- Thấy log
[rbac] applied … bootstrap owner grant(s). Không thấy log mà vẫn 403? Server chỉ log khi grant được > 0 — kiểm tra tiếp:logs ... | grep '\[rbac\]'có dòngSpace(s) have no members and are therefore inaccessiblenghĩa là email bootstrap không khớp email SSO của bạn (sai chính tả / khác domain) — sửa.envvà restart lại. -
GET /api/metrảtype: human+ đúng email;GET /api/projectskhông rỗng.
Khác biệt theo môi trường
- Production
- DEV FULL-STACK
- DEV-LITE
Làm đúng 5 bước trên. Lệnh grant idempotent — vừa là đường khởi tạo lần đầu, vừa là đường break-glass khi mất hết admin sau này.
Chạy y như production: DEV_USER_EMAIL được đưa vào AGENTBOARD_BOOTSTRAP_OWNERS,
script kiểm chứng dòng log [rbac] applied. Dùng mode này để học và demo quy trình thật.
Bước này không cần: AGENTBOARD_DEV_IDENTITY=1 cấp owner cho mọi request từ loopback.
Đừng dùng DEV-LITE để học phân quyền — mọi thứ đều pass nên bạn không thấy 403 thật.
Bài tiếp theo: Bài 2 — Tạo Space đầu tiên.
Gặp lỗi? Xử lý sự cố — mẫu 403 sau bootstrap, SSO không qua, log [rbac] vắng mặt.
Đi tiếp: Bài 2 — Tạo Space đầu tiên · Phân quyền Board