# 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