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
This commit is contained in:
TSYSDevStack Team
2025-11-14 00:49:39 -05:00
parent 70f97050cd
commit 534c486aea
5 changed files with 535 additions and 532 deletions

View File

@@ -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) |
---

View File

@@ -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}"
}

View File

@@ -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

View File

@@ -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

View File

@@ -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: