Files
app-catalog-felhom.eu/templates/vikunja/docker-compose.yml
T
2026-10-06 08:46:42 +02:00

56 lines
2.5 KiB
YAML

# Vikunja - Feladatkezelő listák és táblák (Todoist/Trello alternatíva)
# Domain: ${SUBDOMAIN}.${DOMAIN}
# Database: None (file-based)
# RAM: ~50M (mem_limit: 256M) | Pi-compatible: Yes
#
# Environment variables:
# DOMAIN - Your domain (e.g., demo-felhom.eu)
# VIKUNJA_SERVICE_JWTSECRET- JWT titkosítási kulcs (auto-generated)
services:
vikunja:
image: vikunja/vikunja:2.6.0
container_name: vikunja
user: "0:0"
restart: unless-stopped
environment:
# decision 47: the app's own sign-up switch — open until the box closes it after the first admin (after_setup)
- VIKUNJA_SERVICE_ENABLEREGISTRATION=${SIGNUP_OPEN:-true}
- TZ=Europe/Budapest
- VIKUNJA_SERVICE_PUBLICURL=https://${SUBDOMAIN}.${DOMAIN}
- VIKUNJA_SERVICE_JWTSECRET=${VIKUNJA_SERVICE_JWTSECRET}
# R-776 (R-753, controller >= 0.286.0): the default `direct` reads the TCP peer (traefik) — one address for every
# visitor, so a stranger trips the login floor (10/min per address) for the household. `xff` walks X-Forwarded-For
# from the RIGHT skipping private addresses (echo's default trust): the tunnel's real visitor, or the LAN client.
# measured on 9202 2026-10-06 with a control (checklist 3.6; felhom.eu audits/morning-after-2026-10-06/live-9202/).
- VIKUNJA_SERVICE_IPEXTRACTIONMETHOD=xff
volumes:
- vikunja_data:/app/vikunja/files
- vikunja_db:/db
networks:
- traefik-public
deploy:
resources:
limits:
memory: 256M
# No healthcheck (R-760): the image ships no shell (scripts/upgrade-test.py reads its OOM counter host-side
# for that reason), so neither the CMD-SHELL nor the wget/curl family of REUSE.md §2 can run inside it. Not
# measured: whether the image declares its own HEALTHCHECK. The box is not blind — its own probe
# (.felhom.yml `healthcheck.checks`, api :3456 /api/v1/info expect 200) dials it from outside; only
# Docker's own health state is empty. A healthcheck here needs the image's config READ first, never guessed.
labels:
- "traefik.enable=true"
- "traefik.http.routers.vikunja.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)"
- "traefik.http.routers.vikunja.entrypoints=websecure"
- "traefik.http.routers.vikunja.tls=true"
- "traefik.http.routers.vikunja.tls.certresolver=letsencrypt"
- "traefik.http.services.vikunja.loadbalancer.server.port=3456"
volumes:
vikunja_data:
vikunja_db:
networks:
traefik-public:
external: true