Merge pull request #20 from deadcxap/codex/update-docker-compose-for-caddy-security-module

use caddy-security for admin bootstrap auth
This commit is contained in:
deadcxap
2025-08-27 13:48:21 +03:00
committed by GitHub
5 changed files with 76 additions and 41 deletions
+21 -11
View File
@@ -1,24 +1,34 @@
{
email dead@cxap.space
dns cloudflare {$CF_API_TOKEN}
order authorize before reverse_proxy
servers {
trusted_proxies static private_ranges
}
}
# общий сниппет авторизации
(tinyauth_forwarder) {
forward_auth tinyauth:3000 {
uri /api/auth/caddy
copy_headers Remote-User Remote-Name Remote-Email Remote-Groups
# Портал аутентификации
auth.realy.nothing.help {
route {
authp {
backends {
local_backend {
method local
path /data/users.json
}
}
ui {
links {
"Portainer" "https://port.realy.nothing.help"
}
}
}
}
}
# при желании — отдельный сниппет для API
(tinyauth_api_forwarder) {
forward_auth tinyauth:3000 {
uri /api/auth/caddy
header_up Authorization {http.request.header.X-Api-Key}
header_up Accept application/json
# Сниппет для защиты сервисов
(auth_portal_forwarder) {
authorize {
set auth url https://auth.realy.nothing.help
}
}
+3 -9
View File
@@ -2,12 +2,6 @@
# для зоны nothing.help — не используйте глобальный API‑ключ!)
CF_API_TOKEN=jRq98TKXi2rYYtG42x9w1M8EOElt5V5BOkA4TBoY
# Секрет для cookie (ровно 32 латинских буквы/цифры)
# openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 32
TINYAUTH_SECRET=TtbYjkb1ZfzyXG7D6Q3FR6Ri8Pw2K98i
# Пользователи Tinyauth (формат для docker/compose!)
# Пример с одним юзером admin:
# admin:$2a$10$yVb0... (bcrypt)
# Если несколько — через запятую.
TINYAUTH_USERS='deadcxap:$$2a$$10$$5x5iG8uDD/A.zxTCr14iUuLS1d8FgEiH8oi1de6pF2Nl/iZNDBEvG'
# Пользователи для авторизации описываются в файле users.json
# рядом с docker-compose.yml. Хэши паролей можно получить
# командой `caddy hash-password --plaintext "пароль"`.
+40
View File
@@ -0,0 +1,40 @@
# Bootstrap
Роль поднимает Portainer и настраивает аутентификацию через модуль [caddy-security](https://github.com/greenpau/caddy-security).
Портал авторизации доступен на `auth.realy.nothing.help`, а настройки пользователей находятся в файле `users.json`.
## Пользователи
Файл `users.json` содержит массив пользователей. Пример:
```json
{
"users": [
{
"username": "deadcxap",
"email": "dead@cxap.space",
"password": "$2a$10$5x5iG8uDD/A.zxTCr14iUuLS1d8FgEiH8oi1de6pF2Nl/iZNDBEvG",
"roles": ["admin"]
}
]
}
```
Хэш пароля можно получить командой:
```bash
caddy hash-password --plaintext 'секрет'
```
После изменения файла нужно перезапустить контейнер `caddy`.
## Защита контейнеров
Чтобы ограничить доступ к какому-либо сервису, добавьте к контейнеру метку:
```
caddy.import: auth_portal_forwarder
```
и обычные метки для виртуального хоста и `reverse_proxy`. Пример для Portainer уже есть в `docker-compose.yml`.
После авторизации пользователь возвращается к запрошенному сервису.
+2 -21
View File
@@ -16,29 +16,10 @@ services:
- /var/run/docker.sock:/var/run/docker.sock:ro
- caddy_data:/data
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./users.json:/data/users.json:ro
networks: [proxy]
command: ["caddy","docker-proxy","--caddyfile-path=/etc/caddy/Caddyfile","--docker-sockets","unix:///var/run/docker.sock"]
tinyauth:
image: ghcr.io/steveiliop56/tinyauth:v3
container_name: tinyauth
restart: unless-stopped
environment:
- LOG_LEVEL=2
- APP_URL=https://auth.realy.nothing.help
- SECRET=${TINYAUTH_SECRET}
- USERS=${TINYAUTH_USERS}
- COOKIE_SECURE=true
- DISABLE_CONTINUE=true
- APP_TITLE="Оставь надежду, всяк сюда входящий..."
- FORGOT_PASSWORD_MESSAGE="Штош, сочувствую, но нчием помочь не могу."
expose: ["3000"]
networks: [proxy]
labels:
caddy: auth.realy.nothing.help
caddy.encode: zstd gzip
caddy.reverse_proxy: "{{upstreams 3000}}"
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
@@ -53,7 +34,7 @@ services:
labels:
caddy: port.realy.nothing.help
caddy.encode: zstd gzip
caddy.import: tinyauth_forwarder
caddy.import: auth_portal_forwarder
caddy.reverse_proxy: "{{upstreams 9000}}"
volumes:
+10
View File
@@ -0,0 +1,10 @@
{
"users": [
{
"username": "deadcxap",
"email": "dead@cxap.space",
"password": "$2a$10$5x5iG8uDD/A.zxTCr14iUuLS1d8FgEiH8oi1de6pF2Nl/iZNDBEvG",
"roles": ["admin"]
}
]
}