$ aoox

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 apaowneradminmember
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:

SiapaMelihat project apa
Owner & admin instanceSemua project, tanpa perlu ditambahkan.
Pembuat projectProject yang ia buat — selalu sebagai admin project.
Member instance lainHanya project tempat ia ditambahkan; yang lain menjawab 404, bukan 403.
Peran projectBoleh
adminSemua yang bisa developer, plus kelola anggota project dan hapus project.
developerBuat & ubah aplikasi, database, stack, domain, mount, jobs, backup — pekerjaan sehari-hari.
viewerBaca 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

CaraKapanCatatan
/setupTabel pengguna masih kosongForm nama, email, password. Transaksi serializable — dua orang tidak bisa sama-sama jadi owner pertama.
ADMIN_EMAIL + ADMIN_PASSWORDSaat boot, bila belum ada penggunaUntuk instalasi otomatis. Idempotent: tidak pernah menimpa akun yang sudah ada; boleh dibiarkan di env.

Mengundang anggota

  1. 01Undangemail + peran → tautan tampil sekali
  2. 02Kirimsalin tautan, kirim lewat chat
  3. 03Bergabungpenerima isi nama + password
  4. 04Masuklangsung login, undangan ditutup
  1. Settings → Anggota → Undang anggota

    Isi Email dan Peran. Admin hanya bisa mengundang admin/member; owner bisa mengundang owner.

  2. Salin tautan — hanya tampil sekali

    https://panel.example.com/invite/9f3a1c…e21d

    Diawali WEB_ORIGIN; kalau masih IP, tautan berisi IP itu. aoox tidak mengirim email — kirim sendiri lewat chat.

  3. 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)

AksiDi manaCatatan
Ubah peranSelect peran di baris anggotaBerlaku pada request berikutnya.
Reset passwordIkon Set password baru (reset) di baris anggotaUntuk anggota yang lupa password; sampaikan password sementara lewat jalur aman, minta ganti.
Nonaktifkan 2FA anggotaBaris anggota (non-owner)Untuk yang kehilangan authenticator dan kode cadangan. Owner sendiri harus memakai kode cadangan.
Hapus penggunaBaris anggotaDitolak bila ia owner terakhir atau masih memiliki project (pindahkan/hapus project dulu). Undangan dan token API miliknya ikut hilang.
Keluarkan dari satu projectTab Anggota di halaman projectCukup 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)

  1. Aktifkan 2FA → pindai QR

    Aplikasi TOTP apa pun (Google Authenticator, Aegis, 1Password, Bitwarden).

  2. Masukkan kode 6 digit untuk konfirmasi

    Setelah benar, 10 kode cadangan ditampilkan sekali — simpan di password manager. Tiap kode sekali pakai.

  3. 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

  1. Kartu API token → beri Nama dan Kedaluwarsa

    Nama mis. GitLab CI; kedaluwarsa 30 hari, 90 hari, 1 tahun, atau tidak kedaluwarsa.

  2. 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).

  3. Salin token aoox_… — hanya tampil sekali

    Memakai token
    curl -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

GejalaPenyebab & solusi
Tautan undangan berisi IP / httpWEB_ORIGIN masih IP. Tetap bisa dipakai; untuk rapi, pasang domain panel dulu.
Undangan tidak berlakuSudah dipakai, kedaluwarsa (7 hari), dicabut, atau diganti undangan baru untuk email yang sama.
Tidak bisa menghapus penggunaOwner terakhir, atau masih memiliki project — pindahkan/hapus project dulu.
Sign-in minta kode padahal tidak punya authenticatorPakai kode cadangan; habis → minta owner menonaktifkan 2FA.
API token 401Kedaluwarsa/dicabut, atau header bukan Bearer aoox_…. Buat token baru.
Belum tersedia
SSO/OAuth; pengiriman undangan lewat email; memindahkan kepemilikan project.

Langkah berikutnya

Ada yang keliru? Edit halaman ini di GitLab ↗