Налаштування Authelia
Authelia — це відкритий self-hosted сервер автентифікації та авторизації, який ставлять перед власними веб-застосунками, щоб не робити окремий вхід у кожному з них. Сам він не є реверс-проксі й не вміє сам приймати трафік із зовнішнього світу: зазвичай перед ним стоїть Caddy, Nginx чи Traefik, які через механізм forward auth питають в Authelia, чи можна пропустити конкретний запит.
Authelia віддає користувачеві єдину сторінку входу, де той один раз вводить логін і пароль та, за потреби, другий фактор — TOTP-код, апаратний ключ WebAuthn або push-підтвердження. Після успішного входу вона виставляє підписаний cookie-сесію, і далі всі сайти в межах того самого домену вважають користувача вже автентифікованим. Кого саме пускати й з яким рівнем перевірки визначають правила access_control: можна дозволити one_factor для однієї піддомен-зони, вимагати two_factor для іншої або повністю закрити решту політикою deny.
Список користувачів Authelia бере з LDAP-каталогу або з простого YAML-файлу, у якому зберігаються лише хеші паролів, а для скидання пароля й повідомлень потрібен налаштований notifier. У результаті всі пароли, друга лічба факторів і правила доступу живуть в одному місці, а застосунки за проксі просто довіряють заголовкам, які прокидає Authelia.
Docker (compose.yaml)
Цей compose-файл запускає Authelia в контейнері й підключає його до зовнішньої мережі trkm-network, де контейнери бачать один одного за іменами сервісів. Каталог ./config монтується в /config, тож налаштування й база лишаються на хості, а expose відкриває порт 9091 тільки всередині мережі — назовні Authelia доступна лише через Caddy.
cat compose.yaml
services:
authelia:
image: authelia/authelia:latest
container_name: authelia
restart: unless-stopped
volumes:
- ./config:/config
networks:
- trkm-network
expose:
- 9091
environment:
- TZ=Europe/Kyiv
networks:
trkm-network:
external: true
Конфігурація Authelia (configuration.yml)
Це головний конфіг Authelia: session описує cookie й час життя «запам'ятай мене», authentication_backend вказує файл із хешами паролів, а access_control за замовчуванням забороняє все й дозволяє one_factor для articles.trkm.top. Секції storage та identity_validation тримають ключі для шифрування SQLite-бази і JWT скидання пароля, а notifier у режимі filesystem просто пише листи у файл — зручно для тестів, для продакшену краще SMTP.
cat config/configuration.yml
server:
address: "tcp://0.0.0.0:9091"
session:
name: authelia_session
secret: "8d5c4b1e9f2a7b3c6d5e8f1a2b3c4erre7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c"
remember_me: 1M
cookies:
- domain: trkm.top
authelia_url: https://auth.trkm.top
# Цей рядок переїхав сюди
default_redirection_url: https://articles.trkm.top
identity_validation:
reset_password:
jwt_secret: "a7b8c9d0e1f2g3h7687981p2q3r4s5t6u7v8w9x0y1z2a3b4c5d6e7f8"
authentication_backend:
file:
path: /config/users_database.yml
access_control:
default_policy: deny
rules:
- domain: articles.trkm.top
policy: one_factor
storage:
encryption_key: "k1l2m3n4or8s9t0u1v2w3x4y5z6a7b8c9d0e1256679i5j6k7l8m9n0o1p2"
local:
path: /config/db.sqlite3
notifier:
filesystem:
filename: /config/emails.txt
log:
level: info
format: text
Налаштування Caddy
Caddy тут — єдина публічна точка входу: auth.trkm.top проксіює запити до Authelia, доступної на хості як host.docker.internal:9091. У блоці articles.trkm.top директива forward_auth перед кожним запитом викликає /api/verify і за потреби перенаправляє на вхід, а copy_headers прокидає дані користувача в бекенд.
auth.trkm.top {
reverse_proxy host.docker.internal:9091
}
articles.trkm.top {
# Блок перевірки автентифікації через Authelia
forward_auth auth.trkm.top {
uri /api/verify?rd=https://auth.trkm.top
copy_headers Remote-User Remote-Groups Remote-Name Remote-Email
}
reverse_proxy articles:8080
}
Генерація хешу пароля
Команда виконується всередині контейнера і перетворює пароль у хеш argon2id — саме такий рядок треба вставити в поле password файлу users_database.yml. Відкритий пароль ніде не зберігаємо; замість --password можна передати --random, і Authelia сама згенерує пароль.
docker exec -it authelia authelia crypto hash generate --password "pa$$word"