Authentik: SSO Self-Hosted untuk Aplikasi Anda
Pelajari cara menjalankan Authentik 2026.5 dengan Docker Compose, mengatur secret dan akadmin, serta memakai forward auth Traefik untuk satu login.
Satu login untuk setiap aplikasi yang Anda host
Authentik adalah server SSO (single sign-on) yang di-host sendiri. Pengguna Anda cukup login sekali, 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 dilakukan setelahnya: mengarahkan reverse proxy ke sana dan menempatkan satu aplikasi yang sudah ada di balik forward auth.
Authentik terdiri atas tiga layanan dalam file Compose tersebut: database PostgreSQL, proses server, dan proses worker. Container server juga menjalankan outpost tertanam, yaitu komponen yang menjawab pertanyaan "apakah permintaan ini sudah login?" untuk setiap aplikasi yang dilindungi. Versi 2026.5 adalah rilis saat ini per Juli 2026, dan proyek tersebut meminta host dengan setidaknya 2 core CPU dan 2 GB RAM. Anggap ini sebagai batas minimum. PostgreSQL dan worker sama-sama menggunakan memori setelah server berjalan selama satu hari.
Hal yang diperlukan 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 sebelum melanjutkan. Dasar-dasarnya dibahas dalam menjalankan aplikasi dengan Docker Compose di VPS. Anda juga memerlukan data A DNS 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 dalam grup docker, bukan sebagai root. Keanggotaan grup tersebut setara dengan root pada host. Karena itu, berikan keanggotaan tersebut hanya kepada satu akun deployment dan tidak kepada pengguna lain, seperti dijelaskan dalam 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 harus mencantumkan tiga container, dengan postgresql melaporkan healthy dan server melaporkan worker serta running. Saat pertama kali dijalankan, proses ini melakukan migrasi database. Tunggu sekitar satu menit sebelum antarmuka web merespons.
Kedua nilai yang dibuat itu penting karena alasan yang berbeda. PG_PASS adalah kata sandi PostgreSQL dan memiliki batas maksimum 99 karakter. AUTHENTIK_SECRET_KEY menandatangani sesi dan token. Jika nilainya diubah kemudian, semua pengguna akan keluar dan semua token API yang telah diterbitkan menjadi tidak valid. Pertahankan .env pada mode 600 dan simpan salinannya di tempat yang aman. Database yang dipulihkan tanpa kunci rahasia pasangannya tidak dapat digunakan untuk login.
File Compose membaca kedua nilai tersebut menggunakan bentuk ${PG_PASS:?database password required}. Artinya, Compose menolak memulai jika file tersebut tidak ada. Menjalankan docker compose up -d dari direktori yang salah 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 garis bawah ganda ke kunci konfigurasi bertingkat, sehingga AUTHENTIK_EMAIL__HOST menetapkan email.host. Garis bawah tunggal diabaikan tanpa peringatan. Ini adalah alasan paling umum pengaturan tampak tidak berfungsi.
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 dan 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. Akibatnya, email pengaturan ulang kata sandi berakhir sebagai kesalahan koneksi dalam log worker.AUTHENTIK_LOG_LEVEL=debugmengaktifkan detail yang Anda perlukan saat alur login tidak berfungsi dengan benar. Kembalikan keinfosetelahnya.- Secara default,
AUTHENTIK_ERROR_REPORTING__ENABLEDbernilaifalse. Tetapkan ketruehanya jika Anda bersedia mengirim laporan kerusakan ke upstream.
Nilai-nilai ini adalah rahasia yang disimpan dalam file biasa. Perlakukan direktori tersebut seperti penyimpanan kredensial lainnya. Pengelola kata sandi seperti instance Vaultwarden yang di-hosting sendiri merupakan tempat yang lebih aman 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 diarahkan ke halaman login.
Buat pengguna admin biasa untuk diri Anda di Directory, lalu Users, tambahkan pengguna tersebut ke grup authentik Admins, dan login menggunakan akun itu. Biarkan akadmin sebagai akun break-glass dengan kata sandi panjang yang disimpan secara offline. Penggunaan sehari-hari atas akun bawaan bersama merusak log audit karena setiap peristiwa mencantumkan akadmin dan tidak mencantumkan identitas pelakunya.
Tempatkan Authentik di belakang reverse proxy
Mempublikasikan port 9000 ke internet dapat dilakukan, tetapi Anda memerlukan TLS (transport layer security) dan nama host 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 otomatis menggabungkan file override, sehingga layanan server tetap menggunakan 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. 404 page not found dari Traefik berarti container tidak berada di jaringan proxy, dan Traefik tidak dapat merutekan ke container yang tidak dapat dijangkaunya.
Setelah nama host 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 menghabiskan waktu satu jam. Proxy berarti outpost itu sendiri meneruskan traffic ke aplikasi upstream. Forward auth (single application) berarti reverse proxy Anda sendiri tetap meneruskan traffic dan hanya menanyakan kepada Authentik apakah request tersebut berasal dari pengguna yang sudah login. Forward auth (domain level) melindungi setiap aplikasi di bawah satu domain induk dengan satu provider, tetapi aturan otorisasi per aplikasi tidak dapat dibuat. Jika Traefik berada di depan, gunakan forward auth (single application).
Di antarmuka web, buka Applications lalu Providers, buat Proxy Provider, pilih mode forward auth single application, dan atur external host ke https://app.example.com. Buat Application yang mengarah ke provider tersebut. Kemudian buka Outposts, edit authentik Embedded Outpost, lalu pindahkan aplikasi baru ke selected applications. Outpost hanya merespons aplikasi yang telah ditambahkan kepadanya. Karena itu, jika langkah terakhir dilewati, provider yang dikonfigurasi dengan benar tetap tidak akan memberikan 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 logged out.
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 terlewat. Setelah login, Authentik mengarahkan browser kembali ke path di bawah /outpost.goauthentik.io/ pada hostname aplikasi, bukan pada auth.example.com. Tanpa router yang mengirim prefix path tersebut ke service Authentik, request akan masuk ke aplikasi Anda. Aplikasi akan mengembalikan 404, sehingga proses login tidak pernah selesai. Nilai priority yang lebih tinggi membuat aturan path khusus mengungguli aturan Host() biasa pada domain yang sama.
Uji konfigurasi tersebut di jendela browser privat. Anda seharusnya diarahkan ke auth.example.com, melakukan login, lalu kembali ke aplikasi. docker compose logs -f server di sisi Authentik mencetak event otorisasi untuk setiap percobaan. Dengan demikian, Anda dapat mengetahui apakah request benar-benar mencapai Authentik.
Kegagalan yang sebenarnya akan Anda temui
Loop pengalihan tanpa akhir antara aplikasi dan halaman login. Host eksternal pada provider tidak cocok dengan host yang digunakan browser, biasanya http:// pada provider berbeda dengan https:// di 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 menguji 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 pengetikan pada authentik@docker hanya menyebabkan 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 memiliki otorisasi. Aplikasi memiliki pengikatan kebijakan atau persyaratan grup yang tidak dipenuhi pengguna ini. Log Events di antarmuka admin menyebutkan kebijakan yang menolak permintaan tersebut.
Saat Keycloak lebih sesuai
Keycloak adalah proyek yang lebih lama dan didukung oleh Red Hat. Keycloak lebih cocok untuk kebutuhan identitas perusahaan klasik, seperti federasi SAML yang ekstensif, meneruskan proses login dari beberapa penyedia identitas eksternal secara bersamaan, serta mengekspor dan mengimpor realm sebagai jalur migrasi yang terdokumentasi. Bagi sebagian organisasi, dukungan komersial di baliknya juga penting secara formal. Kekurangannya, Keycloak tidak memiliki proxy bawaan. Karena itu, untuk melindungi aplikasi yang tidak menggunakan OIDC (OpenID Connect), Anda perlu menjalankan komponen seperti oauth2-proxy di sampingnya. Authentik sudah memiliki proxy provider bawaan yang terintegrasi. Inilah alasan sebagian besar pengguna yang mengelola sendiri berbagai aplikasi memilih Authentik.
Pencadangan dan peningkatan versi
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.
Peningkatan versi 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 peningkatan dari rilis sebelumnya. Buat dump database sebelum pull, bukan setelahnya.
FAQ
Apakah Authentik gratis untuk di-hosting sendiri?
Edisi open source gratis dan mencakup semua hal di atas: penyedia proxy, forward auth, OIDC (OpenID Connect), SAML, dan mesin alur. Tingkat enterprise berbayar menambahkan dukungan dan beberapa fitur enterprise, tetapi tidak ada bagian di sini yang memerlukan lisensi.
Apakah saya memerlukan Traefik untuk menggunakan Authentik?
Tidak. Forward auth berfungsi dengan nginx melalui auth_request dan dengan Caddy melalui forward_auth. Polanya sama dalam setiap kasus: reverse proxy meminta Authentik memeriksa setiap permintaan, dan awalan jalur /outpost.goauthentik.io/ pada hostname yang dilindungi harus diarahkan ke Authentik, bukan ke aplikasi.
Mengapa aplikasi yang dilindungi terus-menerus beralih antara login dan galat?
Host eksternal yang dikonfigurasi pada penyedia proxy 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 menganggap setiap permintaan sebagai 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 inti CPU dan 2 GB RAM per July 2026, untuk 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, sementara halaman login masih berfungsi. Berikan 4 GB jika server yang sama juga menjalankan aplikasi yang Anda lindungi.