DocsMulai
Pengguna & peran
Peran instance menentukan siapa boleh menyentuh infrastruktur; keanggotaan per project menentukan siapa melihat dan mengubah project mana.
- Dua lapis
- Peran instance + keanggotaan per project
- Undangan
- Tautan sekali pakai, 7 hari, tanpa email
- Keamanan
- 2FA TOTP, API token, audit log
Peran instance
Seperti di select peran UI: Member — project & deploy; Admin — + registry, server, notifikasi, terminal; Owner — semuanya.
| Boleh apa | owner | admin | member |
|---|---|---|---|
| Project yang dibuat sendiri atau ditugaskan | ✓ | ✓ | ✓ |
| Melihat & mengelola semua project | ✓ | ✓ | – |
| Deploy, rollback, backup, jobs, mount volume/file | ✓ | ✓ | ✓ |
| Data browser: baca | ✓ | ✓ | ✓ |
| Akun sendiri: password, 2FA, API token | ✓ | ✓ | ✓ |
| Data browser: tulis, Impor SQL, buat database tambahan | ✓ | ✓ | – |
| Undang anggota (admin/member) | ✓ | ✓ | – |
| Registry, server remote, Swarm, notifikasi, kredensial Git, tujuan S3 | ✓ | ✓ | – |
| Web terminal & bind mount | ✓ | ✓ | – |
| Audit log | ✓ | ✓ | – |
| Undang owner, ubah peran, hapus pengguna | ✓ | – | – |
| Reset password & nonaktifkan 2FA anggota | ✓ | – | – |
| Provision/hapus registry & proxy, GC, cleanup disk | ✓ | – | – |
| Init/keluar Swarm & kelola node, backup instance | ✓ | – | – |
- Peran dibaca ulang dari database setiap request: mengubah peran atau menghapus pengguna berlaku seketika, tanpa menunggu sesi (7 hari) kedaluwarsa.
- Owner tidak bisa menghapus/menurunkan dirinya sendiri bila ia owner terakhir, dan pengguna yang masih memiliki project tidak bisa dihapus.
Keanggotaan per project
Selain peran instance, setiap project punya daftar anggotanya sendiri (tab Anggota di halaman project). Inilah yang menentukan siapa melihat project itu:
| Siapa | Melihat project apa |
|---|---|
| Owner & admin instance | Semua project, tanpa perlu ditambahkan. |
| Pembuat project | Project yang ia buat — selalu sebagai admin project. |
| Member instance lain | Hanya project tempat ia ditambahkan; yang lain menjawab 404, bukan 403. |
| Peran project | Boleh |
|---|---|
| admin | Semua yang bisa developer, plus kelola anggota project dan hapus project. |
| developer | Buat & ubah aplikasi, database, stack, domain, mount, jobs, backup — pekerjaan sehari-hari. |
| viewer | Baca saja: status, log, metrik, daftar backup. Semua request yang mengubah ditolak, termasuk lewat API token. |
- Menambah anggota project memakai email akun yang sudah ada di instance — undang dulu ke instance bila belum punya akun.
- Pembatasan viewer ditegakkan terpusat di API untuk semua endpoint project, bukan sekadar disembunyikan di UI. Tiket log/terminal tetap bisa dibaca.
- Saat fitur ini dipasang, semua anggota yang ada di-backfill ke semua project sehingga upgrade tidak mengubah akses siapa pun — sesuaikan setelahnya bila ingin membatasi.
Owner pertama
| Cara | Kapan | Catatan |
|---|---|---|
/setup | Tabel pengguna masih kosong | Form nama, email, password. Transaksi serializable — dua orang tidak bisa sama-sama jadi owner pertama. |
ADMIN_EMAIL + ADMIN_PASSWORD | Saat boot, bila belum ada pengguna | Untuk instalasi otomatis. Idempotent: tidak pernah menimpa akun yang sudah ada; boleh dibiarkan di env. |
Mengundang anggota
- 01Undangemail + peran → tautan tampil sekali
- 02Kirimsalin tautan, kirim lewat chat
- 03Bergabungpenerima isi nama + password
- 04Masuklangsung login, undangan ditutup
Settings → Anggota → Undang anggota
Isi Email dan Peran. Admin hanya bisa mengundang admin/member; owner bisa mengundang owner.
Salin tautan — hanya tampil sekali
https://panel.example.com/invite/9f3a1c…e21dDiawali
WEB_ORIGIN; kalau masih IP, tautan berisi IP itu. aoox tidak mengirim email — kirim sendiri lewat chat.Penerima membuka tautan
Halaman undangan menampilkan email dan peran yang sudah ditetapkan; penerima hanya mengisi nama dan password (min. 8), lalu langsung masuk. Tautan menjadi tidak berlaku setelah dipakai.
Aturan undangan
- Berlaku 7 hari; satu tautan = satu akun.
- Mengundang email yang sudah punya undangan menunggu mengganti undangan lama (tautan lama mati).
- Daftar Undangan menunggu di kartu Anggota menampilkan yang belum diterima; bisa dicabut.
- Halaman terima undangan dibatasi 10 percobaan/menit per IP.
Mengelola anggota (owner)
| Aksi | Di mana | Catatan |
|---|---|---|
| Ubah peran | Select peran di baris anggota | Berlaku pada request berikutnya. |
| Reset password | Ikon Set password baru (reset) di baris anggota | Untuk anggota yang lupa password; sampaikan password sementara lewat jalur aman, minta ganti. |
| Nonaktifkan 2FA anggota | Baris anggota (non-owner) | Untuk yang kehilangan authenticator dan kode cadangan. Owner sendiri harus memakai kode cadangan. |
| Hapus pengguna | Baris anggota | Ditolak bila ia owner terakhir atau masih memiliki project (pindahkan/hapus project dulu). Undangan dan token API miliknya ikut hilang. |
| Keluarkan dari satu project | Tab Anggota di halaman project | Cukup dilakukan project admin; akun penggunanya tetap ada. |
Keamanan akun
Kartu Akun di Settings, untuk semua peran:
Ganti password
Isi Password sekarang + Password baru (min. 8). Sesi lain tidak dipaksa logout.
Verifikasi dua langkah (2FA)
Aktifkan 2FA → pindai QR
Aplikasi TOTP apa pun (Google Authenticator, Aegis, 1Password, Bitwarden).
Masukkan kode 6 digit untuk konfirmasi
Setelah benar, 10 kode cadangan ditampilkan sekali — simpan di password manager. Tiap kode sekali pakai.
Sign-in berikutnya jadi dua langkah
Password → halaman kode (TOTP atau kode cadangan). Langkah kedua harus selesai dalam 5 menit.
- Nonaktifkan 2FA dari kartu Akun membutuhkan password sekarang dan kode yang valid — tidak bisa dari sesi yang dicuri saja.
- Kehilangan authenticator: pakai kode cadangan; habis semua → minta owner menonaktifkan 2FA-mu. Owner terakhir tanpa kode cadangan tidak bisa dipulihkan dari UI — jangan sampai.
- API token tidak terpengaruh 2FA (dipakai tanpa langkah kedua).
API token
Kartu API token → beri Nama dan Kedaluwarsa
Nama mis.
GitLab CI; kedaluwarsa 30 hari, 90 hari, 1 tahun, atau tidak kedaluwarsa.Atur Hak (opsional): Baca saja dan Batasi ke project
Baca saja menolak semua request yang mengubah state — sama seperti peran viewer, termasuk tiket log websocket. Batasi ke project memilih satu atau beberapa project; token menjadi 404 di luar itu dan ditolak di semua rute Settings instance (server, registry, proxy).
Salin token aoox_… — hanya tampil sekali
Memakai tokencurl -H "Authorization: Bearer aoox_…" \ https://api.panel.example.com/applications/<id>/deploy -X POST
- Token bertindak sebagai pemiliknya dengan peran yang sama — Hak hanya bisa mempersempit, tidak pernah menambah akses di atas pemiliknya, termasuk untuk owner.
- Scope diperiksa di satu tempat sebelum route mana pun berjalan, jadi berlaku juga untuk CLI aoox yang memakai token yang sama.
- Token disimpan sebagai hash; hilang = buat baru. Cabut kapan saja dari daftar.
- Dokumentasi endpoint (OpenAPI/Swagger) di
<PUBLIC_API_URL>/docs.
Audit log
Settings → Audit log (owner/admin): siapa melakukan apa, kapan, dari IP mana — termasuk sign-in, deploy, perubahan env, undangan. Filter per aksi, mis. deploy, /databases/, sign-in. Body request disimpan dengan rahasia disensor; entri lebih tua dari 90 hari dihapus otomatis.
Praktik yang disarankan
- Minimal dua owner, keduanya dengan 2FA dan kode cadangan tersimpan.
- Beri peran member secara default; naikkan ke admin hanya bila perlu mengelola infrastruktur.
- Satu API token per integrasi, dengan kedaluwarsa — cabut saat integrasi pensiun.
- Cek audit log setelah insiden atau saat ada deploy yang tidak dikenali.
Jebakan umum
| Gejala | Penyebab & solusi |
|---|---|
| Tautan undangan berisi IP / http | WEB_ORIGIN masih IP. Tetap bisa dipakai; untuk rapi, pasang domain panel dulu. |
| Undangan tidak berlaku | Sudah dipakai, kedaluwarsa (7 hari), dicabut, atau diganti undangan baru untuk email yang sama. |
| Tidak bisa menghapus pengguna | Owner terakhir, atau masih memiliki project — pindahkan/hapus project dulu. |
| Sign-in minta kode padahal tidak punya authenticator | Pakai kode cadangan; habis → minta owner menonaktifkan 2FA. |
| API token 401 | Kedaluwarsa/dicabut, atau header bukan Bearer aoox_…. Buat token baru. |
Langkah berikutnya
Ada yang keliru? Edit halaman ini di GitLab ↗