Belajar Authentik - Installing Authentik
Episode 3 of 31

Belajar Authentik - Installing Authentik

Memasang Authentik dengan Docker Compose: menyusun stack server, worker, PostgreSQL, Redis, dan proxy, mengelola secret dan variabel lingkungan lewat file .env, bootstrap admin akadmin, memverifikasi UI pertama, hingga jalur upgrade yang aman.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

Setelah di episode 2 kita memahami arsitektur — server, worker, PostgreSQL, Redis, dan outposts — pada episode kali ini kita akan menyalakannya untuk pertama kali. Tujuan akhir episode ini sederhana: Authentik berjalan, dan kalian bisa login ke admin interface sebagai akadmin.

Kita akan memakai metode yang paling direkomendasikan: Docker Compose. Ini pola yang dipakai dokumentasi resmi, paling mudah dikelola, dan menjadi fondasi seluruh episode berikutnya.

Metode Instalasi

Sebelum menyentuh keyboard, kenali tiga jalur instalasi:

  • Docker Compose (rekomendasi) — menyusun seluruh komponen sebagai kontainer dalam satu file. Cocok untuk homelab, VPS, dan produksi skala kecil-menengah. Inilah yang kita pakai di episode ini.
  • Kubernetes (Helm chart) — untuk platform yang sudah berjalan di Kubernetes. Episode 24 membahasnya.
  • Binary / manual — menjalankan Authentik langsung di host tanpa kontainer. Hanya untuk kasus lanjutan; kita tidak membahasnya secara mendalam di series ini.

Struktur Proyek dan docker-compose.yml

Buat direktori proyek, lalu siapkan file docker-compose.yml. Dokumentasi resmi bahkan menyediakan file siap pakai yang bisa diunduh:

Buat direktori dan unduh compose resmi (opsional)
mkdir authentik && cd authentik
curl -O https://docs.goauthentik.io/compose.yml

Berikut versi yang kita bahas, mencakup lima service: postgresql, redis, server, worker, dan proxy. Catatan: quickstart resmi terbaru menjalankan proxy outpost secara embedded di dalam server; service proxy di bawah adalah opsi standalone untuk outpost — berguna saat kalian ingin outpost berjalan sebagai kontainer terpisah (dibahas di fase 4).

docker-compose.yml — stack Authentik
services:
  postgresql:
    image: docker.io/library/postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${PG_PASS:?database password required}
      POSTGRES_USER: ${PG_USER:-authentik}
      POSTGRES_DB: ${PG_DB:-authentik}
    volumes:
      - database:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -d ${PG_DB} -U ${PG_USER}"]
      start_period: 20s
      interval: 30s
      retries: 5
 
  redis:
    image: docker.io/library/redis:alpine
    restart: unless-stopped
    command: --save 60 1 --loglevel warning
    volumes:
      - redis:/data
 
  server:
    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.2.6}
    command: server
    restart: unless-stopped
    environment:
      AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
      AUTHENTIK_REDIS__HOST: redis
      AUTHENTIK_POSTGRESQL__HOST: postgresql
      AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
      AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
      AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS:?database password required}
    ports:
      - "${COMPOSE_PORT_HTTP:-9000}:9000"
      - "${COMPOSE_PORT_HTTPS:-9443}:9443"
    volumes:
      - ./media:/media
      - ./custom-templates:/templates
    depends_on:
      postgresql:
        condition: service_healthy
      redis:
        condition: service_healthy
 
  worker:
    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2026.2.6}
    command: worker
    restart: unless-stopped
    environment:
      AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
      AUTHENTIK_REDIS__HOST: redis
      AUTHENTIK_POSTGRESQL__HOST: postgresql
      AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
      AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
      AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS:?database password required}
    volumes:
      - ./media:/media
      - ./certs:/certs
    depends_on:
      postgresql:
        condition: service_healthy
      redis:
        condition: service_healthy
 
  proxy:
    image: ghcr.io/goauthentik/proxy:${AUTHENTIK_TAG:-2026.2.6}
    restart: unless-stopped
    environment:
      AUTHENTIK_HOST: http://server:9000
      AUTHENTIK_TOKEN: ${AUTHENTIK_BOOTSTRAP_TOKEN}
    depends_on:
      - server
 
volumes:
  database:
  redis:

Poin penting dari file ini:

  • Server dan worker memakai image yang sama (ghcr.io/goauthentik/server), dibedakan hanya oleh command: server atau command: worker.
  • PostgreSQL menyimpan semua data persisten; healthcheck memastikan server hanya naik setelah database siap.
  • Redis menyimpan cache dan message queue; nilainya boleh hilang, PostgreSQL tidak.
  • Port 9000 (HTTP) dan 9443 (HTTPS) dipetakan ke host; di belakang reverse proxy, keduanya tidak perlu diekspos ke publik.
  • Secret tidak pernah ditulis langsung di file ini — semua diambil dari .env via interpolasi.

File .env untuk Secret

Jangan pernah menaruh secret langsung di docker-compose.yml. Simpan di .env, pastikan ia masuk .gitignore, dan jangan commit. Siapkan isinya:

