Authentik: SSO self-hosted untuk semua aplikasi
Pelajari cara menjalankan Authentik di Docker Compose, mengisi env penting, membuat bootstrap akadmin, dan memakai forward auth Traefik untuk satu sesi login.
Satu login untuk semua aplikasi yang Anda host
Authentik adalah server SSO (single sign-on) yang di-host sendiri. Pengguna cukup login satu kali, lalu setiap aplikasi di belakangnya menerima sesi tersebut tanpa meminta kata sandi sendiri. Instalasinya menggunakan file Docker Compose resmi dan dua secret yang dibuat secara otomatis. Bagian yang memerlukan pertimbangan lebih lanjut adalah konfigurasi reverse proxy yang mengarah ke Authentik dan menempatkan satu aplikasi yang sudah ada di balik forward auth.
Authentik berjalan sebagai tiga service dalam file Compose tersebut: database PostgreSQL, proses server, dan proses worker. Container server juga menjalankan outpost bawaan. Komponen ini menjawab pertanyaan "apakah permintaan ini sudah login?" untuk setiap aplikasi yang dilindungi. Versi 2026.5 adalah rilis terbaru per Juli 2026. Proyek ini merekomendasikan host dengan setidaknya 2 core CPU dan 2 GB RAM. Anggap spesifikasi tersebut sebagai batas minimum. PostgreSQL dan worker akan tetap menggunakan memori setelah server berjalan selama satu hari.
Yang perlu disiapkan sebelum memulai
Anda memerlukan Docker Engine dengan plugin Compose v2. Pastikan dengan menjalankan docker compose version. Jika perintah tersebut menampilkan error, bukan nomor versi, instal plugin itu sebelum melanjutkan. Dasar-dasarnya dibahas dalam menjalankan aplikasi dengan Docker Compose pada VPS. Anda juga memerlukan DNS A record 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 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 akses minimum pada 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 harus menampilkan tiga container, dengan postgresql melaporkan healthy dan server melaporkan worker dan running. Saat pertama kali dijalankan, proses migrasi database akan berlangsung. Tunggu sekitar satu menit sebelum antarmuka web merespons.
Kedua nilai yang dibuat tersebut penting karena alasan yang berbeda. PG_PASS adalah password PostgreSQL dan memiliki batas maksimum 99 karakter. AUTHENTIK_SECRET_KEY digunakan untuk menandatangani session dan token. Jika nilainya diubah nanti, semua user akan logout dan semua API token yang telah diterbitkan menjadi tidak valid. Pertahankan .env dengan mode 600 dan simpan salinannya di lokasi yang aman. Database yang dipulihkan tanpa secret key yang sesuai tidak dapat digunakan untuk login.
File Compose membaca kedua nilai tersebut dalam format ${PG_PASS:?database password required}. Karena itu, Compose tidak akan start jika file tersebut tidak ada. Menjalankan docker compose up -d dari direktori yang salah akan menampilkan required variable AUTHENTIK_SECRET_KEY is missing a value: secret key required lalu berhenti. Pesan tersebut menunjukkan masalah path, bukan masalah konfigurasi.
Nilai lingkungan yang penting
Semua nilai lainnya dimasukkan ke file .env yang sama. Authentik memetakan dua garis bawah menjadi kunci konfigurasi bertingkat, sehingga AUTHENTIK_EMAIL__HOST menetapkan email.host. Satu garis bawah diabaikan tanpa peringatan. Ini adalah alasan paling umum mengapa suatu pengaturan tampaknya tidak berpengaruh.
AUTHENTIK_BOOTSTRAP_PASSWORDmenetapkan kata sandi pengguna bawaanakadminsaat pertama kali dijalankan, sehingga Anda tidak perlu mengetikkannya ke formulir web publik.AUTHENTIK_BOOTSTRAP_EMAILdanAUTHENTIK_BOOTSTRAP_TOKENmenetapkan alamat pengguna tersebut serta token API dengan cara yang sama.COMPOSE_PORT_HTTPdanCOMPOSE_PORT_HTTPSmemindahkan port yang dipublikasikan dari nilai 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 nilai tersebut, Authentik mencobalocalhostpada port 25, sehingga email pengaturan ulang kata sandi berakhir sebagai error koneksi di log worker.AUTHENTIK_LOG_LEVEL=debugmengaktifkan detail yang diperlukan saat login flow bermasalah. Kembalikan nilainya keinfosetelah selesai.AUTHENTIK_ERROR_REPORTING__ENABLEDsecara default bernilaifalse. Tetapkan ketruehanya jika Anda bersedia mengirim laporan crash ke upstream.
Nilai-nilai ini adalah secret dalam file teks biasa. Perlakukan direktori tersebut seperti penyimpanan kredensial lainnya. Password manager seperti instance Vaultwarden yang di-host sendiri lebih tepat untuk menyimpan salinan pemulihan daripada catatan di laptop Anda.
Login pertama dan akun admin
Buka http://SERVER_IP:9000 di browser. Authentik menampilkan alur penyiapan awal dan meminta Anda menetapkan kata sandi untuk pengguna default akadmin. Jika Anda sudah menetapkan AUTHENTIK_BOOTSTRAP_PASSWORD, langkah tersebut telah selesai dan Anda langsung menuju halaman login.
Buat pengguna admin biasa untuk Anda sendiri melalui Directory, lalu Users, tambahkan pengguna tersebut ke grup authentik Admins, dan masuk sebagai akun itu. Biarkan akadmin sebagai akun pemulihan darurat dengan kata sandi panjang yang disimpan secara offline. Pekerjaan sehari-hari menggunakan akun bawaan bersama merusak audit log, karena setiap event hanya menunjukkan akadmin dan tidak menunjukkan siapa yang melakukannya. Argumen ini juga berlaku setelah Authentik: sesuatu seperti harness OneCLI self-hosted yang memberi setiap orang agennya sendiri hanya menghasilkan jejak yang dapat dibaca jika identitas yang tiba di sana berasal dari satu orang, bukan dari login yang digunakan bersama oleh seluruh tim.
Letakkan Authentik di belakang reverse proxy
Mempublikasikan port 9000 ke Internet memang berfungsi, tetapi Anda memerlukan TLS (keamanan lapisan transport) dan hostname yang sebenarnya. Jika Anda sudah menjalankan konfigurasi dari Traefik sebagai reverse proxy untuk beberapa aplikasi Compose, gabungkan Authentik ke jaringan eksternal proxy yang sama menggunakan file override. Buat docker-compose.override.yml di sebelah 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 menggabungkan override secara otomatis, sehingga service server tetap mempertahankan semua konfigurasi dari file resmi dan memperoleh label tersebut. Periksa dengan curl -I https://auth.example.com/if/user/, yang seharusnya memberikan respons HTTP/2 200. Respons 404 page not found dari Traefik berarti container tidak berada di jaringan proxy, sehingga Traefik tidak dapat merutekan ke container yang tidak dapat dijangkaunya.
Setelah hostname berfungsi, ikat port yang dipublikasikan ke 127.0.0.1 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 membuang waktu hingga satu jam. Proxy berarti outpost itu sendiri meneruskan trafik ke aplikasi upstream. Forward auth (single application) berarti reverse proxy Anda tetap meneruskan trafik dan hanya meminta Authentik memeriksa apakah permintaan tersebut berasal dari pengguna yang sudah sign-in. Forward auth (domain level) melindungi setiap aplikasi di bawah satu domain induk dengan satu provider, tetapi aturan otorisasi per aplikasi tidak dapat diterapkan. Jika menggunakan Traefik di depan, pilih forward auth (single application). Jika memerlukan aplikasi konkret untuk latihan, workspace AFFiNE yang di-self-host merupakan kandidat awal yang baik karena jenis tool internal ini seharusnya dapat diakses dari perangkat Anda sendiri dan dari tempat lain tidak. Untuk tool tim, manfaatnya lebih jelas: tempatkan help desk Chatwoot yang di-self-host di belakang provider yang sama agar setiap orang yang menangani inbox cukup sign-in sekali untuk hari itu, tanpa harus berbagi 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 menunjuk ke provider tersebut. Kemudian buka Outposts, edit authentik Embedded Outpost, dan masukkan aplikasi baru ke dalam selected applications. Outpost hanya merespons aplikasi yang telah diberikan kepadanya. Jika langkah terakhir dilewati, provider yang sudah dikonfigurasi dengan benar tetap tidak akan menghasilkan 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-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, apa pun yang membaca X-authentik-username untuk login otomatis akan tetap berstatus logout.
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 dilewatkan. 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 sampai ke aplikasi Anda. Aplikasi kemudian mengembalikan 404 dan proses login tidak pernah selesai. Nilai priority yang lebih tinggi membuat aturan path khusus tersebut dipilih daripada aturan Host() biasa pada domain yang sama.
Uji konfigurasi ini dalam jendela browser privat. Anda akan diarahkan ke auth.example.com, lalu login dan kembali ke aplikasi. docker compose logs -f server pada sisi Authentik mencetak 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 redirect tanpa akhir antara aplikasi dan halaman login. Host eksternal pada provider tidak sama 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 dianggap 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 pada middleware yang tidak ada. Traefik tidak memberikan peringatan untuk kondisi ini, sehingga kesalahan ketik pada authentik@docker berarti tidak ada middleware yang dijalankan. Buka dashboard Traefik dan pastikan router mencantumkan middleware tersebut.
403 dari Authentik setelah login berhasil. Pengguna telah diautentikasi, tetapi tidak diizinkan: 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 lebih sesuai
Keycloak adalah proyek yang lebih lama dan didukung oleh Red Hat. Keycloak lebih cocok untuk kebutuhan identitas perusahaan klasik: federasi SAML yang kompleks, penerusan login dari beberapa penyedia identitas eksternal secara bersamaan, serta ekspor dan impor realm sebagai jalur migrasi yang terdokumentasi. Dukungan komersial di baliknya juga menjadi pertimbangan bagi sebagian organisasi. Konsekuensinya, Keycloak tidak memiliki proxy bawaan. Untuk melindungi aplikasi yang tidak mendukung OIDC (OpenID Connect), Anda perlu menjalankan komponen seperti oauth2-proxy di sampingnya. Proxy provider bawaan Authentik sudah terintegrasi untuk kebutuhan tersebut. Karena itu, sebagian besar pengguna yang mengelola sendiri berbagai aplikasi memilih Authentik.
Cadangan dan upgrade
Tiga hal memungkinkan pemulihan: 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 saja tidak cukup karena kunci rahasia yang melindungi data sesi dan token berada di .env.
Upgrade dilakukan dengan mengubah tag. Atur AUTHENTIK_TAG di .env ke rilis yang diinginkan, lalu jalankan docker compose pull diikuti docker compose up -d. Baca catatan rilis terlebih dahulu karena Authentik menggunakan versi berbasis tanggal, dan beberapa rilis menyertakan migrasi yang mengharuskan Anda melakukan upgrade dari rilis sebelumnya. Buat dump database sebelum melakukan pull, bukan setelahnya.
FAQ
Apakah Authentik gratis untuk di-self-host?
Edisi open source gratis dan mencakup semua hal di atas: proxy provider, forward auth, OIDC (OpenID Connect), SAML, dan flows engine. Tingkat enterprise berbayar menambahkan dukungan dan beberapa fitur enterprise, tetapi semua yang dijelaskan di sini tidak memerlukan lisensi.
Apakah saya memerlukan Traefik untuk menggunakan Authentik?
Tidak. Forward auth dapat digunakan dengan nginx melalui auth_request dan dengan Caddy melalui forward_auth. Polanya sama dalam setiap kasus: reverse proxy meminta informasi dari Authentik untuk setiap permintaan, dan awalan path /outpost.goauthentik.io/ pada hostname yang dilindungi harus diarahkan ke Authentik, bukan ke aplikasi.
Mengapa aplikasi yang dilindungi terus-menerus berpindah antara halaman login dan error?
Host eksternal yang dikonfigurasi pada proxy provider tidak cocok dengan URL yang digunakan browser, paling sering http dibandingkan dengan https. Cookie sesi diterbitkan untuk satu origin dan dibaca pada origin lain, sehingga Authentik selalu melihat permintaan anonim. Perbaiki host eksternal, lalu hapus cookie untuk kedua hostname sebelum menguji lagi.
Berapa banyak RAM yang diperlukan Authentik?
Minimum yang didokumentasikan adalah 2 core CPU dan 2 GB RAM per July 2026. Nilai ini mencakup PostgreSQL, server, dan worker secara keseluruhan. Pada mesin dengan RAM 2 GB, worker adalah proses pertama yang dihentikan kernel saat terjadi tekanan memori. Gejalanya adalah tugas latar belakang dan email keluar berhenti, sedangkan halaman login masih berfungsi. Gunakan RAM 4 GB jika server yang sama juga menjalankan aplikasi yang Anda lindungi.