- `true` доверял всей цепочке X-Forwarded-For, что позволяло подделать IP клиента; у нас ровно один хоп — Caddy - tududi с 1.3.x сам приводит значение к 1 и пишет предупреждение на каждый старт
81 lines
3.8 KiB
YAML
81 lines
3.8 KiB
YAML
# Tududi — планировщик задач (github.com/chrisvel/tududi).
|
||
# See versions: https://hub.docker.com/r/chrisvel/tududi/tags
|
||
#
|
||
# Образ стартует entrypoint'ом от root, chown'ит /app/backend на PUID:PGID и
|
||
# сбрасывает права через su-exec — поэтому НЕ задаём `user:`, только PUID/PGID
|
||
# (совпадают с системным пользователем tududi, владельцем смонтированных каталогов).
|
||
#
|
||
# Внутренний порт — 3002 (frontend отдаётся тем же backend'ом). Caddy проксирует
|
||
# tududi.vakhrushev.me -> tududi_app:3002. Аутентификация — собственный OIDC-логин
|
||
# tududi к Authelia (НЕ forward_auth), поэтому в Caddy домен открыт.
|
||
|
||
services:
|
||
|
||
tududi_app:
|
||
image: chrisvel/tududi:1.3.1
|
||
container_name: tududi_app
|
||
restart: unless-stopped
|
||
networks:
|
||
- "web_proxy_network"
|
||
volumes:
|
||
- "{{ db_dir }}:/app/backend/db"
|
||
- "{{ uploads_dir }}:/app/backend/uploads"
|
||
environment:
|
||
- PUID={{ app_owner_uid }}
|
||
- PGID={{ app_owner_gid }}
|
||
|
||
- NODE_ENV=production
|
||
- PORT=3002
|
||
- DB_FILE=db/production.sqlite3
|
||
- TUDUDI_UPLOAD_PATH=/app/backend/uploads
|
||
|
||
- BASE_URL=https://tududi.vakhrushev.me
|
||
- TUDUDI_ALLOWED_ORIGINS=https://tududi.vakhrushev.me
|
||
# Ровно один хоп (Caddy). `true` доверяет всей цепочке X-Forwarded-For и
|
||
# позволяет подделать IP клиента; tududi с 1.3.x сам приводит его к 1 и ругается.
|
||
- TUDUDI_TRUST_PROXY=1
|
||
|
||
- TUDUDI_SESSION_SECRET={{ tududi_session_secret }}
|
||
# Чистый OIDC: сид-админ не создаётся (TUDUDI_USER_EMAIL/PASSWORD не заданы),
|
||
# первый вход через Authelia сам заводит пользователя и выдаёт ему admin по
|
||
# OIDC_ADMIN_EMAIL_DOMAINS. Локальный парольный вход выключен.
|
||
- PASSWORD_AUTH_ENABLED=false
|
||
|
||
# OIDC (Authelia). Redirect URI регистрируется в Authelia как
|
||
# https://tududi.vakhrushev.me/api/oidc/callback/{OIDC_PROVIDER_SLUG}.
|
||
- OIDC_ENABLED=true
|
||
- OIDC_PROVIDER_NAME=Authelia
|
||
- OIDC_PROVIDER_SLUG=authelia
|
||
- OIDC_ISSUER_URL=https://auth.vakhrushev.me
|
||
- OIDC_CLIENT_ID={{ tududi_oidc_client_id }}
|
||
- OIDC_CLIENT_SECRET={{ tududi_oidc_client_secret }}
|
||
- OIDC_SCOPE=openid profile email
|
||
- OIDC_AUTO_PROVISION=true
|
||
# Домен email, чьим пользователям при auto-provision выдаётся роль админа
|
||
# (должен совпадать с доменом email в id_token от Authelia).
|
||
- OIDC_ADMIN_EMAIL_DOMAINS=vakhrushev.me
|
||
|
||
# Почта (Yandex Cloud Postbox, те же секреты, что у outline/authelia).
|
||
- ENABLE_EMAIL=true
|
||
- EMAIL_SMTP_HOST={{ postbox_host }}
|
||
- EMAIL_SMTP_PORT={{ postbox_port }}
|
||
- EMAIL_SMTP_SECURE=false
|
||
- EMAIL_SMTP_USERNAME={{ postbox_user }}
|
||
- EMAIL_SMTP_PASSWORD={{ postbox_pass }}
|
||
- EMAIL_FROM_ADDRESS=tududi@vakhrushev.me
|
||
- EMAIL_FROM_NAME=Tududi
|
||
|
||
# MCP Server
|
||
- FF_ENABLE_MCP=true
|
||
|
||
# AI-фичи через Bifrost (drop-in OpenAI-эндпоинт в общей сети — НЕ localhost,
|
||
# это сам контейнер). Модель у tududi захардкожена как gpt-4o-mini; Bifrost
|
||
# по governance-правилу роутит её на deepseek-v4-pro. openai-node сам
|
||
# подхватывает OPENAI_BASE_URL.
|
||
- OPENAI_API_KEY={{ tududi_openai_api_key }}
|
||
- OPENAI_BASE_URL=http://bifrost_app:8080/openai
|
||
|
||
networks:
|
||
web_proxy_network:
|
||
external: true
|