Memasang Authelia dengan Docker Compose: menyusun stack Authelia, Redis, dan database, membuat konfigurasi minimal, mengelola secret lewat file .env, lalu menjalankan dan memverifikasi portal Authelia di port 9091.

Setelah di episode 2 kita memahami arsitektur — server Authelia, Redis untuk session, database untuk storage, dan proxy sebagai pintu — pada episode kali ini kita mulai beraksi: memasang Authelia. Kita akan memakai Docker Compose sebagai metode utama karena ia merangkum seluruh komponen (Authelia, Redis, database) dalam satu file deklaratif — persis pola yang paling banyak dipakai di dunia homelab dan production. Di akhir episode ini kalian akan memiliki stack yang berjalan, konfigurasi minimal, secret yang terkelola lewat .env, dan portal Authelia yang bisa diakses di browser.
Authelia fleksibel. Pilihan utama:
Buat folder lab dan struktur file standar — konvensi ini akan kita pakai di seluruh series: config/configuration.yml akan di-mount ke dalam kontainer, dan .env berisi secret yang direferensikan oleh docker-compose.yml:
mkdir -p ~/authelia-lab/config
cd ~/authelia-lab
touch docker-compose.yml .env config/configuration.ymlIni file inti kita. Perhatikan bahwa nilai secret memakai placeholder yang diisi dari file .env:
services:
authelia:
image: authelia/authelia:latest
container_name: authelia
restart: unless-stopped
environment:
AUTHELIA_JWT_SECRET: ${AUTHELIA_JWT_SECRET}
AUTHELIA_SESSION_SECRET: ${AUTHELIA_SESSION_SECRET}
AUTHELIA_STORAGE_ENCRYPTION_KEY: ${AUTHELIA_STORAGE_ENCRYPTION_KEY}
AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET: ${AUTHELIA_RESET_PASSWORD_JWT_SECRET}
AUTHELIA_SESSION_REDIS_PASSWORD: ${REDIS_PASSWORD}
volumes:
- ./config:/config
ports:
- "9091:9091"
depends_on:
- redis
networks:
- authelia_net
redis:
image: redis:7-alpine
container_name: authelia-redis
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data
networks:
- authelia_net
volumes:
redis_data:
networks:
authelia_net:
driver: bridgePoin penting dari file ini:
authelia/authelia di-mount ke ./config — konfigurasi hidup di host, kontainer hanya membaca.9091 dipetakan ke host; port ini akan dipakai portal dan endpoint verifikasi.AUTHELIA_ — mekanisme override konfigurasi yang akan kita bahas di episode 4.depends_on memastikan Redis mulai lebih dulu.Jangan pernah menaruh secret langsung di docker-compose.yml — simpan di .env, pastikan ia masuk .gitignore, dan jangan commit. Authelia mewajibkan secret yang cukup panjang (minimal 16 byte untuk JWT/session secret, 20 byte untuk storage encryption key), jadi generate nilai acak dengan OpenSSL:
AUTHELIA_JWT_SECRET=generate-16-byte-random
AUTHELIA_SESSION_SECRET=generate-16-byte-random
AUTHELIA_STORAGE_ENCRYPTION_KEY=generate-16-byte-random
AUTHELIA_RESET_PASSWORD_JWT_SECRET=generate-16-byte-random
REDIS_PASSWORD=generate-32-char-passwordopenssl rand -hex 32Warning
Authelia menolak start jika secret yang dibutuhkan tidak ada atau terlalu pendek — ini proteksi bawaan yang bagus, bukan bug. Selalu gunakan secret acak yang panjang, simpan di tempat aman, dan jangan pernah menaruhnya di file yang ter-commit.
Authelia tidak bisa start tanpa configuration.yml. Versi minimal berikut cukup untuk episode ini — belum ada access control dan user (akan kita bangun di episode 4 dan 5), tapi portal akan hidup:
host: 0.0.0.0
port: 9091
theme: auto
jwt_secret: not-used-with-env
default_redirection_url: https://auth.example.com
access_control:
default_policy: deny
rules: []
session:
name: authelia_session
domain: example.com
expiration: 1h
inactivity: 5m
remember_me_duration: 1M
redis:
host: redis
port: 6379
password: ${REDIS_PASSWORD}
storage:
local:
path: /config/db.sqlite3
notifier:
filesystem:
filename: /config/notifications.txt
authentication_backend:
file:
path: /config/users_database.ymlBeberapa catatan penting:
host: 0.0.0.0 agar kontainer melayani dari luar dirinya sendiri; port: 9091 harus konsisten dengan port mapping di Compose.session.redis.password memakai placeholder yang sama dari .env — nilai ini direferensikan langsung oleh configuration, bukan oleh Compose.default_policy: deny — semua akses ditolak sampai ada aturan eksplisit (kita bangun di episode 6).authentication_backend.file menunjuk ke users_database.yml yang belum kita buat — file harus ada dan valid, atau Authelia menolak start. Buat minimal users: {}.Important
Kalian akan melihat jwt_secret di config ditulis placeholder, padahal nilainya disuntikkan lewat environment AUTHELIA_JWT_SECRET. Environment variable selalu menimpa nilai file config — ini pola resmi Authelia untuk menjaga secret agar tidak berada di file yang ter-versioning. Episode 4 membahas mekanisme ini secara lengkap.
docker compose up -d
docker compose ps
docker compose logs authelia
curl -fsS http://localhost:9091/api/health
curl -fsS http://localhost:9091/api/stateBuka http://localhost:9091 di browser — kalian akan melihat halaman portal Authelia. Belum ada user dan aturan membuat portal tampak "kosong" — itu wajar; user nyata akan kita tambahkan di episode 5 dan aturan aksesnya di episode 6. Log yang bersih tanpa error adalah tanda stack sehat.
127.0.0.1:9092:9091) atau hentikan proses yang bentrok.session.redis.password dengan --requirepass Redis, dan pastikan indentasi konsisten.Pada episode 3 ini kalian telah memasang Authelia dengan Docker Compose: menyusun stack Authelia + Redis, mengelola secret lewat file .env, membuat konfigurasi minimal configuration.yml, dan memverifikasi bahwa portal Authelia hidup di port 9091 dengan health endpoint yang merespons.
Poin yang harus kalian bawa:
.env, tidak di file ter-commit — dan di-inject lewat environment variables berprefiks AUTHELIA_.default_policy: deny adalah fondasi keamanan yang benar sejak awal.Di episode 4 selanjutnya kita akan membedah struktur file konfigurasi secara menyeluruh: dari theme, jwt_secret, dan default_redirection_url hingga access_control, session, regulation, storage, notifier, dan authentication_backend — plus validasi dengan authelia validate-config dan manajemen secret lewat environment variable. Sampai jumpa di episode 4!