# Utility Services - Dashboard, file management, sync, etc. services: # ===== DASHBOARD & MONITORING ===== homepage: image: ghcr.io/gethomepage/homepage:latest container_name: homepage profiles: ["utilities", "all"] volumes: - ./Homepage/config/images:/app/public/images - ./Homepage/config/icons:/app/public/icons - ./Homepage/config:/app/config ports: - "7575:3000" environment: - PUID=${PUID} - PGID=${PGID} - TZ=${TZ} - HOMEPAGE_ALLOWED_HOSTS=${HOMEPAGE_ALLOWED_HOSTS} restart: unless-stopped depends_on: - dockerproxy dockerproxy: image: ghcr.io/tecnativa/docker-socket-proxy:latest container_name: dockerproxy profiles: ["utilities", "all"] environment: - CONTAINERS=${DOCKER_PROXY_CONTAINERS} - SERVICES=${DOCKER_PROXY_SERVICES} - TASKS=${DOCKER_PROXY_TASKS} - POST=${DOCKER_PROXY_POST} ports: - "127.0.0.1:2375:2375" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro restart: unless-stopped security_opt: - no-new-privileges:true # ===== FILE MANAGEMENT ===== filebrowser: image: hurlenko/filebrowser:latest container_name: filebrowser profiles: ["utilities", "all"] user: "${PUID}:${PGID}" ports: - "6633:8080" volumes: - ./filebrowser/data:/data - ./filebrowser/config:/config - /home/jamie:/data/home - ${DATA_ROOT}:/data/media environment: - FB_BASEURL=/filebrowser restart: unless-stopped healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 # ===== SYNCHRONIZATION ===== syncthing: image: syncthing/syncthing:latest container_name: syncthing hostname: syncthing profiles: ["utilities", "all"] environment: - PUID=${PUID} - PGID=${PGID} - TZ=${TZ} volumes: - ${DOCKER_CONFIG_ROOT}/syncthing:/var/syncthing - ${DOCKER_CONFIG_ROOT}/obsidian/vaults:/var/syncthing/obsidian ports: - "8384:8384" # Web UI - "22000:22000/tcp" # TCP file transfers - "22000:22000/udp" # QUIC file transfers - "21027:21027/udp" # Receive local discovery broadcasts restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8384/rest/system/ping"] interval: 30s timeout: 10s retries: 3 # ===== PRODUCTIVITY ===== obsidian: image: ghcr.io/sytone/obsidian-remote:latest container_name: obsidian-remote profiles: ["utilities", "all"] restart: unless-stopped ports: - "8181:8080" - "8443:8443" volumes: - ${DOCKER_CONFIG_ROOT}/obsidian/vaults:/vaults - ${DOCKER_CONFIG_ROOT}/obsidian/config:/config environment: - PUID=${PUID} - PGID=${PGID} - TZ=${TZ} - DOCKER_MODS=linuxserver/mods:universal-git depends_on: - syncthing stirling-pdf: container_name: stirling-pdf image: docker.stirlingpdf.com/stirlingtools/stirling-pdf:latest profiles: ["utilities", "all"] deploy: resources: limits: memory: 4G healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP' && curl -fL http://localhost:8080/ | grep -qv 'Please sign in'"] interval: 30s timeout: 10s retries: 5 ports: - "8090:8080" volumes: - ./stirling/latest/data:/usr/share/tessdata:rw - ./stirling/latest/config:/configs:rw - ./stirling/latest/logs:/logs:rw environment: - DISABLE_ADDITIONAL_FEATURES=true - SECURITY_ENABLELOGIN=false - LANGS=en_GB,en_US,ar_AR,de_DE,fr_FR,es_ES,zh_CN,zh_TW,ca_CA,it_IT,sv_SE,pl_PL,ro_RO,ko_KR,pt_BR,ru_RU,el_GR,hi_IN,hu_HU,tr_TR,id_ID - SYSTEM_DEFAULTLOCALE=en-US - UI_APPNAME=Stirling-PDF - UI_HOMEDESCRIPTION=Stirling-PDF - UI_APPNAMENAVBAR=Stirling-PDF - SYSTEM_MAXFILESIZE=100 - METRICS_ENABLED=true - SYSTEM_GOOGLEVISIBILITY=true - SHOW_SURVEY=true restart: unless-stopped # ===== REMOTE ACCESS ===== hbbr: container_name: hbbr image: rustdesk/rustdesk-server:latest profiles: ["remote", "all"] command: hbbr environment: - PUID=${PUID} - PGID=${PGID} volumes: - ${DOCKER_CONFIG_ROOT}/rustdesk/data:/root network_mode: "host" restart: unless-stopped hbbs: container_name: hbbs image: rustdesk/rustdesk-server:latest profiles: ["remote", "all"] command: hbbs environment: - PUID=${PUID} - PGID=${PGID} volumes: - ${DOCKER_CONFIG_ROOT}/rustdesk/data:/root network_mode: "host" depends_on: - hbbr restart: unless-stopped # ===== GENEALOGY ===== grampsweb: container_name: gramps image: ghcr.io/gramps-project/grampsweb:latest profiles: ["genealogy", "all"] restart: unless-stopped ports: - "5511:5000" environment: - GRAMPSWEB_TREE=Gramps Web - GRAMPSWEB_CELERY_CONFIG__broker_url=redis://grampsweb_redis:6379/0 - GRAMPSWEB_CELERY_CONFIG__result_backend=redis://grampsweb_redis:6379/0 - GRAMPSWEB_RATELIMIT_STORAGE_URI=redis://grampsweb_redis:6379/1 depends_on: - grampsweb_redis volumes: - ${DOCKER_CONFIG_ROOT}/gramps/gramps_users:/app/users - ${DOCKER_CONFIG_ROOT}/gramps/gramps_index:/app/indexdir - ${DOCKER_CONFIG_ROOT}/gramps/gramps_thumb_cache:/app/thumbnail_cache - ${DOCKER_CONFIG_ROOT}/gramps/gramps_cache:/app/cache - ${DOCKER_CONFIG_ROOT}/gramps/gramps_secret:/app/secret - ${DOCKER_CONFIG_ROOT}/gramps/gramps_db:/root/.gramps/grampsdb - ${DOCKER_CONFIG_ROOT}/gramps/gramps_media:/app/media - ${DOCKER_CONFIG_ROOT}/gramps/gramps_tmp:/tmp grampsweb_celery: container_name: grampsweb_celery image: ghcr.io/gramps-project/grampsweb:latest profiles: ["genealogy", "all"] restart: unless-stopped environment: - GRAMPSWEB_TREE=Gramps Web - GRAMPSWEB_CELERY_CONFIG__broker_url=redis://grampsweb_redis:6379/0 - GRAMPSWEB_CELERY_CONFIG__result_backend=redis://grampsweb_redis:6379/0 - GRAMPSWEB_RATELIMIT_STORAGE_URI=redis://grampsweb_redis:6379/1 depends_on: - grampsweb_redis volumes: - ${DOCKER_CONFIG_ROOT}/gramps/gramps_users:/app/users - ${DOCKER_CONFIG_ROOT}/gramps/gramps_index:/app/indexdir - ${DOCKER_CONFIG_ROOT}/gramps/gramps_thumb_cache:/app/thumbnail_cache - ${DOCKER_CONFIG_ROOT}/gramps/gramps_cache:/app/cache - ${DOCKER_CONFIG_ROOT}/gramps/gramps_secret:/app/secret - ${DOCKER_CONFIG_ROOT}/gramps/gramps_db:/root/.gramps/grampsdb - ${DOCKER_CONFIG_ROOT}/gramps/gramps_media:/app/media - ${DOCKER_CONFIG_ROOT}/gramps/gramps_tmp:/tmp command: celery -A gramps_webapi.celery worker --loglevel=INFO --concurrency=2 grampsweb_redis: image: redis:7.2.4-alpine container_name: grampsweb_redis profiles: ["genealogy", "all"] restart: unless-stopped volumes: - grampsweb_redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 10s retries: 3 # ===== API SERVICES ===== racknerd-api-converter: build: ./racknerd-converter container_name: racknerd-api-converter profiles: ["utilities", "all"] ports: - "5000:5000" environment: - RACKNERD_API_KEY=${RACKNERD_API_KEY} - RACKNERD_API_HASH=${RACKNERD_API_HASH} - RACKNERD_VSERVER_ID=${RACKNERD_VSERVER_ID} - RACKNERD_BASE_URL=${RACKNERD_BASE_URL} - UPDATE_INTERVAL=${RACKNERD_UPDATE_INTERVAL} - HOST=0.0.0.0 - PORT=5000 restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s logging: driver: json-file options: max-size: "10m" max-file: "3" # ===== MISC SERVICES ===== newt: image: fosrl/newt:latest container_name: newt profiles: ["utilities", "all"] restart: unless-stopped environment: - PANGOLIN_ENDPOINT=${PANGOLIN_URL} - NEWT_ID=${NEWT_ID} - NEWT_SECRET=${NEWT_SECRET} volumes: grampsweb_redis_data: driver: local