Authentik: SSO Self-Hosted untuk Semua Aplikasi
Pelajari cara menjalankan Authentik 2026.8.3 dengan Docker Compose, mengatur secret dan akadmin, serta memakai forward auth Traefik untuk satu login di semua aplikasi.
Satu login untuk setiap aplikasi yang Anda host
Authentik adalah server SSO (single sign-on) self-hosted: pengguna Anda login sekali, lalu setiap aplikasi di belakangnya menerima sesi tersebut tanpa meminta password masing-masing. Instalasinya menggunakan file Docker Compose resmi dan dua secret yang dibuat secara otomatis. Bagian yang memerlukan pertimbangan lebih lanjut adalah konfigurasi setelah instalasi: mengarahkan reverse proxy ke Authentik dan menempatkan satu aplikasi yang sudah ada di belakang forward auth.
Authentik berjalan sebagai tiga service dalam file Compose tersebut: database PostgreSQL, proses server, dan proses worker. Container server juga menjalankan outpost tertanam, yaitu komponen yang menjawab pertanyaan "apakah request ini sudah login?" untuk setiap aplikasi yang dilindungi. Versi 2026.8.5 adalah release terbaru per 25 October 2026. Versi ini dipublikasikan pada 21 October 2026 sebagai patch terbaru dari seri 2026.8, yang dimulai dengan 2026.8.0 pada 18 August, dan menggantikan 2026.8.4 dari 14 October sebagai tag image default dalam file Compose resmi. Proyek ini meminta host dengan setidaknya 2 CPU core dan 2 GB RAM. Anggap itu sebagai batas minimum. PostgreSQL dan worker akan menggunakan memory setelah server berjalan selama satu hari.
Yang perlu disiapkan sebelum memulai
Anda memerlukan Docker Engine dengan plugin Compose v2. Anda dapat memastikannya dengan docker compose version. Jika perintah tersebut menampilkan error, bukan versi, instal plugin itu sebelum melanjutkan. Dasar-dasarnya dibahas dalam menjalankan aplikasi dengan Docker Compose di VPS. Anda juga memerlukan record DNS A yang mengarah ke server, yaitu auth.example.com dalam contoh di bawah, karena Authentik membuat URL pengalihan berdasarkan hostname yang digunakan browser.
Jalankan stack sebagai pengguna biasa yang menjadi anggota grup docker, bukan sebagai root. Keanggotaan dalam grup tersebut setara dengan akses root pada host. Karena itu, berikan keanggotaan tersebut hanya kepada satu akun deploy dan jangan kepada pengguna lain, sesuai prinsip akun pengguna dengan hak istimewa minimum di VPS.
Instal dengan file Compose resmi
sudo install -d -o "$USER" -g "$USER" /opt/authentik
cd /opt/authentik
wget https://docs.goauthentik.io/compose.yml
echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env
docker compose pull
docker compose up -ddocker compose ps seharusnya menampilkan tiga container yang semuanya aktif, dengan postgresql melaporkan healthy setelah pemeriksaannya berhasil. Start pertama menjalankan migrasi database, jadi tunggu sekitar satu menit sebelum antarmuka web dapat merespons.
Kedua nilai yang dibuat otomatis sama-sama penting, tetapi untuk alasan yang berbeda. PG_PASS adalah password PostgreSQL. Dokumentasi instalasi Authentik menyatakan bahwa password dengan panjang lebih dari 99 karakter tidak didukung, jadi jika Anda memilih password sendiri, gunakan panjang di bawah batas tersebut; password yang dibuat otomatis jauh lebih pendek. AUTHENTIK_SECRET_KEY adalah key yang digunakan Authentik untuk menandatangani cookie. Dokumentasi konfigurasinya menyatakan bahwa perubahan key akan membatalkan sesi aktif, sehingga penggunaan key baru akan me-logout semua pengguna yang sedang login. Atur .env ke mode 600 dan simpan salinannya di tempat yang aman bersama backup, agar hasil restore menggunakan key yang sama seperti sebelumnya.
File Compose menandai kedua nilai tersebut sebagai wajib menggunakan bentuk ${VAR:?message}: ${PG_PASS:?database password required} pada service PostgreSQL dan ${AUTHENTIK_SECRET_KEY:?secret key required} pada server serta worker. Artinya, Compose menolak start jika file tersebut tidak ada. Menjalankan docker compose up -d dari direktori yang salah akan menampilkan baris seperti required variable AUTHENTIK_SECRET_KEY is missing a value: secret key required lalu berhenti. Pesan tersebut menunjukkan masalah path, bukan masalah konfigurasi.
Nilai environment yang penting
Semua pengaturan lainnya dimasukkan ke dalam file .env yang sama. Authentik memetakan garis bawah ganda ke kunci konfigurasi bertingkat, sehingga AUTHENTIK_EMAIL__HOST mengatur email.host. Garis bawah tunggal tidak memetakan ke kunci bertingkat, yang merupakan alasan paling umum mengapa suatu pengaturan tampak tidak berfungsi.
AUTHENTIK_BOOTSTRAP_PASSWORDmengatur kata sandi penggunaakadminbawaan saat pertama kali dijalankan, sehingga Anda tidak perlu mengetikkannya ke dalam formulir web publik.AUTHENTIK_BOOTSTRAP_EMAILdanAUTHENTIK_BOOTSTRAP_TOKENmengatur alamat pengguna tersebut dan token API dengan cara yang sama.COMPOSE_PORT_HTTPdanCOMPOSE_PORT_HTTPSmengubah port publik dari default 9000 dan 9443.AUTHENTIK_EMAIL__HOST,AUTHENTIK_EMAIL__PORT,AUTHENTIK_EMAIL__USERNAME,AUTHENTIK_EMAIL__PASSWORD,AUTHENTIK_EMAIL__USE_TLS, danAUTHENTIK_EMAIL__FROMmengonfigurasi email keluar. Tanpa pengaturan ini, Authentik mencobalocalhostpada port 25, sehingga email pengaturan ulang kata sandi berakhir sebagai error koneksi di log worker.AUTHENTIK_LOG_LEVEL=debugmengaktifkan detail yang Anda perlukan saat alur login bermasalah. Kembalikan keinfosetelah selesai.AUTHENTIK_ERROR_REPORTING__ENABLEDsecara default bernilaifalse. Atur ketruehanya jika Anda bersedia mengirimkan laporan kerusakan ke upstream.
Ini adalah rahasia dalam file teks biasa, jadi perlakukan direktori tersebut sebagaimana Anda memperlakukan penyimpanan kredensial lainnya. Pengelola kata sandi seperti instance Vaultwarden yang di-host sendiri adalah tempat yang lebih baik untuk menyimpan salinan pemulihan daripada catatan di laptop Anda.
Login pertama dan akun admin
Buka http://SERVER_IP:9000 di browser. Authentik menampilkan alur setup awal dan meminta Anda membuat password untuk user default akadmin. Jika Anda sudah menetapkan AUTHENTIK_BOOTSTRAP_PASSWORD, langkah tersebut sudah selesai dan Anda langsung diarahkan ke halaman login.
Buat user admin biasa untuk diri sendiri melalui Directory, lalu Users, tambahkan user tersebut ke group authentik Admins, dan login menggunakan akun itu. Pertahankan akadmin sebagai akun break-glass dengan password panjang yang disimpan secara offline. Jika flow atau stage yang rusak membuat Anda terkunci di luar sistem, docker compose run --rm server create_recovery_key 10 akadmin, yang dijalankan dari /opt/authentik, akan menampilkan link yang langsung login sebagai akadmin. Siapa pun yang memiliki link tersebut mendapatkan akses yang sama, jadi perlakukan link itu seperti password. Pekerjaan sehari-hari dengan akun bawaan yang digunakan bersama akan merusak audit log karena setiap event hanya menyatakan akadmin tanpa menunjukkan siapa pelakunya. Pertimbangan ini juga berlaku setelah Authentik: sesuatu seperti harness OneCLI self-hosted yang menyediakan agent untuk setiap orang hanya menghasilkan jejak yang dapat dibaca jika identity yang diterimanya berasal dari satu manusia, bukan dari login yang digunakan bersama oleh seluruh tim.
Menempatkan Authentik di balik reverse proxy Anda
Mengekspos port 9000 ke internet memang berfungsi, namun Anda memerlukan TLS (transport layer security) dan hostname yang valid. Jika Anda sudah menjalankan konfigurasi dari Traefik sebagai reverse proxy untuk beberapa aplikasi Compose, hubungkan Authentik ke jaringan eksternal proxy yang sama menggunakan file override. Buat docker-compose.override.yml di samping compose.yml:
services:
server:
networks:
- default
- proxy
labels:
traefik.enable: "true"
traefik.docker.network: proxy
traefik.http.routers.authentik.rule: Host(`auth.example.com`)
traefik.http.routers.authentik.entrypoints: websecure
traefik.http.routers.authentik.tls.certresolver: le
traefik.http.services.authentik.loadbalancer.server.port: "9000"
networks:
proxy:
external: trueTerapkan dengan docker compose up -d. Compose akan menggabungkan override tersebut secara otomatis, sehingga layanan server tetap mempertahankan semua konfigurasi dari file resmi dan mendapatkan label tambahan. Periksa dengan curl -I https://auth.example.com/if/user/, yang seharusnya memberikan respons HTTP/2 200. Kode 404 page not found dari Traefik berarti tidak ada router yang cocok dengan permintaan tersebut. Pastikan label telah diterapkan ke container, aturan Host() cocok dengan hostname secara tepat, dan permintaan telah sampai di entry point HTTPS yang dipantau oleh router.
Setelah hostname berfungsi, ikat port yang dipublikasikan ke 127.0.0.1 di dalam file override, sehingga satu-satunya akses masuk adalah melalui proxy.
Lindungi satu aplikasi dengan forward auth
Proxy provider Authentik memiliki tiga mode, dan memilih mode yang salah dapat menghabiskan waktu satu jam. Proxy berarti outpost meneruskan trafik ke aplikasi upstream. Forward auth (single application) berarti reverse proxy Anda sendiri tetap meneruskan trafik dan hanya menanyakan kepada Authentik apakah request tersebut sudah diautentikasi. Forward auth (domain level) melindungi semua aplikasi di bawah satu domain induk dengan satu provider, tetapi aturan otorisasi per aplikasi tidak dapat diterapkan secara terpisah. Jika Traefik berada di depan, gunakan forward auth (single application). Jika Anda membutuhkan aplikasi konkret untuk latihan, workspace AFFiNE self-hosted merupakan kandidat awal yang baik karena aplikasi ini cocok diakses dari perangkat Anda sendiri dan tidak dari tempat lain. Untuk alat yang digunakan tim, kasusnya semakin jelas: letakkan meja bantuan Chatwoot self-hosted di belakang provider yang sama agar setiap orang yang menjawab kotak masuk cukup login sekali untuk hari itu, bukan membagikan satu password tambahan.
Pada antarmuka web, buka Applications lalu Providers, buat Proxy Provider, pilih mode forward auth single application, dan tetapkan host eksternal ke https://app.example.com. Buat Application yang mengarah ke provider tersebut. Kemudian buka Outposts, edit authentik Embedded Outpost, lalu pindahkan aplikasi baru ke daftar selected applications. Outpost hanya merespons aplikasi yang telah ditetapkan kepadanya. Jika langkah terakhir ini dilewati, provider yang sudah dikonfigurasi dengan benar tetap tidak akan mengembalikan respons.
Definisikan middleware satu kali pada container Authentik, lalu referensikan middleware tersebut dari setiap aplikasi yang dilindungi:
traefik.http.middlewares.authentik.forwardauth.address: http://server:9000/outpost.goauthentik.io/auth/traefik
traefik.http.middlewares.authentik.forwardauth.trustForwardHeader: "true"
traefik.http.middlewares.authentik.forwardauth.authResponseHeaders: X-authentik-username,X-authentik-groups,X-authentik-entitlements,X-authentik-email,X-authentik-name,X-authentik-uid,X-authentik-jwt,X-authentik-meta-jwks,X-authentik-meta-outpost,X-authentik-meta-provider,X-authentik-meta-app,X-authentik-meta-versionauthResponseHeaders adalah daftar header yang disalin Traefik dari respons Authentik ke request yang dikirimnya ke upstream. Jika bagian ini dihilangkan, aplikasi tetap terlindungi, tetapi tidak pernah mengetahui identitas pengguna. Akibatnya, fitur yang membaca X-authentik-username untuk login otomatis tetap menganggap pengguna belum login. Perbedaan ini paling terlihat pada aplikasi yang memiliki login sendiri, seperti pelacak latihan openGym self-hosted dan login passkey-nya. Header tersebut menentukan apakah halaman yang sama memerlukan satu prompt atau dua prompt.
Aplikasi yang dilindungi memerlukan dua router, bukan satu:
labels:
traefik.enable: "true"
traefik.http.routers.myapp.rule: Host(`app.example.com`)
traefik.http.routers.myapp.entrypoints: websecure
traefik.http.routers.myapp.tls.certresolver: le
traefik.http.routers.myapp.middlewares: authentik@docker
traefik.http.routers.myapp-auth.rule: Host(`app.example.com`) && PathPrefix(`/outpost.goauthentik.io/`)
traefik.http.routers.myapp-auth.entrypoints: websecure
traefik.http.routers.myapp-auth.tls.certresolver: le
traefik.http.routers.myapp-auth.priority: "15"
traefik.http.routers.myapp-auth.service: authentikRouter kedua adalah bagian yang sering dilupakan. Setelah login, Authentik mengarahkan browser kembali ke path di bawah /outpost.goauthentik.io/ pada hostname aplikasi, bukan pada auth.example.com. Tanpa router yang mengarahkan prefix path tersebut ke service Authentik, request akan masuk ke aplikasi Anda. Aplikasi kemudian mengembalikan 404 dan proses login tidak pernah selesai. Nilai priority yang lebih tinggi membuat aturan path khusus tersebut dipilih sebelum aturan Host() biasa pada domain yang sama.
Uji konfigurasi ini dalam jendela browser privat. Browser seharusnya diarahkan ke auth.example.com, lalu setelah login kembali ke aplikasi. docker compose logs -f server di sisi Authentik menampilkan satu authorization event untuk setiap percobaan. Dengan demikian, Anda dapat mengetahui apakah request benar-benar mencapai Authentik.
Kegagalan yang benar-benar akan Anda temui
Loop pengalihan tanpa akhir antara aplikasi dan halaman login. Host eksternal pada provider tidak cocok dengan yang digunakan browser, biasanya http:// pada provider dibandingkan dengan https:// pada bilah alamat. Cookie sesi kemudian ditetapkan untuk origin yang berbeda, sehingga setiap permintaan kembali terlihat sebagai permintaan anonim baru. Perbaiki host eksternal dan hapus cookie untuk kedua domain sebelum melakukan pengujian ulang.
404 pada /outpost.goauthentik.io/start. Router outpost tidak ada, atau prioritasnya lebih rendah daripada router catch-all untuk host tersebut.
Aplikasi dimuat tanpa pernah meminta login. Label middlewares merujuk ke middleware yang tidak ada. Traefik tidak memberikan peringatan untuk kondisi ini, sehingga kesalahan ketik pada authentik@docker hanya berarti tidak ada middleware yang dijalankan. Buka dashboard Traefik dan pastikan router mencantumkan middleware tersebut.
403 dari Authentik setelah login berhasil. Pengguna sudah terautentikasi, tetapi tidak memiliki otorisasi: aplikasi memiliki binding kebijakan atau persyaratan grup yang tidak dipenuhi oleh pengguna tersebut. Log Events pada antarmuka admin menyebutkan kebijakan yang menolak akses.
Kapan Keycloak menjadi pilihan yang lebih tepat
Keycloak adalah proyek yang lebih lama, didukung oleh Red Hat, dan merupakan pilihan yang lebih kuat untuk pekerjaan identitas perusahaan klasik: federasi SAML yang berat, brokering login dari beberapa penyedia identitas eksternal sekaligus, serta ekspor dan impor realm sebagai jalur migrasi yang terdokumentasi. Dukungan komersial di baliknya dianggap penting bagi sebagian organisasi secara administratif. Konsekuensinya, Keycloak tidak memiliki proxy sendiri, sehingga melindungi aplikasi yang tidak mendukung OIDC (OpenID Connect) maupun SAML berarti harus menjalankan perangkat lunak seperti oauth2-proxy di sampingnya. Penyedia proxy bawaan Authentik adalah komponen tersebut, yang sudah terintegrasi, itulah sebabnya sebagian besar pengguna self-hosting dengan beragam aplikasi memilih solusi ini.
Backup dan upgrade
Tiga hal diperlukan agar restore dapat dilakukan: database PostgreSQL, direktori ./data, dan .env.
cd /opt/authentik
docker compose exec -T postgresql pg_dump -U authentik authentik | gzip > authentik-$(date +%F).sql.gzSimpan dump tersebut bersama .env. Dump tidak menyimpan salinan AUTHENTIK_SECRET_KEY, dan restore menggunakan key yang berbeda akan membatalkan semua sesi aktif. Karena itu, menyimpan key asli membuat server hasil restore dapat melanjutkan operasi seperti sebelumnya.
Upgrade dilakukan dengan mengubah tag. Tetapkan AUTHENTIK_TAG di .env ke release yang diinginkan, lalu jalankan docker compose pull dan kemudian docker compose up -d. Jika Anda tidak pernah menetapkan AUTHENTIK_TAG, versi akan berasal dari nilai default yang ditulis langsung dalam compose.yml. Dengan demikian, mengunduh salinan file yang lebih baru menjadi proses upgrade, dan itulah metode yang dijelaskan dalam dokumentasi upgrade resmi. Baca release notes terlebih dahulu. Authentik menggunakan versi berbasis tanggal. Per October 2026, dokumentasinya menyatakan bahwa upgrade harus mengikuti urutan major release: pindah ke patch terbaru dari seri yang sedang digunakan, lalu lanjutkan ke setiap seri berikutnya secara berurutan tanpa melewati seri mana pun. Authentik tidak mendukung downgrade, jadi buat dump database sebelum pull, bukan sesudahnya.
FAQ
Apakah Authentik gratis untuk di-self-host?
Edisi open source tersedia gratis dan mencakup semua fitur di atas: penyedia proxy, forward auth, OIDC (OpenID Connect), SAML, dan mesin alur (flows engine). Tingkat enterprise berbayar menambahkan dukungan dan beberapa fitur khusus perusahaan, namun tidak ada fitur dalam panduan ini yang memerlukan lisensi.
Apakah saya memerlukan Traefik untuk menggunakan Authentik?
Tidak. Forward auth dapat bekerja dengan nginx melalui auth_request dan dengan Caddy melalui forward_auth. Polanya sama dalam setiap kasus: reverse proxy menanyakan status setiap permintaan kepada Authentik, dan prefix path /outpost.goauthentik.io/ pada hostname yang dilindungi harus diarahkan ke Authentik, bukan ke aplikasi.
Mengapa aplikasi saya yang dilindungi terus-menerus berpindah antara halaman login dan error?
Host eksternal yang dikonfigurasi pada penyedia proxy tidak cocok dengan URL yang digunakan browser, biasanya terjadi karena http dibandingkan dengan https. Cookie sesi diterbitkan untuk satu origin dan dibaca di origin lain, sehingga Authentik selalu melihat permintaan sebagai anonim. Perbaiki host eksternal, lalu hapus cookie untuk kedua hostname sebelum melakukan pengujian kembali.
Berapa banyak RAM yang dibutuhkan Authentik?
Minimum yang didokumentasikan adalah 2 core CPU dan 2 GB RAM per Oktober 2026, yang mencakup PostgreSQL, server, dan worker secara bersamaan. Pada mesin dengan 2 GB, tekanan memori dapat memicu OOM killer kernel, yang akan menghentikan proses dengan skor badness tertinggi: kira-kira proporsi memori yang digunakan ditambah dengan oom_score_adj miliknya. Jika proses yang dihentikan adalah worker, gejalanya adalah tugas latar belakang dan email keluar berhenti berfungsi sementara halaman login tetap berjalan. Sediakan 4 GB jika server yang sama juga menjalankan aplikasi yang Anda lindungi.