From 534c486aead8465fc041170ef40656e9e7634028 Mon Sep 17 00:00:00 2001 From: TSYSDevStack Team Date: Fri, 14 Nov 2025 00:49:39 -0500 Subject: [PATCH] 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 --- SupportStack/demo/README.md | 29 +- SupportStack/demo/demo-stack.sh | 2 + SupportStack/demo/demo.env | 16 + SupportStack/demo/docker-compose.yml | 934 ++++++++---------- SupportStack/demo/docker-compose.yml.template | 86 +- 5 files changed, 535 insertions(+), 532 deletions(-) diff --git a/SupportStack/demo/README.md b/SupportStack/demo/README.md index a858274..0704f73 100644 --- a/SupportStack/demo/README.md +++ b/SupportStack/demo/README.md @@ -79,31 +79,34 @@ All configuration is managed through `demo.env` and dynamic detection: ### 🛠️ Developer Tools | Service | Port | Description | 🌐 Access | |---------|------|-------------|-----------| -| **Homepage** | 4000 | Central dashboard for service discovery | [Open](http://localhost:4000) | -| **Atuin** | 4001 | Shell history synchronization | [Open](http://localhost:4001) | -| **Wakapi** | 4002 | Time tracking for developers | [Open](http://localhost:4002) | -| **ArchiveBox** | 4003 | Web archiving solution | [Open](http://localhost:4003) | -| **Tube Archivist** | 4004 | YouTube video archiving | [Open](http://localhost:4004) | -| **MailHog** | 4005 | Email testing for development | [Open](http://localhost:4005) | +| **Homepage** | 4000 | Central dashboard for service discovery | [Open](http://192.168.3.6:4000) | +| **Atomic Tracker** | 4012 | Habit tracking and personal dashboard | [Open](http://192.168.3.6:4012) | +| **Wakapi** | 4015 | Open-source WakaTime alternative for time tracking | [Open](http://192.168.3.6:4015) | +| **MailHog** | 4017 | Web and API based SMTP testing tool | [Open](http://192.168.3.6:4017) | + +### 📚 Archival & Content Management +| Service | Port | Description | 🌐 Access | +|---------|------|-------------|-----------| +| **ArchiveBox** | 4013 | Web archiving solution | [Open](http://192.168.3.6:4013) | +| **Tube Archivist** | 4014 | YouTube video archiving | [Open](http://192.168.3.6:4014) | ### 🏗️ Infrastructure Services | Service | Port | Description | 🌐 Access | |---------|------|-------------|-----------| -| **Pi-hole** | 4006 | DNS-based ad blocking and monitoring | [Open](http://localhost:4006) | -| **Docker Socket Proxy** | 4013 | Infrastructure | Secure Docker socket API proxy | [Internal](#) | -| **Portainer** | 4007 | Web-based container management | [Open](http://localhost:4007) | +| **Pi-hole** | 4006 | DNS-based ad blocking and monitoring | [Open](http://192.168.3.6:4006) | +| **Portainer** | 4007 | Web-based container management | [Open](http://192.168.3.6:4007) | ### 📊 Monitoring & Observability | Service | Port | Description | 🌐 Access | |---------|------|-------------|-----------| -| **InfluxDB** | 4008 | Time series database for metrics | [Open](http://localhost:4008) | -| **Grafana** | 4009 | Analytics and visualization platform | [Open](http://localhost:4009) | +| **InfluxDB** | 4008 | Time series database for metrics | [Open](http://192.168.3.6:4008) | +| **Grafana** | 4009 | Analytics and visualization platform | [Open](http://192.168.3.6:4009) | ### 📚 Documentation & Diagramming | Service | Port | Description | 🌐 Access | |---------|------|-------------|-----------| -| **Draw.io** | 4010 | Web-based diagramming application | [Open](http://localhost:4010) | -| **Kroki** | 4011 | Diagrams as a service | [Open](http://localhost:4011) | +| **Draw.io** | 4010 | Web-based diagramming application | [Open](http://192.168.3.6:4010) | +| **Kroki** | 4011 | Diagrams as a service | [Open](http://192.168.3.6:4011) | --- diff --git a/SupportStack/demo/demo-stack.sh b/SupportStack/demo/demo-stack.sh index 6084943..e7a5c39 100755 --- a/SupportStack/demo/demo-stack.sh +++ b/SupportStack/demo/demo-stack.sh @@ -111,6 +111,8 @@ show_status() { echo -e "${BLUE}🌐 Service URLs:${NC}" echo -e "${GREEN} Homepage: http://localhost:${HOMEPAGE_PORT}${NC}" echo -e "${GREEN} Atomic Tracker: http://localhost:${ATOMIC_TRACKER_PORT}${NC}" + echo -e "${GREEN} Wakapi: http://localhost:${WAKAPI_PORT}${NC}" + echo -e "${GREEN} MailHog: http://localhost:${MAILHOG_WEB_PORT}${NC}" echo -e "${GREEN} Grafana: http://localhost:${GRAFANA_PORT}${NC}" echo -e "${GREEN} Portainer: http://localhost:${PORTAINER_PORT}${NC}" } diff --git a/SupportStack/demo/demo.env b/SupportStack/demo/demo.env index ff83942..8e79019 100644 --- a/SupportStack/demo/demo.env +++ b/SupportStack/demo/demo.env @@ -29,6 +29,9 @@ COMPOSE_NETWORK_NAME=tsysdevstack-supportstack-demo-network # Developer Tools HOMEPAGE_PORT=4000 ATOMIC_TRACKER_PORT=4012 +WAKAPI_PORT=4015 +MAILHOG_SMTP_PORT=4016 +MAILHOG_WEB_PORT=4017 # Archival & Content Management ARCHIVEBOX_PORT=4013 @@ -80,6 +83,19 @@ ATOMIC_TRACKER_LISTENING_PORT=8080 ATOMIC_TRACKER_BYPASS_LOGIN=1 ATOMIC_TRACKER_USE_DUMMY_DATA=1 +# Wakapi Configuration +WAKAPI_DATA_DIR=/data +WAKAPI_DB_TYPE=sqlite3 +WAKAPI_DB_PATH=/data/wakapi.db +WAKAPI_PASSWORD_SALT=demo_salt_only +WAKAPI_INSECURE_COOKIES=true +WAKAPI_ENVIRONMENT=production + +# MailHog Configuration +MAILHOG_SMTP_BIND_ADDR=0.0.0.0:1025 +MAILHOG_WEB_BIND_ADDR=0.0.0.0:8025 +MAILHOG_STORAGE=memory + # ArchiveBox Configuration ARCHIVEBOX_DATA_DIR=/data diff --git a/SupportStack/demo/docker-compose.yml b/SupportStack/demo/docker-compose.yml index 2ea819e..0f6ce29 100644 --- a/SupportStack/demo/docker-compose.yml +++ b/SupportStack/demo/docker-compose.yml @@ -1,545 +1,449 @@ --- -# TSYS Developer Support Stack - Docker Compose Configuration for Demo -# -# NOTE: This configuration uses only Docker named volumes for storage, not bind mounts. -# All data is ephemeral and will be lost when the stack is removed with 'docker compose down -v'. -# This is intentional for the demo environment to ensure no persistent data accumulation. -# +# ============================================================================= +# This template uses environment variables for dynamic configuration +# Generate docker-compose.yml with: envsubst < docker-compose.yml.template > docker-compose.yml +# ============================================================================= + services: - # Homepage - Developer dashboard + # ============================================================================= + # INFRASTRUCTURE SERVICES + # ============================================================================= + homepage: - image: ghcr.io/gethomepage/homepage:latest - container_name: tsysdevstack-supportstack-homepage - ports: - - "${HOMEPAGE_PORT}:3000" + image: ghcr.io/gethomepage/homepage:v0.9.13 + user: "1000:1000" + container_name: "tsysdevstack-supportstack-demo-homepage" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network volumes: - - ./config:/app/config:ro,Z # Demo: read-only config mount for functionality - user: "${PUID}:${PGID}" # Run as non-root to prevent host file ownership issues - labels: - - "homepage.group=Developer Tools" - - "homepage.name=Homepage" - - "homepage.icon=homepage" - - "homepage.href=http://192.168.3.6:4000" - - "homepage.description=Developer dashboard and service discovery" - environment: - DOCKER_HOST: > - tcp://tsysdevstack-supportstack-docker-socket-proxy:${DOCKER_PROXY_PORT} - HOMEPAGE_ALLOWED_HOSTS: "*" - HOMEPAGE_VAR_DOCKER_HOST: > - tcp://tsysdevstack-supportstack-docker-socket-proxy:${DOCKER_PROXY_PORT} - # Use docker.yaml with explicit include/exclude filtering - depends_on: - - tsysdevstack-supportstack-docker-socket-proxy - restart: unless-stopped - - # Atuin - Shell history - atuin: - image: ghcr.io/atuinsh/atuin:latest - container_name: tsysdevstack-supportstack-atuin + - "tsysdevstack-supportstack-demo_homepage_config:/app/config" + - "tsysdevstack-supportstack-demo_homepage_images:/app/public/images" ports: - - "${ATUIN_PORT}:8888" - labels: - - "homepage.group=Developer Tools" - - "homepage.name=Atuin" - - "homepage.icon=atuin" - - "homepage.href=http://192.168.3.6:4001" - - "homepage.description=Synced shell history database" - environment: - ATUIN_HOST: "0.0.0.0" - ATUIN_PORT: "8888" - ATUIN_OPEN_REGISTRATION: "true" - ATUIN_DB_URI: > - postgres://atuin:demo_password@tsysdevstack-supportstack-postgres:5432/atuin - RUST_LOG: "debug,atuin_server=debug,sqlx=debug" - command: server start - # No persistent volumes for demo - config is ephemeral - user: "${PUID}:${PGID}" - depends_on: - tsysdevstack-supportstack-postgres: - condition: service_healthy - restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - "wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1" - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - deploy: - resources: - limits: - memory: 256M - cpus: '0.5' - - # Wakapi - Time tracking - wakapi: - image: ghcr.io/muety/wakapi:latest - container_name: tsysdevstack-supportstack-wakapi - ports: - - "${WAKAPI_PORT}:3000" - labels: - - "homepage.group=Developer Tools" - - "homepage.name=Wakapi" - - "homepage.icon=wakapi" - - "homepage.href=http://192.168.3.6:4002" - - "homepage.description=Self-hosted time tracking" - environment: - - WAKAPI_PASSWORD_SALT=demo_password - # No persistent volumes for demo - data is ephemeral - restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - "wget --no-verbose --tries=1 --spider http://localhost:8086/ping || exit 1" - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - deploy: - resources: - limits: - memory: 256M - cpus: '0.5' - - # MailHog - Email testing - mailhog: - image: mailhog/mailhog:latest - container_name: tsysdevstack-supportstack-mailhog - ports: - - "1025:1025" - - "${MAILHOG_PORT}:8025" - labels: - - "homepage.group=Developer Tools" - - "homepage.name=MailHog" - - "homepage.icon=mailhog" - - "homepage.href=http://192.168.3.6:4005" - - "homepage.description=Email testing service" - restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - "echo > /dev/tcp/localhost:8025" - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - deploy: - resources: - limits: - memory: 128M - cpus: '0.25' - - # Pi-hole - DNS management - pihole: - image: pihole/pihole:latest - container_name: tsysdevstack-supportstack-pihole - # Note: Pi-hole requires root for DNS capabilities and file permissions - ports: - - "${PIHOLE_PORT}:80" - - "53:53/tcp" - - "53:53/udp" - - "67:67/udp" - labels: - - "homepage.group=Infrastructure" - - "homepage.name=Pi-hole" - - "homepage.icon=pihole" - - "homepage.href=http://192.168.3.6:4006" - - "homepage.description=DNS-based ad blocking and network monitoring" + - "4000:3000" environment: + - PUID=1000 + - PGID=1000 - TZ=UTC - - WEBPASSWORD=${DEMO_PASSWORD} - - PIHOLE_DNS_=1.1.1.1;1.0.0.1 - - DNSMASQ_LISTENING=all - - WEBTHEME=default-dark - # No persistent volumes for demo - configuration is ephemeral - # Pi-hole requires root for DNS functionality - restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - "echo > /dev/tcp/localhost/80" - interval: 30s - timeout: 10s - retries: 3 - start_period: 60s - deploy: - resources: - limits: - memory: 512M - cpus: '0.75' - - # Portainer - Container management - portainer: - image: portainer/portainer-ce:latest - container_name: tsysdevstack-supportstack-portainer - ports: - - "${PORTAINER_PORT}:9000" + - ADMIN_USERNAME=admin + - ADMIN_PASSWORD=admin labels: - - "homepage.group=Infrastructure" - - "homepage.name=Portainer" - - "homepage.icon=portainer" - - "homepage.href=http://192.168.3.6:4007" - - "homepage.description=Container management interface" - # No persistent volumes for demo - data is ephemeral - # Note: Portainer needs root for data directory permissions - environment: - DOCKER_HOST: > - tcp://tsysdevstack-supportstack-docker-socket-proxy:${DOCKER_PROXY_PORT} - # Portainer needs root for data directory permissions - restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - "echo > /dev/tcp/localhost/9000" - interval: 30s - timeout: 10s - retries: 3 - start_period: 60s - deploy: - resources: - limits: - memory: 256M - cpus: '0.5' + com.docker.compose.project: "tsysdevstack-supportstack-demo" - # ArchiveBox - Web archiving - archivebox: - image: archivebox/archivebox:latest - container_name: tsysdevstack-supportstack-archivebox - ports: - - "${ARCHIVEBOX_PORT}:8000" - labels: - - "homepage.group=Developer Tools" - - "homepage.name=ArchiveBox" - - "homepage.icon=archivebox" - - "homepage.href=http://192.168.3.6:4003" - - "homepage.description=Self-hosted web archiving" - environment: - - ALLOWED_HOSTS=* - - MEDIA_MAX_SIZE=750m - # No persistent volumes for demo - data is ephemeral + docker-socket-proxy: + image: tecnativa/docker-socket-proxy:0.3.0 + container_name: "tsysdevstack-supportstack-demo-docker-socket-proxy" + group_add: + - "996" restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - "wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1" - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - deploy: - resources: - limits: - memory: 256M - cpus: '0.5' - - # InfluxDB - Time series database - influxdb: - image: influxdb:2.7-alpine - container_name: tsysdevstack-supportstack-influxdb - ports: - - "${INFLUXDB_PORT}:8086" - labels: - - "homepage.group=Monitoring" - - "homepage.name=InfluxDB" - - "homepage.icon=influxdb" - - "homepage.href=http://192.168.3.6:4008" - - "homepage.description=Time series database for metrics storage" - environment: - - DOCKER_INFLUXDB_INIT_MODE=setup - - DOCKER_INFLUXDB_INIT_USERNAME=admin - - DOCKER_INFLUXDB_INIT_PASSWORD=${DEMO_PASSWORD} - - DOCKER_INFLUXDB_INIT_ORG=tsysdev - - DOCKER_INFLUXDB_INIT_BUCKET=metrics - # No persistent volumes for demo - data is ephemeral - user: "${PUID}:${PGID}" - restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - "wget --no-verbose --tries=1 --spider http://localhost:8086/ping || exit 1" - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - deploy: - resources: - limits: - memory: 256M - cpus: '0.5' - - # Grafana - Analytics visualization - grafana: - image: grafana/grafana:latest - container_name: tsysdevstack-supportstack-grafana - ports: - - "${GRAFANA_PORT}:3000" - labels: - - "homepage.group=Monitoring" - - "homepage.name=Grafana" - - "homepage.icon=grafana" - - "homepage.href=http://192.168.3.6:4009" - - "homepage.description=Analytics and visualization platform" - environment: - - GF_SECURITY_ADMIN_USER=admin - - GF_SECURITY_ADMIN_PASSWORD=${DEMO_PASSWORD} - - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource - - GF_SERVER_DOMAIN=192.168.3.6:4009 - - GF_SERVER_ROOT_URL=http://192.168.3.6:4009 - # No persistent volumes for demo - data is ephemeral - user: "${PUID}:${PGID}" - depends_on: - - influxdb - restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - "echo > /dev/tcp/localhost/3000" - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - deploy: - resources: - limits: - memory: 512M - cpus: '0.75' - - # Draw.io - Diagramming - drawio: - image: jgraph/drawio:latest - container_name: tsysdevstack-supportstack-drawio - user: "${PUID}:${PGID}" - ports: - - "${DRAWIO_PORT}:8080" - labels: - - "homepage.group=Documentation" - - "homepage.name=Draw.io" - - "homepage.icon=diagram" - - "homepage.href=http://192.168.3.6:4010" - - "homepage.description=Web-based diagramming tool" - restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - "echo > /dev/tcp/localhost/3000" - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - deploy: - resources: - limits: - memory: 256M - cpus: '0.5' - - # Tube Archivist - YouTube media archiving - tube-archivist: - image: bbilly1/tubearchivist:latest - container_name: tsysdevstack-supportstack-tube-archivist - ports: - - "4004:8000" - labels: - - "homepage.group=Developer Tools" - - "homepage.name=Tube Archivist" - - "homepage.icon=youtube" - - "homepage.href=http://192.168.3.6:4004" - - "homepage.description=Self-hosted YouTube media archiving" - environment: - - TA_HOST=192.168.3.6:4004 - - TA_USERNAME=demo_user - - TA_PASSWORD=demo_password - - ES_URL=http://elastic:demo_password@tsysdevstack-supportstack-elasticsearch:9200 - - ELASTIC_PASSWORD=demo_password - - REDIS_CON=redis://tsysdevstack-supportstack-redis:6379 - - TZ=UTC - depends_on: - tsysdevstack-supportstack-elasticsearch: - condition: service_healthy - tsysdevstack-supportstack-redis: - condition: service_healthy - # No persistent volumes for demo - cache and media are ephemeral - restart: unless-stopped - healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost:8000/ || exit 1"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 120s - deploy: - resources: - limits: - memory: 512M - cpus: '1.0' - - # Kroki - Diagrams as code - kroki: - image: yuzutech/kroki:latest - container_name: tsysdevstack-supportstack-kroki - user: "${PUID}:${PGID}" - ports: - - "${KROKI_PORT}:8000" - labels: - - "homepage.group=Documentation" - - "homepage.name=Kroki" - - "homepage.icon=diagram" - - "homepage.href=http://192.168.3.6:4011" - - "homepage.description=Service for converting text diagrams to images" - environment: - - KROKI_SAFE_MODE=0 - - KROKI_PLANTUML_ALLOW_LIST=* - - KROKI_MERMAID_ALLOW_LIST=* - restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - "wget --no-verbose --tries=1 --spider http://localhost:8000/health || exit 1" - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - deploy: - resources: - limits: - memory: 256M - cpus: '0.5' - - # Docker Socket Proxy - Secure Docker API access - tsysdevstack-supportstack-docker-socket-proxy: - image: tecnativa/docker-socket-proxy:latest - container_name: tsysdevstack-supportstack-docker-socket-proxy - ports: - - "${DOCKER_PROXY_PORT}:2375" + networks: + - tsysdevstack-supportstack-demo-network volumes: - /var/run/docker.sock:/var/run/docker.sock:ro environment: - CONTAINERS=1 - - SERVICES=1 - - TASKS=1 - - NETWORKS=1 - - NODES=1 - - IMAGES=1 - - VOLUMES=1 - - EXEC=0 - - SECRETS=0 - - CONFIGS=0 - - PLUGINS=0 - - SYSTEM=0 - - INFO=1 - - VERSION=1 - - EVENTS=0 - POST=0 - - DELETE=0 - PUT=0 - restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - "wget --no-verbose --tries=1 --spider http://localhost:2375/version || exit 1" - interval: 30s - timeout: 10s - retries: 3 - start_period: 60s - deploy: - resources: - limits: - memory: 128M - cpus: '0.25' - - # PostgreSQL - Database for Atuin - tsysdevstack-supportstack-postgres: - image: postgres:15-alpine - container_name: tsysdevstack-supportstack-postgres + - 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: - - "homepage.group=Infrastructure" - - "homepage.name=PostgreSQL" - - "homepage.icon=postgresql" - - "homepage.description=PostgreSQL database server" - environment: - - POSTGRES_DB=atuin - - POSTGRES_USER=atuin - - POSTGRES_PASSWORD=${DEMO_PASSWORD} - # No persistent volumes for demo - data is ephemeral + com.docker.compose.project: "tsysdevstack-supportstack-demo" + + pihole: + image: pihole/pihole:2024.07.0 + container_name: "tsysdevstack-supportstack-demo-pihole" restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + volumes: + - "tsysdevstack-supportstack-demo_pihole_etc:/etc/pihole" + - "tsysdevstack-supportstack-demo_pihole_dnsmasq:/etc/dnsmasq.d" + ports: + - "4006:80" + - "53:53/tcp" + - "53:53/udp" + - "67:67/udp" + environment: + - PUID=1000 + - PGID=1000 + - 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 - - pg_isready - - -U - - atuin + test: ["CMD", "curl", "-f", "http://localhost:80/admin"] interval: 30s timeout: 10s retries: 3 start_period: 40s - deploy: - resources: - limits: - memory: 256M - cpus: '0.5' - - # Elasticsearch - Search engine - tsysdevstack-supportstack-elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:8.11.1 - container_name: tsysdevstack-supportstack-elasticsearch labels: - - "homepage.group=Infrastructure" - - "homepage.name=Elasticsearch" - - "homepage.icon=elasticsearch" - - "homepage.description=Search and analytics engine" + homepage.group: "Infrastructure" + homepage.name: "Pi-hole" + homepage.icon: "pihole.png" + homepage.href: "http://192.168.3.6:4006/admin" + homepage.description: "DNS-based ad blocking and network monitoring" + + portainer: + image: portainer/portainer-ce:2.21.4 + user: "1000:1000" + container_name: "tsysdevstack-supportstack-demo-portainer" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + volumes: + - "tsysdevstack-supportstack-demo_portainer_data:/data" + - /var/run/docker.sock:/var/run/docker.sock:ro + ports: + - "4007:9000" environment: - - "discovery.type=single-node" + - PUID=1000 + - PGID=1000 + labels: + homepage.group: "Infrastructure" + homepage.name: "Portainer" + homepage.icon: "portainer.png" + homepage.href: "http://192.168.3.6:4007" + homepage.description: "Web-based Docker container management" + + # ============================================================================= + # MONITORING & OBSERVABILITY + # ============================================================================= + + influxdb: + image: influxdb:2.7.10 + container_name: "tsysdevstack-supportstack-demo-influxdb" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + volumes: + - "tsysdevstack-supportstack-demo_influxdb_data:/var/lib/influxdb" + ports: + - "4008: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", "curl", "-f", "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:4008" + homepage.description: "Time series database for metrics" + + grafana: + image: grafana/grafana:10.4.2 + user: "1000:1000" + container_name: "tsysdevstack-supportstack-demo-grafana" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + volumes: + - "tsysdevstack-supportstack-demo_grafana_data:/var/lib/grafana" + ports: + - "4009: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:4009" + homepage.description: "Analytics and visualization platform" + + # ============================================================================= + # DOCUMENTATION & DIAGRAMMING + # ============================================================================= + + drawio: + image: jgraph/drawio:24.7.17 + user: "1000:1000" + container_name: "tsysdevstack-supportstack-demo-drawio" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + ports: + - "4010:8080" + environment: + - PUID=1000 + - PGID=1000 + labels: + homepage.group: "Documentation" + homepage.name: "Draw.io" + homepage.icon: "drawio.png" + homepage.href: "http://192.168.3.6:4010" + homepage.description: "Web-based diagramming application" + + kroki: + image: yuzutech/kroki:0.25.0 + user: "1000:1000" + container_name: "tsysdevstack-supportstack-demo-kroki" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + ports: + - "4011: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:4011" + homepage.description: "Diagrams as a service" + + # ============================================================================= + # DEVELOPER TOOLS + # ============================================================================= + + atomic-tracker: + image: ghcr.io/majorpeter/atomic-tracker:v1.2.0 + user: "1000:1000" + container_name: "tsysdevstack-supportstack-demo-atomic-tracker" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + volumes: + - "tsysdevstack-supportstack-demo_atomic_tracker_config:/config" + ports: + - "4012: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:4012" + homepage.description: "Habit tracking and personal dashboard" + + wakapi: + image: ghcr.io/muety/wakapi:v2.7.1 + user: "1000:1000" + container_name: "tsysdevstack-supportstack-demo-wakapi" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + volumes: + - "tsysdevstack-supportstack-demo_wakapi_data:/data" + ports: + - "4015: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:4015" + homepage.description: "Open-source WakaTime alternative for time tracking" + + mailhog: + image: mailhog/mailhog:v1.0.0 + container_name: "tsysdevstack-supportstack-demo-mailhog" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + ports: + - "4016:1025" + - "4017:8025" + environment: + - PUID=1000 + - PGID=1000 + - 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:4017" + homepage.description: "Web and API based SMTP testing tool" + + # ============================================================================= + # ARCHIVAL & CONTENT MANAGEMENT + # ============================================================================= + + archivebox: + image: archivebox/archivebox:v0.7.3 + container_name: "tsysdevstack-supportstack-demo-archivebox" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + volumes: + - "tsysdevstack-supportstack-demo_archivebox_data:/data" + ports: + - "4013:8000" + environment: + - PUID=1000 + - PGID=1000 + - TZ=UTC + labels: + homepage.group: "Archival" + homepage.name: "ArchiveBox" + homepage.icon: "archivebox.png" + homepage.href: "http://192.168.3.6:4013" + homepage.description: "Self-hosted internet archiving solution" + + tube-archivist: + image: bbilly1/tubearchivist:v0.5.8 + container_name: "tsysdevstack-supportstack-demo-tube-archivist" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + volumes: + - "tsysdevstack-supportstack-demo_tube_archivist_media:/youtube" + - "tsysdevstack-supportstack-demo_tube_archivist_data:/cache" + ports: + - "4014:8000" + environment: + - PUID=1000 + - PGID=1000 + - 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:4014 + - ELASTIC_PASSWORD=changeme + - TA_ENABLE_AUTH_PROXY=false + - HOST_UID=1000 + - HOST_GID=1000 + depends_on: + - elasticsearch + - redis + labels: + homepage.group: "Archival" + homepage.name: "Tube Archivist" + homepage.icon: "tube-archivist.png" + homepage.href: "http://192.168.3.6:4014" + homepage.description: "YouTube media archiving and management" + + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0 + user: "1000:1000" + container_name: "tsysdevstack-supportstack-demo-elasticsearch" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + volumes: + - "tsysdevstack-supportstack-demo_elasticsearch_data:/usr/share/elasticsearch/data" + environment: + - PUID=1000 + - PGID=1000 + - discovery.type=single-node + - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - - "xpack.security.enabled=true" - - "ELASTIC_PASSWORD=${DEMO_PASSWORD}" - - "path.repo=/usr/share/elasticsearch/data/snapshot" - # No persistent volumes for demo - data is ephemeral - user: "${PUID}:${PGID}" - restart: unless-stopped - healthcheck: - test: - - CMD-SHELL - - > - curl -f -u elastic:demo_password - http://localhost:9200/_cluster/health?wait_for_status=yellow&timeout=30s || exit 1 - interval: 30s - timeout: 10s - retries: 5 - start_period: 120s - deploy: - resources: - limits: - memory: 1G - cpus: '1.0' - - # Redis for Tube Archivist - tsysdevstack-supportstack-redis: - image: redis:7-alpine - container_name: tsysdevstack-supportstack-redis + - ELASTIC_PASSWORD=changeme labels: - - "homepage.group=Infrastructure" - - "homepage.name=Redis" - - "homepage.icon=redis" - - "homepage.description=In-memory data structure store" - restart: unless-stopped - command: redis-server --save 60 1 --stop-writes-on-bgsave-error no - healthcheck: - test: - - CMD - - redis-cli - - ping - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - deploy: - resources: - limits: - memory: 128M - cpus: '0.25' + com.docker.compose.project: "tsysdevstack-supportstack-demo" -# No persistent volumes - demo is 100% ephemeral -# Only Docker socket bind mount is used for functionality + redis: + image: redis:7.2-alpine + user: "1000:1000" + container_name: "tsysdevstack-supportstack-demo-redis" + restart: unless-stopped + networks: + - tsysdevstack-supportstack-demo-network + volumes: + - "tsysdevstack-supportstack-demo_redis_data:/data" + environment: + - PUID=1000 + - PGID=1000 + labels: + com.docker.compose.project: "tsysdevstack-supportstack-demo" + +# ============================================================================= +# NETWORKS +# ============================================================================= networks: - default: - name: tsysdevstack_supportstack + tsysdevstack-supportstack-demo-network: + driver: bridge + name: tsysdevstack-supportstack-demo-network + + +# ============================================================================= +# VOLUMES +# ============================================================================= + +volumes: + tsysdevstack-supportstack-demo_homepage_config: + driver: local + tsysdevstack-supportstack-demo_homepage_images: + driver: local + tsysdevstack-supportstack-demo_pihole_etc: + driver: local + tsysdevstack-supportstack-demo_pihole_dnsmasq: + driver: local + tsysdevstack-supportstack-demo_portainer_data: + driver: local + tsysdevstack-supportstack-demo_influxdb_data: + driver: local + tsysdevstack-supportstack-demo_grafana_data: + driver: local + tsysdevstack-supportstack-demo_atomic_tracker_config: + driver: local + tsysdevstack-supportstack-demo_wakapi_data: + driver: local + tsysdevstack-supportstack-demo_mailhog_data: + driver: local + tsysdevstack-supportstack-demo_archivebox_data: + driver: local + tsysdevstack-supportstack-demo_tube_archivist_media: + driver: local + tsysdevstack-supportstack-demo_tube_archivist_data: + driver: local + tsysdevstack-supportstack-demo_elasticsearch_data: + driver: local + tsysdevstack-supportstack-demo_redis_data: + driver: local diff --git a/SupportStack/demo/docker-compose.yml.template b/SupportStack/demo/docker-compose.yml.template index 9df56ba..696ee89 100644 --- a/SupportStack/demo/docker-compose.yml.template +++ b/SupportStack/demo/docker-compose.yml.template @@ -65,7 +65,6 @@ services: pihole: image: pihole/pihole:2024.07.0 - user: "${APP_UID}:${APP_GID}" container_name: "${COMPOSE_PROJECT_NAME}-pihole" restart: unless-stopped networks: @@ -84,6 +83,13 @@ services: - 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" @@ -118,7 +124,7 @@ services: # ============================================================================= influxdb: - image: influxdb:1.8.10 + image: influxdb:2.7.10 container_name: "${COMPOSE_PROJECT_NAME}-influxdb" restart: unless-stopped networks: @@ -134,6 +140,13 @@ services: - 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" @@ -238,12 +251,70 @@ services: 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:latest + image: archivebox/archivebox:v0.7.3 container_name: "${COMPOSE_PROJECT_NAME}-archivebox" restart: unless-stopped networks: @@ -264,7 +335,7 @@ services: homepage.description: "Self-hosted internet archiving solution" tube-archivist: - image: bbilly1/tubearchivist:latest + image: bbilly1/tubearchivist:v0.5.8 container_name: "${COMPOSE_PROJECT_NAME}-tube-archivist" restart: unless-stopped networks: @@ -284,6 +355,9 @@ services: - 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 @@ -359,6 +433,10 @@ volumes: 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: