Files
TSYSDevStack/SupportStack/demo/docker-compose.yml.template
TSYSDevStack Team 534c486aea fix: resolve health check issues and update service configurations
- Fix MailHog health check: replace --no-verbose with -q and --tries with BusyBox-compatible options
- Fix InfluxDB health check: replace wget with curl (wget not available in container)
- Fix Pi-hole health check: replace wget with curl and remove user directive (requires root)
- Update Docker image versions with specific stable tags:
  * InfluxDB: 2.7.10
  * Wakapi: v2.7.1
  * ArchiveBox: v0.7.3
  * TubeArchivist: v0.5.8 (correct repository bbilly1/tubearchivist)
- Update README.md service table with correct ports and IP addresses
- Add MailHog configuration variables to demo.env
- Update demo-stack.sh status display to include Wakapi and MailHog URLs
- All services now showing as healthy in Homepage dashboard
2025-11-14 00:49:39 -05:00

450 lines
14 KiB
Plaintext

---
# =============================================================================
# This template uses environment variables for dynamic configuration
# Generate docker-compose.yml with: envsubst < docker-compose.yml.template > docker-compose.yml
# =============================================================================
services:
# =============================================================================
# INFRASTRUCTURE SERVICES
# =============================================================================
homepage:
image: ghcr.io/gethomepage/homepage:v0.9.13
user: "${APP_UID}:${APP_GID}"
container_name: "${COMPOSE_PROJECT_NAME}-homepage"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- "${COMPOSE_PROJECT_NAME}_homepage_config:/app/config"
- "${COMPOSE_PROJECT_NAME}_homepage_images:/app/public/images"
ports:
- "${HOMEPAGE_PORT}:3000"
environment:
- PUID=${APP_UID}
- PGID=${APP_GID}
- TZ=UTC
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=admin
labels:
com.docker.compose.project: "tsysdevstack-supportstack-demo"
docker-socket-proxy:
image: tecnativa/docker-socket-proxy:0.3.0
container_name: "${COMPOSE_PROJECT_NAME}-docker-socket-proxy"
group_add:
- "${DOCKER_GID}"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- CONTAINERS=1
- POST=0
- PUT=0
- DELETE=0
- BUILD=0
- COMMIT=0
- CONFIGS=0
- EXEC=0
- IMAGES=1
- INFO=1
- NETWORKS=1
- PLUGINS=1
- SECRETS=0
- SERVICES=1
- SESSION=1
- SWARM=0
- SYSTEM=1
- TASKS=1
- VOLUMES=1
labels:
com.docker.compose.project: "tsysdevstack-supportstack-demo"
pihole:
image: pihole/pihole:2024.07.0
container_name: "${COMPOSE_PROJECT_NAME}-pihole"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- "${COMPOSE_PROJECT_NAME}_pihole_etc:/etc/pihole"
- "${COMPOSE_PROJECT_NAME}_pihole_dnsmasq:/etc/dnsmasq.d"
ports:
- "${PIHOLE_PORT}:80"
- "53:53/tcp"
- "53:53/udp"
- "67:67/udp"
environment:
- PUID=${APP_UID}
- PGID=${APP_GID}
- TZ=UTC
- WEBPASSWORD=demo_password
- PIHOLE_DNS_=1.1.1.1;1.0.0.1;8.8.8.8
- WEBTHEME=light-darker
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/admin"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
labels:
homepage.group: "Infrastructure"
homepage.name: "Pi-hole"
homepage.icon: "pihole.png"
homepage.href: "http://192.168.3.6:${PIHOLE_PORT}/admin"
homepage.description: "DNS-based ad blocking and network monitoring"
portainer:
image: portainer/portainer-ce:2.21.4
user: "${APP_UID}:${APP_GID}"
container_name: "${COMPOSE_PROJECT_NAME}-portainer"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- "${COMPOSE_PROJECT_NAME}_portainer_data:/data"
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- "${PORTAINER_PORT}:9000"
environment:
- PUID=${APP_UID}
- PGID=${APP_GID}
labels:
homepage.group: "Infrastructure"
homepage.name: "Portainer"
homepage.icon: "portainer.png"
homepage.href: "http://192.168.3.6:${PORTAINER_PORT}"
homepage.description: "Web-based Docker container management"
# =============================================================================
# MONITORING & OBSERVABILITY
# =============================================================================
influxdb:
image: influxdb:2.7.10
container_name: "${COMPOSE_PROJECT_NAME}-influxdb"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- "${COMPOSE_PROJECT_NAME}_influxdb_data:/var/lib/influxdb"
ports:
- "${INFLUXDB_PORT}:8086"
environment:
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=demo_user
- DOCKER_INFLUXDB_INIT_PASSWORD=demo_password
- DOCKER_INFLUXDB_INIT_ORG=demo_org
- DOCKER_INFLUXDB_INIT_BUCKET=demo_bucket
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=demo_token
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=demo_token
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8086/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
labels:
homepage.group: "Monitoring"
homepage.name: "InfluxDB"
homepage.icon: "influxdb.png"
homepage.href: "http://192.168.3.6:${INFLUXDB_PORT}"
homepage.description: "Time series database for metrics"
grafana:
image: grafana/grafana:10.4.2
user: "${APP_UID}:${APP_GID}"
container_name: "${COMPOSE_PROJECT_NAME}-grafana"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- "${COMPOSE_PROJECT_NAME}_grafana_data:/var/lib/grafana"
ports:
- "${GRAFANA_PORT}:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=demo_password
- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource
- GF_INSTALL_PLUGINS=grafana-influxdb-flux-datasource
labels:
homepage.group: "Monitoring"
homepage.name: "Grafana"
homepage.icon: "grafana.png"
homepage.href: "http://192.168.3.6:${GRAFANA_PORT}"
homepage.description: "Analytics and visualization platform"
# =============================================================================
# DOCUMENTATION & DIAGRAMMING
# =============================================================================
drawio:
image: jgraph/drawio:24.7.17
user: "${APP_UID}:${APP_GID}"
container_name: "${COMPOSE_PROJECT_NAME}-drawio"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
ports:
- "${DRAWIO_PORT}:8080"
environment:
- PUID=${APP_UID}
- PGID=${APP_GID}
labels:
homepage.group: "Documentation"
homepage.name: "Draw.io"
homepage.icon: "drawio.png"
homepage.href: "http://192.168.3.6:${DRAWIO_PORT}"
homepage.description: "Web-based diagramming application"
kroki:
image: yuzutech/kroki:0.25.0
user: "${APP_UID}:${APP_GID}"
container_name: "${COMPOSE_PROJECT_NAME}-kroki"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
ports:
- "${KROKI_PORT}:8000"
environment:
- KROKI_SAFE_MODE=secure
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
labels:
homepage.group: "Documentation"
homepage.name: "Kroki"
homepage.icon: "kroki.png"
homepage.href: "http://192.168.3.6:${KROKI_PORT}"
homepage.description: "Diagrams as a service"
# =============================================================================
# DEVELOPER TOOLS
# =============================================================================
atomic-tracker:
image: ghcr.io/majorpeter/atomic-tracker:v1.2.0
user: "${APP_UID}:${APP_GID}"
container_name: "${COMPOSE_PROJECT_NAME}-atomic-tracker"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- "${COMPOSE_PROJECT_NAME}_atomic_tracker_config:/config"
ports:
- "${ATOMIC_TRACKER_PORT}:8080"
environment:
- CONFIG_DIR=/config
- LISTENING_PORT=8080
- BYPASS_LOGIN=1
- USE_DUMMY_DATA=1
labels:
homepage.group: "Developer Tools"
homepage.name: "Atomic Tracker"
homepage.icon: "atomic-tracker.png"
homepage.href: "http://192.168.3.6:${ATOMIC_TRACKER_PORT}"
homepage.description: "Habit tracking and personal dashboard"
wakapi:
image: ghcr.io/muety/wakapi:v2.7.1
user: "${APP_UID}:${APP_GID}"
container_name: "${COMPOSE_PROJECT_NAME}-wakapi"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- "${COMPOSE_PROJECT_NAME}_wakapi_data:/data"
ports:
- "${WAKAPI_PORT}:3000"
environment:
- WAKAPI_DB_TYPE=sqlite3
- WAKAPI_DB_PATH=/data/wakapi.db
- WAKAPI_PASSWORD_SALT=demo_salt_only
- WAKAPI_INSECURE_COOKIES=true
- WAKAPI_ENVIRONMENT=production
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
labels:
homepage.group: "Developer Tools"
homepage.name: "Wakapi"
homepage.icon: "wakapi.png"
homepage.href: "http://192.168.3.6:${WAKAPI_PORT}"
homepage.description: "Open-source WakaTime alternative for time tracking"
mailhog:
image: mailhog/mailhog:v1.0.0
container_name: "${COMPOSE_PROJECT_NAME}-mailhog"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
ports:
- "${MAILHOG_SMTP_PORT}:1025"
- "${MAILHOG_WEB_PORT}:8025"
environment:
- PUID=${APP_UID}
- PGID=${APP_GID}
- MH_SMTP_BIND_ADDR=0.0.0.0:1025
- MH_UI_BIND_ADDR=0.0.0.0:8025
- MH_STORAGE=memory
healthcheck:
test: ["CMD", "wget", "-q", "-s", "http://localhost:8025"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
labels:
homepage.group: "Developer Tools"
homepage.name: "MailHog"
homepage.icon: "mailhog.png"
homepage.href: "http://192.168.3.6:${MAILHOG_WEB_PORT}"
homepage.description: "Web and API based SMTP testing tool"
# =============================================================================
# ARCHIVAL & CONTENT MANAGEMENT
# =============================================================================
archivebox:
image: archivebox/archivebox:v0.7.3
container_name: "${COMPOSE_PROJECT_NAME}-archivebox"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- "${COMPOSE_PROJECT_NAME}_archivebox_data:/data"
ports:
- "${ARCHIVEBOX_PORT}:8000"
environment:
- PUID=${APP_UID}
- PGID=${APP_GID}
- TZ=UTC
labels:
homepage.group: "Archival"
homepage.name: "ArchiveBox"
homepage.icon: "archivebox.png"
homepage.href: "http://192.168.3.6:${ARCHIVEBOX_PORT}"
homepage.description: "Self-hosted internet archiving solution"
tube-archivist:
image: bbilly1/tubearchivist:v0.5.8
container_name: "${COMPOSE_PROJECT_NAME}-tube-archivist"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- "${COMPOSE_PROJECT_NAME}_tube_archivist_media:/youtube"
- "${COMPOSE_PROJECT_NAME}_tube_archivist_data:/cache"
ports:
- "${TUBE_ARCHIVIST_PORT}:8000"
environment:
- PUID=${APP_UID}
- PGID=${APP_GID}
- TZ=UTC
- ELASTICSEARCH_URL=http://elasticsearch:9200
- REDIS_URL=redis://redis:6379
- TA_USERNAME=tubearchivist
- TA_PASSWORD=tubearchivist
- TA_HOST=http://192.168.3.6:${TUBE_ARCHIVIST_PORT}
- ELASTIC_PASSWORD=changeme
- TA_ENABLE_AUTH_PROXY=false
- HOST_UID=${APP_UID}
- HOST_GID=${APP_GID}
depends_on:
- elasticsearch
- redis
labels:
homepage.group: "Archival"
homepage.name: "Tube Archivist"
homepage.icon: "tube-archivist.png"
homepage.href: "http://192.168.3.6:${TUBE_ARCHIVIST_PORT}"
homepage.description: "YouTube media archiving and management"
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
user: "${APP_UID}:${APP_GID}"
container_name: "${COMPOSE_PROJECT_NAME}-elasticsearch"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- "${COMPOSE_PROJECT_NAME}_elasticsearch_data:/usr/share/elasticsearch/data"
environment:
- PUID=${APP_UID}
- PGID=${APP_GID}
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- ELASTIC_PASSWORD=changeme
labels:
com.docker.compose.project: "tsysdevstack-supportstack-demo"
redis:
image: redis:7.2-alpine
user: "${APP_UID}:${APP_GID}"
container_name: "${COMPOSE_PROJECT_NAME}-redis"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
volumes:
- "${COMPOSE_PROJECT_NAME}_redis_data:/data"
environment:
- PUID=${APP_UID}
- PGID=${APP_GID}
labels:
com.docker.compose.project: "tsysdevstack-supportstack-demo"
# =============================================================================
# NETWORKS
# =============================================================================
networks:
${COMPOSE_NETWORK_NAME}:
driver: bridge
name: ${COMPOSE_NETWORK_NAME}
# =============================================================================
# VOLUMES
# =============================================================================
volumes:
${COMPOSE_PROJECT_NAME}_homepage_config:
driver: local
${COMPOSE_PROJECT_NAME}_homepage_images:
driver: local
${COMPOSE_PROJECT_NAME}_pihole_etc:
driver: local
${COMPOSE_PROJECT_NAME}_pihole_dnsmasq:
driver: local
${COMPOSE_PROJECT_NAME}_portainer_data:
driver: local
${COMPOSE_PROJECT_NAME}_influxdb_data:
driver: local
${COMPOSE_PROJECT_NAME}_grafana_data:
driver: local
${COMPOSE_PROJECT_NAME}_atomic_tracker_config:
driver: local
${COMPOSE_PROJECT_NAME}_wakapi_data:
driver: local
${COMPOSE_PROJECT_NAME}_mailhog_data:
driver: local
${COMPOSE_PROJECT_NAME}_archivebox_data:
driver: local
${COMPOSE_PROJECT_NAME}_tube_archivist_media:
driver: local
${COMPOSE_PROJECT_NAME}_tube_archivist_data:
driver: local
${COMPOSE_PROJECT_NAME}_elasticsearch_data:
driver: local
${COMPOSE_PROJECT_NAME}_redis_data:
driver: local