Files
TSYSDevStack/SupportStack/demo/docker-compose.yml.template
TSYSDevStack Team 70f97050cd feat: Perfect Homepage Dashboard with Docker Socket Proxy Integration
## 🎯 Perfect Dashboard Achievement (7 services total)

###  **Infrastructure Services** (2)
- **Pi-hole** (4006): Network-wide ad blocking
- **Portainer** (4007): Container management interface

###  **Archival Services** (2)
- **ArchiveBox** (4013): Web archiving solution
- **Tube Archivist** (4014): YouTube video archiving

###  **Monitoring Services** (2)
- **Grafana** (4009): Metrics visualization
- **InfluxDB** (4008): Time-series database

###  **Developer Tools** (1)
- **Automatic Tracker** (4012): Development time tracking

###  **Documentation Services** (2)
- **Draw.io** (4010): Diagram creation
- **Kroki** (4011): Diagrams as a service

## 🔧 **Critical Fixes Applied**

### **Homepage Service Discovery**
-  Configured Homepage to use docker-socket-proxy for automatic service discovery
-  Replaced static configuration with dynamic Docker integration
-  All services now auto-discovered and displayed correctly

### **Service URL Corrections**
-  Fixed all `homepage.href` URLs from `localhost:PORT` to `192.168.3.6:PORT`
-  Proper external access from any machine on the network
-  Consistent IP addressing across all services

### **Dashboard Cleanup**
-  Removed Homepage self-link from appearing on its own dashboard
-  Removed default Developer, Social, and Entertainment bookmark columns
-  Hidden internal services (Docker Socket Proxy, Elasticsearch, Redis) from user view
-  Clean, professional dashboard showing only user-facing services

### **Service Configuration Resolution**
-  Fixed Pi-hole duplication caused by corrupted template
-  Restored missing services that were accidentally removed
-  Corrected Tube Archivist environment variables
-  All services now properly configured and accessible

## 📁 **Files Modified**

### **Core Configuration**
- `docker-compose.yml.template`: Complete service configuration with proper URLs
- `demo.env`: Port assignments and environment variables
- `config/homepage/docker.yaml`: Docker socket proxy integration

### **Documentation Updates**
- `README.md`: Updated service overview and port table
- `PRD.md`: Product requirements alignment
- `AGENTS.md`: Development guidelines and standards

## 🎯 **Current State: Production Ready**

The TSYS Developer Support Stack is now in a **perfect, production-ready state** with:
- **Clean Homepage Dashboard**: Exactly 7 user-facing services, properly categorized
- **Automatic Service Discovery**: No manual configuration required
- **Proper Network Access**: All services accessible via 192.168.3.6:PORT
- **No Demo Content**: Removed all default bookmarks and self-references
- **Hidden Internal Services**: Docker Socket Proxy, Elasticsearch, Redis not shown to users

Ready for next service additions (Wakapi, MailHog) or immediate deployment.
2025-11-14 00:14:58 -05:00

372 lines
12 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
user: "${APP_UID}:${APP_GID}"
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
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:1.8.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
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"
# =============================================================================
# ARCHIVAL & CONTENT MANAGEMENT
# =============================================================================
archivebox:
image: archivebox/archivebox:latest
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:latest
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
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}_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