services: caddy: depends_on: - archivebox - freshrss - uptime-kuma - ntfy - flatnotes - radicale - metube - jellyfin - gitea image: caddy:latest container_name: caddy restart: unless-stopped environment: HLEDGER_PASSWORD_HASH: "${HLEDGER_PASSWORD_HASH}" METUBE_PASSWORD_HASH: "${METUBE_PASSWORD_HASH}" ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - /opt/server/caddy/data:/data - /opt/server/caddy/config:/config - /home/tomasr/vps-config/web-server:/srv/www:ro - /opt/server/resspublica:/srv/resspublica:ro extra_hosts: - "host.docker.internal:host-gateway" archivebox: image: archivebox/archivebox:latest container_name: archivebox restart: unless-stopped command: server 0.0.0.0:8000 environment: - TZ=Europe/Zurich volumes: # Local SSD: database + config + metadata - /opt/server/archivebox/archivebox-data:/data # kDrive: only the heavy archive content - /mnt/kdrive/Archive:/data/archive freshrss: image: freshrss/freshrss:latest container_name: freshrss restart: unless-stopped environment: - TZ=Europe/Zurich - CRON_MIN=*/20 volumes: - /opt/server/freshrss:/var/www/FreshRSS/data uptime-kuma: image: louislam/uptime-kuma:latest container_name: uptime-kuma restart: unless-stopped volumes: - /opt/server/uptime-kuma:/app/data ntfy: image: binwiederhier/ntfy:latest container_name: ntfy restart: unless-stopped command: - serve - --config - /etc/ntfy/server.yml environment: - TZ=Europe/Zurich volumes: # Persistent database, cache, attachments - /opt/server/ntfy:/var/cache/ntfy # Server configuration - /home/tomasr/vps-config/ntfy-config/server.yml:/etc/ntfy/server.yml:ro healthcheck: test: ["CMD-SHELL", "wget -q --tries=1 -O- http://localhost:80/v1/health | grep -q 'healthy'"] interval: 30s timeout: 10s retries: 3 flatnotes: image: dullage/flatnotes:latest container_name: flatnotes restart: unless-stopped environment: - TZ=Europe/Zurich - FLATNOTES_USERNAME=${FLATNOTES_USERNAME} - FLATNOTES_PASSWORD=${FLATNOTES_PASSWORD} - FLATNOTES_SECRET_KEY=${FLATNOTES_SECRET_KEY} volumes: - /mnt/kdrive/Notes/quicknotes:/data radicale: image: tomsquest/docker-radicale:latest container_name: radicale restart: unless-stopped environment: - TZ=Europe/Zurich volumes: # Calendar + contacts data - /opt/server/radicale/data:/data # Configuration - /home/tomasr/vps-config/radicale-config:/config metube: image: alexta69/metube:latest container_name: metube restart: unless-stopped environment: - YTDL_OPTIONS={"outtmpl":"%(title)s/%(title)s.%(ext)s","writesubtitles":true,"writeautomaticsub":true,"writethumbnail":true,"writeinfojson":true,"embedmetadata":true,"embedthumbnail":true} - MAX_CONCURRENT_DOWNLOADS=1 - STATE_DIR=/metube - YTDL_NIGHTLY_UPDATE_TIME=03:00 - TZ=Europe/Zurich volumes: # Your video archive - /mnt/kdrive/Autre/Archive/Videos:/downloads # MeTube application state - /opt/server/metube:/metube jellyfin: image: jellyfin/jellyfin:latest container_name: jellyfin restart: unless-stopped environment: - TZ=Europe/Zurich volumes: # Jellyfin configuration/database - /opt/server/jellyfin/config:/config # Transcoding cache - /opt/server/jellyfin/cache:/cache # Your MeTube archive (read-only) - /mnt/kdrive/Autre/Archive/Videos:/media/videos:ro mem_limit: 1500m transmute: image: ghcr.io/transmute-app/transmute:main container_name: transmute restart: unless-stopped volumes: - /opt/server/transmute:/app/data environment: AUTH_SECRET_KEY: "${TRANSMUTE_SECRET_KEY}" AUTH_ACCESS_TOKEN_EXPIRE_MINUTES: 120 gitea: image: gitea/gitea:latest container_name: gitea restart: unless-stopped environment: USER_UID: 1000 USER_GID: 1000 TZ: "Europe/Zurich" GITEA__server__ROOT_URL: "${GITEA_ROOT_URL}" GITEA__server__HTTP_PORT: 3000 GITEA__database__DB_TYPE: "sqlite3" GITEA__database__PATH: "/data/gitea/gitea.db" GITEA__service__DISABLE_REGISTRATION: true GITEA__service__REQUIRE_SIGNIN_VIEW: false volumes: - /opt/server/gitea:/data