.env — jangan pernah di-commit
PG_PASS=<postgres-password-acak>
PG_USER=authentik
PG_DB=authentik
AUTHENTIK_SECRET_KEY=<secret-acak>
AUTHENTIK_BOOTSTRAP_PASSWORD=<password-admin-kuat>
AUTHENTIK_BOOTSTRAP_EMAIL=admin@example.com
AUTHENTIK_BOOTSTRAP_TOKEN=<token-outpost-acak>
AUTHENTIK_ERROR_REPORTING=false
AUTHENTIK_LOG_LEVEL=info

Makna tiap variabel penting:

  • AUTHENTIK_SECRET_KEY — kunci yang menandatangani data sensitif; harus acak dan panjang. Menggantinya setelah instalasi akan menginvalidasi session yang ada.
  • AUTHENTIK_BOOTSTRAP_PASSWORD dan AUTHENTIK_BOOTSTRAP_EMAIL — dipakai untuk membuat admin pertama bernama akadmin.
  • AUTHENTIK_BOOTSTRAP_TOKEN — token yang dipakai outposts untuk berkomunikasi dengan API.
  • AUTHENTIK_ERROR_REPORTING — matikan (false) untuk privasi; kalau dibiarkan true, error dikirim ke tim Authentik.
  • AUTHENTIK_LOG_LEVELinfo untuk sehari-hari; naikkan ke debug saat troubleshooting.

Generate nilai acak dengan OpenSSL:

Generate secret acak dengan OpenSSL
openssl rand -base64 60 | tr -d '\n'
openssl rand -base64 36 | tr -d '\n'

Warning

Jika AUTHENTIK_SECRET_KEY atau PG_PASS tidak terisi, server menolak start — ini proteksi bawaan, bukan bug. Selalu gunakan secret acak, simpan di tempat aman, dan tambahkan .env ke .gitignore sejak awal.

Menjalankan Stack dan Memverifikasi

Jalankan image dan buat kontainer:

docker compose pull
docker compose up -d
docker compose ps

Tunggu sampai kontainer server siap, lalu buka browser di http://localhost:9000 (atau port yang kalian petakan). Jika semuanya benar, kalian akan melihat halaman login Authentik.

Bootstrap Admin dan Web UI

Pada start pertama, server otomatis membuat: default tenant, built-in flows (authentication, enrollment, recovery, invalidation), grup bawaan authentik Admins dan authentik Users, serta user admin akadmin — lengkap dengan password dari AUTHENTIK_BOOTSTRAP_PASSWORD.

Login ke admin interface dengan akadmin, lalu kalian akan dibawa ke dashboard. Jika karena suatu hal bootstrap tidak berjalan, kalian bisa membuat superuser secara manual:

Membuat superuser manual
docker compose exec server ak manage createsuperuser

Tip

Setelah login pertama, segera ganti password akadmin lewat profil kalian, dan jika memungkinkan daftarkan perangkat MFA. Admin identity provider adalah target paling berharga — perlakukan seserius itu. MFA akan kita bahas di episode 7.

Konfigurasi Pasca-Instalasi

Sebelum dipakai produksi, lengkapi beberapa hal:

  • Ganti password defaultakadmin dari bootstrap bukan untuk pemakaian jangka panjang.
  • Konfigurasi email (SMTP) — lewat admin interface → System → Global Email; wajib untuk recovery flow dan email stage.
  • Domain dan TLS — arahkan auth.example.com ke server, letakkan Authentik di belakang reverse proxy, dan terminasi TLS di proxy. Jangan mengekspos port 9000/9443 langsung ke internet tanpa TLS.
  • Backup — minimal jadwalkan backup PostgreSQL (pg_dump). Episode 26 akan membahas strategi backup menyeluruh.

Jalur Upgrade

Upgrade Authentik dilakukan lewat Compose: unduh compose.yml terbaru, tarik image baru, lalu nyalakan ulang stack:

Alur upgrade Authentik
docker compose pull
docker compose up -d

Migrasi database berjalan otomatis saat server mulai. Tapi sebelum upgrade: baca release notes, dan pastikan backup database terbaru ada — migrasi jarang berbalik arah.

Penutup

Pada episode 3 ini kalian telah memasang Authentik dengan Docker Compose: lima service — postgresql, redis, server, worker, dan proxy — dikelola lewat satu file, secret dipisahkan di .env dengan variabel seperti AUTHENTIK_SECRET_KEY, AUTHENTIK_BOOTSTRAP_PASSWORD, dan AUTHENTIK_BOOTSTRAP_TOKEN, lalu stack diverifikasi dan admin pertama akadmin berhasil login.

Poin yang harus kalian bawa:

  • Server dan worker berbagi image; perbedaan hanya di command.
  • PostgreSQL tidak boleh hilang; Redis boleh dibangun ulang.
  • Secret hidup di .env, bukan di file compose, dan tidak pernah di-commit.
  • Bootstrap membuat akadmin dan built-in flows; ganti passwordnya segera.
  • Upgrade = pull + up, tapi selalu backup dulu.

Di episode 4 selanjutnya kita akan membedah konsep yang paling membedakan Authentik: flows & stages — bagaimana alur autentikasi dibangun dari blok-blok stage, menganalisis built-in flows, membuat custom flow, dan men-debug dengan flow inspector. Sampai jumpa di episode 4!