Files
scarif/docker-compose.yml
T

834 lines
24 KiB
YAML
Raw Normal View History

2022-10-05 22:47:24 +00:00
x-logging: &logging
logging:
driver: "local"
options:
max-size: "5m"
max-file: "2"
2020-11-21 10:48:08 +00:00
services:
2024-12-30 12:14:53 +00:00
2026-09-02 19:59:46 +01:00
###################################
# FOUNDRY #
# https://rec.scarif.space/foundy #
###################################
2021-06-21 18:25:05 +01:00
foundry:
2025-07-20 22:21:37 +01:00
profiles: ["prod"]
2022-10-05 22:47:24 +00:00
<<: *logging
2021-06-21 18:25:05 +01:00
image: felddy/foundryvtt:release
volumes:
2026-08-07 22:28:41 +01:00
- /mnt/tower/containers/foundry:/data
2026-08-07 21:49:31 +01:00
- ./foundry/patches:/data/patches
2021-06-21 18:25:05 +01:00
restart: always
environment:
- "FOUNDRY_PASSWORD=${FOUNDRY_PASSWORD}"
- "FOUNDRY_USERNAME=${FOUNDRY_USER}"
- FOUNDRY_ADMIN_KEY=${FOUNDRY_ADMIN_KEY}
- FOUNDRY_HOSTNAME=https://rec.${DOMAIN}
- FOUNDRY_PROXY_PORT=443
- FOUNDRY_PORT=443
- FOUNDRY_PROXY_SSL=true
- FOUNDRY_ROUTE_PREFIX=foundry
2021-06-22 08:33:44 +01:00
- CONTAINER_CACHE=/data/container_cache
2023-03-23 20:29:29 +00:00
- CONTAINER_PATCHES=/data/patches
- FOUNDRY_UID=1000
- FOUNDRY_GID=1000
2025-07-20 22:21:37 +01:00
- VIRTUAL_HOST=rec.${DOMAIN}
2026-08-07 22:28:41 +01:00
- LETSENCRYPT_HOST=rec.${DOMAIN}
2025-07-20 22:21:37 +01:00
- CERT_NAME=${DOMAIN}
- VIRTUAL_PORT=30000
- VIRTUAL_PATH=/foundry
2021-06-21 18:25:05 +01:00
networks:
- nginx
2026-09-02 19:59:46 +01:00
###################################
# NEXTCLOUD #
# https://tower.scarif.space #
###################################
2020-11-22 23:14:54 +00:00
nextcloud:
2025-07-25 23:22:07 +01:00
profiles: ["prod", "dev"]
2022-10-05 22:47:24 +00:00
<<: *logging
2020-11-22 23:14:54 +00:00
build: ./nextcloud
2026-08-04 22:02:01 +01:00
image: nextcloud:33-fpm-alpine
2023-03-23 20:29:29 +00:00
restart: unless-stopped
user: 1000:1000
2025-07-25 23:22:07 +01:00
ports:
- 9000:9000
2020-11-22 23:14:54 +00:00
volumes:
2026-08-07 22:28:41 +01:00
- /mnt/tower/containers/nextcloud:/var/www/html
2025-07-25 23:22:07 +01:00
- ./nextcloud/redis-session.ini:/usr/local/etc/php/conf.d/redis-session.ini
2023-03-23 20:29:29 +00:00
- /mnt/tower/stardust:/var/www/html/data
- /mnt/tower/foundry:/var/www/foundry
2020-11-22 23:14:54 +00:00
environment:
2025-07-20 22:21:37 +01:00
- VIRTUAL_HOST=tower.${DOMAIN}
2026-08-07 22:28:41 +01:00
- LETSENCRYPT_HOST=tower.${DOMAIN}
2025-07-20 22:21:37 +01:00
- CERT_NAME=${DOMAIN}
- VIRTUAL_PORT=9000
- VIRTUAL_PROTO=fastcgi
2020-11-22 23:14:54 +00:00
- REDIS_HOST=redis
- MYSQL_HOST=db
- MYSQL_PASSWORD=${DB_PASSWORD}
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=${DB_USER}
- NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD}
- NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER}
2023-03-23 20:29:29 +00:00
- MAIL_FROM_ADDRESS=${MAIL_FROM}
- SMTP_HOST=${MAIL_HOST}
- SMTP_PORT=${MAIL_PORT}
- SMTP_USER=${MAIL_USER}
- SMTP_PASSWORD=${MAIL_PASSWORD}
- "NEXTCLOUD_TRUSTED_DOMAINS=tower.${DOMAIN} 127.0.0.1"
- USER_UID=1000
- USER_GID=1000
- APACHE_RUN_USER=1000
- APACHE_RUN_GROUP=1000
2020-11-22 23:14:54 +00:00
depends_on:
- db
- redis
2020-11-24 21:19:10 +00:00
networks:
- db
- redis
- nginx
2020-12-07 21:55:23 +00:00
extra_hosts:
2023-03-23 20:29:29 +00:00
- "tower.${DOMAIN}:${LOCAL_IP}"
- "office.${DOMAIN}:${LOCAL_IP}"
2024-12-30 12:15:35 +00:00
2020-12-07 21:55:23 +00:00
collabora:
2025-07-20 22:21:37 +01:00
profiles: ["prod", "dev"]
2022-10-05 22:47:24 +00:00
<<: *logging
2020-12-07 21:55:23 +00:00
image: collabora/code
2023-03-23 20:29:29 +00:00
restart: unless-stopped
2020-12-07 21:55:23 +00:00
cap_add:
- MKNOD
environment:
2025-07-20 22:21:37 +01:00
- VIRTUAL_HOST=office.${DOMAIN}
2026-08-07 22:28:41 +01:00
- LETSENCRYPT_HOST=office.${DOMAIN}
2025-07-20 22:21:37 +01:00
- CERT_NAME=${DOMAIN}
- VIRTUAL_PORT=9980
2023-03-23 20:29:29 +00:00
- "DONT_GEN_SSL_CERT=True"
2020-12-07 21:55:23 +00:00
- domain=tower.${DOMAIN}
2026-03-13 18:47:30 +00:00
- "aliasgroup1=https://tower.${DOMAIN}"
2020-12-07 21:55:23 +00:00
- cert_domain=office.${DOMAIN}
- server_name=office.${DOMAIN}
- username=${COLLABORA_USER}
- password=${COLLABORA_PASSWORD}
- "extra_params=-o:ssl.enable=false --o:ssl.termination=true"
- "dictionaries=de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru ro"
networks:
- nginx
extra_hosts:
2023-03-23 20:29:29 +00:00
- "tower.${DOMAIN}:${LOCAL_IP}"
- "office.${DOMAIN}:${LOCAL_IP}"
2020-12-13 16:37:09 +00:00
2026-09-02 19:59:46 +01:00
###################################
# VAULTWARDEN #
# https://vault.scarif.space #
###################################
vaultwarden:
image: vaultwarden/server:latest
restart: unless-stopped
environment:
- "DOMAIN=https://vault.${DOMAIN}"
- VIRTUAL_HOST=vault.${DOMAIN}
- LETSENCRYPT_HOST=vault.${DOMAIN}
- VIRTUAL_PORT=80
2026-09-20 14:34:03 +01:00
- SIGNUPS_ALLOWED=false
networks:
- nginx
2026-09-02 19:59:46 +01:00
volumes:
- /mnt/tower/containers/vaultwarden:/data/
###################################
# GITEA #
# https://labs.scarif.space #
###################################
2020-11-25 21:33:30 +00:00
gitea:
2025-07-20 22:21:37 +01:00
profiles: ["prod", "dev"]
2022-10-05 22:47:24 +00:00
<<: *logging
2020-11-25 21:33:30 +00:00
image: gitea/gitea:1
environment:
2025-07-20 22:21:37 +01:00
- VIRTUAL_HOST=labs.${DOMAIN}
2026-08-07 22:28:41 +01:00
- LETSENCRYPT_HOST=labs.${DOMAIN}
2025-07-20 22:21:37 +01:00
- CERT_NAME=${DOMAIN}
- VIRTUAL_PORT=3000
2020-11-25 21:33:30 +00:00
- "APP_NAME=Labs: Where the good stuff happens"
- RUN_MODE=prod
- DOMAIN=labs.${DOMAIN}
- ROOT_URL=https://labs.${DOMAIN}
- DB_TYPE=mysql
- DB_HOST=db
- DB_NAME=gitea
- DB_USER=${DB_USER}
- DB_PASSWD=${DB_PASSWORD}
- USER_UID=1200
- USER_GID=1200
- DISABLE_REGISTRATION=true
2020-11-25 21:33:30 +00:00
restart: always
volumes:
2026-08-07 22:28:41 +01:00
- /mnt/tower/containers/gitea:/data
2023-03-23 20:29:29 +00:00
- /mnt/tower/labs:/data/git
- /home/git/.ssh/:/data/git/.ssh/
2020-11-25 21:33:30 +00:00
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "127.0.0.1:2222:22"
2020-11-25 21:33:30 +00:00
networks:
- db
- nginx
depends_on:
- db
2026-08-04 22:02:01 +01:00
2026-09-02 19:59:46 +01:00
###################################
# AUDIOBOOKSHELF #
# https://echo.scarif.space #
###################################
2026-08-04 22:02:01 +01:00
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:latest
volumes:
- /mnt/tower/stardust/chris/files/Library/Audiobooks:/audiobooks
- /mnt/tower/stardust/chris/files/Library/Podcasts:/podcasts
2026-08-07 22:45:05 +01:00
- /mnt/tower/containers/audiobookshelf/config:/config
- /mnt/tower/containers/audiobookshelf:/metadata
2026-08-04 22:02:01 +01:00
environment:
- TZ=Europe/London
- VIRTUAL_HOST=echo.${DOMAIN}
2026-08-07 22:28:41 +01:00
- LETSENCRYPT_HOST=echo.${DOMAIN}
2026-08-04 22:02:01 +01:00
- VIRTUAL_PORT=80
2025-07-25 21:17:58 +01:00
networks:
- nginx
2026-08-04 22:02:01 +01:00
2026-09-02 19:59:46 +01:00
###################################
# GROCY #
# https://supplies.scarif.space #
###################################
2026-08-04 22:02:01 +01:00
grocy:
image: lscr.io/linuxserver/grocy:latest
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
2026-08-07 21:49:31 +01:00
- CURRENCY=GBP
- DEFAULT_LOCALE=en_GB
- VIRTUAL_HOST=supplies.${DOMAIN}
2026-08-07 22:28:41 +01:00
- LETSENCRYPT_HOST=supplies.${DOMAIN}
2026-08-04 22:24:59 +01:00
- VIRTUAL_PORT=80
2026-08-04 22:02:01 +01:00
volumes:
2026-08-07 21:49:31 +01:00
- /mnt/tower/containers/grocy:/config
- ./grocy/config-dist.php:/config/config-dist.php
2026-08-04 22:02:01 +01:00
restart: unless-stopped
2026-08-04 22:24:59 +01:00
networks:
- nginx
2026-08-04 22:02:01 +01:00
2026-09-02 19:59:46 +01:00
###################################
# HOMEBOX #
# https://assets.scarif.space #
###################################
2026-08-07 21:49:31 +01:00
homebox:
image: ghcr.io/sysadminsmedia/homebox:latest
restart: always
environment:
- HBOX_LOG_LEVEL=info
- HBOX_LOG_FORMAT=text
2026-08-08 15:22:36 +01:00
- HBOX_WEB_MAX_UPLOAD_SIZE=20
2026-08-07 21:49:31 +01:00
- HBOX_OPTIONS_ALLOW_ANALYTICS=false
- HBOX_AUTH_API_KEY_PEPPER=${HOMEBOX_API_KEY_PEPPER}
- HBOX_OPTIONS_ALLOW_REGISTRATION=true
- VIRTUAL_HOST=assets.${DOMAIN}
2026-08-07 22:28:41 +01:00
- LETSENCRYPT_HOST=assets.${DOMAIN}
2026-08-07 21:49:31 +01:00
- VIRTUAL_PORT=7745
volumes:
- /mnt/tower/containers/homebox:/data/
networks:
- nginx
2025-07-25 21:17:58 +01:00
2026-09-02 19:59:46 +01:00
###################################
# SEARXNG #
# https://holocron.scarif.space #
###################################
2025-07-25 21:17:58 +01:00
searxng:
image: docker.io/searxng/searxng:latest
restart: unless-stopped
networks:
- nginx
- redis
volumes:
- ./searxng:/etc/searxng:rw
2026-08-07 22:28:41 +01:00
- /mnt/tower/containers/searxng:/var/cache/searxng:rw
2025-07-25 21:17:58 +01:00
environment:
- SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/
- SEARXNG_SECRET=${SEARXNG_SECRET_KEY}
- VIRTUAL_HOST=holocron.${DOMAIN}
2026-08-07 22:28:41 +01:00
- LETSENCRYPT_HOST=holocron.${DOMAIN}
2025-07-25 21:17:58 +01:00
- VIRTUAL_PORT=8080
- CERT_NAME=${DOMAIN}
<<: *logging
2026-09-02 19:59:46 +01:00
###################################
# MINECRAFT #
###################################
2024-12-26 00:06:39 +00:00
minecraft:
2025-07-20 22:21:37 +01:00
profiles: ["prod"]
2024-12-26 00:06:39 +00:00
<<: *logging
image: itzg/minecraft-server
tty: true
stdin_open: true
ports:
- "25565:25565"
environment:
- TYPE=VANILLA
- VERSION=LATEST
- EULA=TRUE
- MEMORY=2G
- RCON_PASSWORD=${MINECRAFT_PASSWORD}
- MOTD="Scarif Minecraft Server"
2024-12-26 12:54:17 +00:00
- WHITELIST=${MINECRAFT_WHITELIST}
2024-12-26 00:06:39 +00:00
volumes:
2026-08-07 22:28:41 +01:00
- /mnt/tower/containers/minecraft:/data
2024-12-26 00:06:39 +00:00
2024-12-26 12:54:17 +00:00
mc-backup:
2025-07-20 22:21:37 +01:00
profiles: ["prod"]
2024-12-26 12:54:17 +00:00
<<: *logging
image: itzg/mc-backup
depends_on:
minecraft:
condition: service_healthy
environment:
- RCON_HOST=minecraft
- RCON_PASSWORD=${MINECRAFT_PASSWORD}
- INITIAL_DELAY=0
- BACKUP_INTERVAL=24h
- PAUSE_IF_NO_PLAYERS=true
- PLAYERS_ONLINE_CHECK_INTERVAL=10
- PRUNE_BACKUPS_DAYS=30
volumes:
2026-08-07 22:28:41 +01:00
- /mnt/tower/containers/minecraft:/data
2026-09-02 19:59:46 +01:00
- /mnt/tower/containers/minecraft/backup:/backups
2024-12-26 12:54:17 +00:00
2026-09-02 19:59:46 +01:00
###################################
# NAVIDROME #
# https://radio.scarif.space #
###################################
2023-12-01 09:03:33 +00:00
navidrome:
2025-07-20 22:21:37 +01:00
profiles: ["prod"]
2023-12-01 09:03:33 +00:00
<<: *logging
image: deluan/navidrome:latest
restart: unless-stopped
environment:
2025-07-20 22:21:37 +01:00
- VIRTUAL_HOST=radio.${DOMAIN}
2026-08-07 22:28:41 +01:00
- LETSENCRYPT_HOST=radio.${DOMAIN}
2025-07-20 22:21:37 +01:00
- CERT_NAME=${DOMAIN}
- VIRTUAL_PORT=4533
2023-12-01 09:03:33 +00:00
- ND_SCANSCHEDULE=1h
- ND_LOGLEVEL=info
- ND_SESSIONTIMEOUT=24h
- ND_BASEURL=https://radio.${DOMAIN}
volumes:
2026-08-07 21:49:31 +01:00
- /mnt/tower/containers/navidrome:/data
2026-08-04 22:02:01 +01:00
- /mnt/tower/stardust/chris/files/Library/Music:/music:ro
2023-12-01 09:03:33 +00:00
networks:
- nginx
2026-09-02 19:59:46 +01:00
###################################
# PIHOLE #
# https://net.scarif.space #
###################################
2023-07-09 22:56:43 +01:00
pihole:
2025-07-20 22:21:37 +01:00
profiles: ["prod"]
2023-07-09 22:56:43 +01:00
<<: *logging
image: pihole/pihole:latest
ports:
- "53:53/tcp"
- "53:53/udp"
environment:
2025-07-20 22:21:37 +01:00
- VIRTUAL_HOST=net.${DOMAIN}
- CERT_NAME=${DOMAIN}
- TZ="Europe/London"
- WEBPASSWORD=${PIHOLE_PASSWORD}
2023-07-09 22:56:43 +01:00
volumes:
2026-09-02 19:59:46 +01:00
- "/mnt/tower/containers/pihole/etc-pihole:/etc/pihole"
- "./pihole/etc-dnsmasq.d:/etc/dnsmasq.d"
2023-07-09 22:56:43 +01:00
restart: unless-stopped
networks:
- nginx
2026-09-02 19:59:46 +01:00
###################################
# DAWARICH #
# https://map.scarif.space #
###################################
dawarich_app:
image: freikin/dawarich:latest
volumes:
- /mnt/tower/containers/dawarich/public:/var/app/public
- /mnt/tower/containers/dawarich/watched:/var/app/tmp/imports/watched
- /mnt/tower/containers/dawarich/storage:/var/app/storage
- /mnt/tower/containers/dawarich/data:/dawarich_db_data
networks:
- dawarich
- redis
- nginx
stdin_open: true
tty: true
entrypoint: web-entrypoint.sh
command: ['bin/rails', 'server', '-p', '3000', '-b', '::']
restart: unless-stopped
environment:
VIRTUAL_HOST: maps.${DOMAIN}
VIRTUAL_PORT: 3000
LETSENCRYPT_HOST: maps.${DOMAIN}
RAILS_ENV: ${RAILS_ENV:-production}
PUID: ${PUID:-1000}
PGID: ${PGID:-1000}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
DATABASE_HOST: ${DATABASE_HOST:-dawarich_db}
DATABASE_PORT: ${DATABASE_PORT:-5432}
DATABASE_USERNAME: ${DATABASE_USERNAME:-postgres}
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-password}
DATABASE_NAME: ${DATABASE_NAME:-dawarich_development}
APPLICATION_HOSTS: maps.${DOMAIN},localhost,::1,127.0.0.1
TIME_ZONE: ${TIME_ZONE:-Europe/London}
APPLICATION_PROTOCOL: ${APPLICATION_PROTOCOL:-http}
PROMETHEUS_EXPORTER_ENABLED: ${PROMETHEUS_EXPORTER_ENABLED:-false}
SECRET_KEY_BASE: ${DAWARICH_SECRET_KEY}
RAILS_LOG_TO_STDOUT: ${RAILS_LOG_TO_STDOUT:-true}
SELF_HOSTED: ${SELF_HOSTED:-true}
STORE_GEODATA: ${STORE_GEODATA:-true}
WEB_CONCURRENCY: ${WEB_CONCURRENCY:-1}
<<: *logging
depends_on:
- dawarich_db
- redis
deploy:
resources:
limits:
cpus: ${APP_CPU_LIMIT:-0.50}
memory: ${APP_MEMORY_LIMIT:-4G}
2026-03-13 18:42:44 +00:00
2026-09-02 19:59:46 +01:00
dawarich_sidekiq:
image: freikin/dawarich:latest
volumes:
- /mnt/tower/containers/dawarich/public:/var/app/public
- /mnt/tower/containers/dawarich/watched:/var/app/tmp/imports/watched
- /mnt/tower/containers/dawarich/storage:/var/app/storage
networks:
- dawarich
- redis
stdin_open: true
tty: true
entrypoint: sidekiq-entrypoint.sh
command: ['sidekiq']
restart: unless-stopped
environment:
RAILS_ENV: ${RAILS_ENV:-production}
### To run under a non-root user, set PUID/PGID here (do NOT use `user:`).
# PUID: ${PUID:-1000}
# PGID: ${PGID:-1000}
REDIS_URL: ${REDIS_URL:-redis://redis:6379}
DATABASE_HOST: ${DATABASE_HOST:-dawarich_db}
DATABASE_PORT: ${DATABASE_PORT:-5432}
DATABASE_USERNAME: ${DATABASE_USERNAME:-postgres}
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-password}
DATABASE_NAME: ${DATABASE_NAME:-dawarich_development}
APPLICATION_HOSTS: maps.${DOMAIN},localhost,::1,127.0.0.1
BACKGROUND_PROCESSING_CONCURRENCY: ${BACKGROUND_PROCESSING_CONCURRENCY:-3}
APPLICATION_PROTOCOL: ${APPLICATION_PROTOCOL:-http}
PROMETHEUS_EXPORTER_ENABLED: ${PROMETHEUS_EXPORTER_ENABLED:-false}
SECRET_KEY_BASE: ${DAWARICH_SECRET_KEY}
RAILS_LOG_TO_STDOUT: ${RAILS_LOG_TO_STDOUT:-true}
SELF_HOSTED: ${SELF_HOSTED:-true}
STORE_GEODATA: ${STORE_GEODATA:-true}
<<: *logging
depends_on:
- dawarich_db
- redis
- dawarich_app
dawarich_db:
image: postgis/postgis:17-3.5-alpine
shm_size: 1G
volumes:
- /mnt/tower/containers/dawarich/db:/var/lib/postgresql/data
networks:
- dawarich
<<: *logging
environment:
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}
POSTGRES_DB: ${POSTGRES_DB:-dawarich_development}
restart: always
###################################
# SURE #
# https://credits.scarif.space #
###################################
sure_app:
image: ghcr.io/we-promise/sure:stable
volumes:
- /mnt/tower/containers/sure:/rails/storage
restart: unless-stopped
<<: *logging
environment:
VIRTUAL_HOST: credits.${DOMAIN}
VIRTUAL_PORT: 3000
LETSENCRYPT_HOST: credits.${DOMAIN}
POSTGRES_USER: ${POSTGRES_USER:-sure_user}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sure_password}
POSTGRES_DB: ${POSTGRES_DB:-sure_production}
SECRET_KEY_BASE: ${SURE_SECRET_KEY}
SELF_HOSTED: "true"
RAILS_FORCE_SSL: "false"
RAILS_ASSUME_SSL: "false"
DB_HOST: sure_db
DB_PORT: 5432
REDIS_URL: redis://redis:6379/1
depends_on:
- sure_db
- redis
networks:
- sure
- nginx
- redis
sure_worker:
image: ghcr.io/we-promise/sure:stable
command: bundle exec sidekiq
<<: *logging
volumes:
- /mnt/tower/containers/sure:/rails/storage
restart: unless-stopped
depends_on:
- sure_db
- redis
environment:
POSTGRES_USER: ${POSTGRES_USER:-sure_user}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sure_password}
POSTGRES_DB: ${POSTGRES_DB:-sure_production}
SECRET_KEY_BASE: ${SURE_SECRET_KEY}
SELF_HOSTED: "true"
RAILS_FORCE_SSL: "false"
RAILS_ASSUME_SSL: "false"
DB_HOST: sure_db
DB_PORT: 5432
REDIS_URL: redis://redis:6379/1
networks:
- sure
- redis
sure_db:
image: postgres:16
<<: *logging
restart: unless-stopped
volumes:
- /mnt/tower/containers/sure/db:/var/lib/postgresql/data
environment:
POSTGRES_USER: ${POSTGRES_USER:-sure_user}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-sure_password}
POSTGRES_DB: ${POSTGRES_DB:-sure_production}
networks:
- sure
2026-09-20 14:34:03 +01:00
###################################
# WOLF #
###################################
wolf:
image: ghcr.io/games-on-whales/wolf:stable
<<: *logging
environment:
- NVIDIA_DRIVER_VOLUME_NAME=nvidia-driver-vol
volumes:
- /mnt/tower/containers/wolf/etc/wolf/:/etc/wolf:rw
- ./wolf/config.toml:/etc/wolf/cfg/config.toml:ro
- /var/run/docker.sock:/var/run/docker.sock:rw
- /dev/:/dev/:rw
- /run/udev:/run/udev:rw
- nvidia-driver-vol:/usr/nvidia:rw
devices:
- /dev/dri
- /dev/uinput
- /dev/uhid
- /dev/nvidia-uvm
- /dev/nvidia-uvm-tools
- /dev/nvidia-caps/nvidia-cap1
- /dev/nvidia-caps/nvidia-cap2
- /dev/nvidiactl
- /dev/nvidia0
- /dev/nvidia-modeset
device_cgroup_rules:
- 'c 13:* rmw'
network_mode: host
restart: unless-stopped
###################################
# JELLYFIN #
# https://media.scarif.space #
###################################
jellyfin:
image: jellyfin/jellyfin
<<: *logging
ports:
- 8096:8096/tcp
- 7359:7359/udp
volumes:
- ./jellyfin/config:/config
- /mnt/tower/containers/jellyfin/cache:/cache
- type: bind
source: /mnt/tower/stardust/chris/files/Library/Movies
target: /movies
- type: bind
source: /mnt/tower/stardust/chris/files/Library/Shows
target: /shows
restart: 'unless-stopped'
# Optional - alternative address used for autodiscovery
environment:
- JELLYFIN_PublishedServerUrl=http://media.${DOMAIN}
- VIRTUAL_HOST=media.${DOMAIN}
- VIRTUAL_PORT=8096
- LETSENCRYPT_HOST=media.${DOMAIN}
extra_hosts:
- 'host.docker.internal:host-gateway'
networks:
- nginx
###################################
# PHOTOPRISM #
# https://holo.scarif.space #
###################################
photoprism:
image: photoprism/photoprism:latest
<<: *logging
# restart: unless-stopped
stop_grace_period: 15s
depends_on:
- db
security_opt:
- seccomp:unconfined
- apparmor:unconfined
ports:
- "2342:2342"
environment:
PHOTOPRISM_ADMIN_USER: "${PHOTOPRISM_USER}"
PHOTOPRISM_ADMIN_PASSWORD: "${PHOTOPRISM_PASSWORD}"
PHOTOPRISM_AUTH_MODE: "password"
PHOTOPRISM_DISABLE_TLS: "true"
PHOTOPRISM_DEFAULT_TLS: "false"
PHOTOPRISM_SITE_URL: "http://holo.${DOMAIN}"
PHOTOPRISM_SITE_TITLE: "Holo"
PHOTOPRISM_SITE_CAPTION: "Photo library"
PHOTOPRISM_READONLY: "false"
PHOTOPRISM_EXPERIMENTAL: "true"
PHOTOPRISM_DISABLE_CHOWN: "false"
PHOTOPRISM_DISABLE_WEBDAV: "true"
PHOTOPRISM_DISABLE_MCP: "true"
PHOTOPRISM_SIDECAR_YAML: "true"
PHOTOPRISM_BACKUP_ALBUMS: "true"
PHOTOPRISM_BACKUP_DATABASE: "false"
PHOTOPRISM_INDEX_SCHEDULE: "@every 3h"
PHOTOPRISM_UPLOAD_LIMIT: 50000
PHOTOPRISM_ORIGINALS_LIMIT: 50000
PHOTOPRISM_HTTP_COMPRESSION: "zstd,gzip"
PHOTOPRISM_DATABASE_DRIVER: "sqlite"
PHOTOPRISM_INIT: "https tensorflow"
OLLAMA_BASE_URL: "http://ollama:11434"
OLLAMA_API_KEY: ""
PHOTOPRISM_FFMPEG_ENCODER: "nvidia"
PHOTOPRISM_FFMPEG_BITRATE: "64"
NVIDIA_VISIBLE_DEVICES: "all"
NVIDIA_DRIVER_CAPABILITIES: "all"
PHOTOPRISM_UID: 1000
PHOTOPRISM_GID: 1000
PHOTOPRISM_UMASK: 0000
VIRTUAL_HOST: "holo.${DOMAIN}"
VIRTUAL_PORT: 2342
LETSENCRYPT_HOST: "holo.${DOMAIN}"
user: "1000:1000"
devices:
- "/dev/dri:/dev/dri"
working_dir: "/photoprism" # do not change or remove
volumes:
- "/mnt/tower/stardust/chris/files/Memories:/photoprism/originals"
- "/mnt/tower/stardust/chris/files/Unsorted/Memories:/photoprism/import"
- "/mnt/tower/containers/photoprism/storage:/photoprism/storage"
- "./photoprism/vision.yml:/photoprism/storage/config/vision.yml:ro"
networks:
- nginx
- db
- ollama
deploy:
resources:
reservations:
devices:
- driver: "nvidia"
capabilities: [ gpu ]
count: "all"
2026-09-02 19:59:46 +01:00
###################################
# UTILITIES #
###################################
2020-11-21 10:48:08 +00:00
db:
2025-07-20 22:21:37 +01:00
profiles: ["prod", "dev"]
2022-10-05 22:47:24 +00:00
<<: *logging
2020-11-21 10:48:08 +00:00
image: mariadb
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --skip-innodb-read-only-compressed
2020-11-21 10:48:08 +00:00
environment:
2020-11-22 23:14:54 +00:00
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
2020-11-21 10:48:08 +00:00
volumes:
2026-08-07 22:28:41 +01:00
- /mnt/tower/containers/db:/var/lib/mysql
2020-11-22 23:14:54 +00:00
- ./db/init:/docker-entrypoint-initdb.d
restart: always
2020-11-24 21:19:10 +00:00
networks:
- db
2020-11-22 23:14:54 +00:00
redis:
2025-07-20 22:21:37 +01:00
profiles: ["prod", "dev"]
2025-07-25 21:17:58 +01:00
<<: *logging
2020-11-22 23:14:54 +00:00
image: redis:alpine
2020-11-21 10:48:08 +00:00
restart: always
2020-11-24 21:19:10 +00:00
networks:
- redis
2020-11-21 10:48:08 +00:00
2025-07-25 21:17:58 +01:00
mongodb:
2026-09-02 19:59:46 +01:00
<<: *logging
2025-07-25 21:17:58 +01:00
profiles: ["prod", "dev"]
image: mongo
restart: always
volumes:
2026-08-07 22:28:41 +01:00
- /mnt/tower/containers/mongodb:/data/db
2025-07-25 21:17:58 +01:00
command: mongod
networks:
- db
environment:
- MONGO_INITDB_ROOT_USERNAME=${DB_USER}
- MONGO_INITDB_ROOT_PASSWORD=${DB_PASSWORD}
2026-09-02 19:59:46 +01:00
rsync-backup:
2025-07-25 21:17:58 +01:00
<<: *logging
2026-09-02 19:59:46 +01:00
build: ./backup
volumes:
- /mnt/tower:/data:ro
- /mnt/backup/tower:/backup
- ./backup/crontab.txt:/etc/crontabs/root:ro
- ./backup/exclude.txt:/config/exclude.txt:ro
restart: unless-stopped
2025-07-25 21:17:58 +01:00
2026-09-20 14:34:03 +01:00
## Ollama Large-Language Model Runner (optional)
## run "ollama pull [name]:[version]" to download a vision model
## listed at <https://ollama.com/search?c=vision>, for example:
## docker compose exec ollama ollama pull gemma4:latest
ollama:
image: ollama/ollama:latest
<<: *logging
restart: unless-stopped
stop_grace_period: 15s
# ports:
# - "11434:11434"
environment:
OLLAMA_HOST: "0.0.0.0:11434"
OLLAMA_MODELS: "/root/.ollama"
OLLAMA_MAX_QUEUE: "100"
OLLAMA_NUM_PARALLEL: "1"
OLLAMA_MAX_LOADED_MODELS: "1"
OLLAMA_LOAD_TIMEOUT: "5m"
OLLAMA_KEEP_ALIVE: "5m"
OLLAMA_CONTEXT_LENGTH: "4096"
OLLAMA_MULTIUSER_CACHE: "false"
OLLAMA_NOPRUNE: "false"
OLLAMA_NOHISTORY: "true"
OLLAMA_FLASH_ATTENTION: "true"
OLLAMA_KV_CACHE_TYPE: "f16"
OLLAMA_SCHED_SPREAD: "false"
DO_NOT_TRACK: "true"
HF_HUB_DISABLE_TELEMETRY: "1"
OLLAMA_NO_CLOUD: "1" # uncomment to disable Ollama Cloud models/features
## NVIDIA GPU Hardware Acceleration (see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html):
NVIDIA_VISIBLE_DEVICES: "all"
NVIDIA_DRIVER_CAPABILITIES: "compute,utility"
volumes:
- "ollama:/root/.ollama"
networks:
- ollama
## NVIDIA GPU Hardware Acceleration (see https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html):
deploy:
resources:
reservations:
devices:
- driver: "nvidia"
capabilities: [ gpu ]
count: "all"
2020-11-21 10:48:08 +00:00
nginx:
2025-07-25 21:17:58 +01:00
<<: *logging
2025-07-20 22:21:37 +01:00
profiles: ["prod", "dev"]
image: nginxproxy/nginx-proxy
2020-11-21 10:48:08 +00:00
restart: always
2025-07-20 22:21:37 +01:00
ports:
- "80:80"
- "443:443"
2026-08-07 22:28:41 +01:00
labels:
- "com.github.nginx-proxy.nginx"
2020-11-21 10:48:08 +00:00
volumes:
2025-07-20 22:21:37 +01:00
- /var/run/docker.sock:/tmp/docker.sock:ro
- /opt/ssl:/etc/nginx/certs:ro
2026-08-07 22:28:41 +01:00
- html:/usr/share/nginx/html
- vhost:/etc/nginx/vhost.d
2025-07-25 21:17:58 +01:00
- ./nginx/vhost.d/labs_location:/etc/nginx/vhost.d/labs.${DOMAIN}_location:ro
- ./nginx/vhost.d/office:/etc/nginx/vhost.d/office.${DOMAIN}:ro
- ./nginx/vhost.d/rec:/etc/nginx/vhost.d/rec.${DOMAIN}:ro
- ./nginx/vhost.d/tower_location_override:/etc/nginx/vhost.d/tower.${DOMAIN}_location_override:ro
- ./nginx/vhost.d/tower:/etc/nginx/vhost.d/tower.${DOMAIN}:ro
2026-08-08 15:22:36 +01:00
- ./nginx/vhost.d/assets:/etc/nginx/vhost.d/assets.${DOMAIN}:ro
2025-07-25 21:17:58 +01:00
- ./nginx/conf.d/custom_proxy.conf:/etc/nginx/conf.d/custom_proxy.conf:ro
2026-08-07 22:28:41 +01:00
- /mnt/tower/containers/nextcloud:/var/www/html/nextcloud:ro
2022-12-20 23:21:50 +00:00
- ./christmas:/var/www/html/christmas:ro
2020-11-24 21:19:10 +00:00
networks:
- nginx
2020-11-21 10:48:08 +00:00
2026-08-07 22:28:41 +01:00
acme-companion:
<<: *logging
profiles: ["prod"]
image: nginxproxy/acme-companion
restart: always
environment:
- DEFAULT_EMAIL=stoffles@gmail.com
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /opt/ssl:/etc/nginx/certs:rw
- acme:/etc/acme.sh
- vhost:/etc/nginx/vhost.d:rw
- html:/usr/share/nginx/html:rw
depends_on:
- nginx
networks:
- nginx
2023-03-23 20:29:29 +00:00
certs:
2025-07-20 22:21:37 +01:00
profiles: ["dev"]
image: paulczar/omgwtfssl
restart: "no"
volumes:
- /opt/ssl:/certs
2023-03-23 20:29:29 +00:00
environment:
- SSL_SUBJECT=${DOMAIN}
- CA_SUBJECT=chris@${DOMAIN}
- SSL_KEY=/certs/${DOMAIN}.key
- SSL_CSR=/certs/${DOMAIN}.csr
- SSL_CERT=/certs/${DOMAIN}.crt
2020-11-25 21:33:30 +00:00
2020-11-21 10:48:08 +00:00
volumes:
2026-08-07 22:28:41 +01:00
html:
vhost:
acme:
2026-09-20 14:34:03 +01:00
ollama:
nvidia-driver-vol:
external: true
2020-11-24 21:19:10 +00:00
networks:
db:
nginx:
redis:
2026-09-02 19:59:46 +01:00
sure:
dawarich:
2020-12-22 18:05:10 +00:00
meet.jitsi:
2026-09-20 14:34:03 +01:00
ollama:
2022-10-05 22:47:24 +00:00