refactor(demo): replace Portainer with Dockhand

Replace Portainer container management service with Dockhand:
- Update docker-compose.yml.template with Dockhand service definition
- Replace portainer_data volume with dockhand_data
- Update PORTAINER_PORT to DOCKHAND_PORT in demo.env
- Update all script references (demo-stack.sh, demo-test.sh, validate-all.sh)
- Update integration test from Portainer to Dockhand
- Update documentation files (README.md, AGENTS.md, api-docs,
  service-guides, troubleshooting)

Dockhand provides modern Docker management UI with:
- Container lifecycle management
- Compose stack orchestration
- Git-based deployments
- Multi-environment support
- Terminal access and log streaming
- File browser capabilities

Maintains same port (4007) for consistency.

💘 Generated with Crush

Assisted-by: GLM-4.7 via Crush <crush@charm.land>
This commit is contained in:
2026-01-24 10:53:23 -05:00
parent ac7e644ba3
commit 45abd5c2e0
11 changed files with 46 additions and 42 deletions

View File

@@ -17,8 +17,9 @@ volumes:
driver: local
${COMPOSE_PROJECT_NAME}_pihole_data:
driver: local
${COMPOSE_PROJECT_NAME}_portainer_data:
${COMPOSE_PROJECT_NAME}_dockhand_data:
driver: local
${COMPOSE_PROJECT_NAME}_influxdb_data:
driver: local
${COMPOSE_PROJECT_NAME}_grafana_data:
@@ -128,29 +129,30 @@ services:
timeout: ${HEALTH_CHECK_TIMEOUT}
retries: ${HEALTH_CHECK_RETRIES}
# Portainer - Container Management
portainer:
image: portainer/portainer-ce:latest
container_name: "${COMPOSE_PROJECT_NAME}-portainer"
# Dockhand - Docker Management
dockhand:
image: fnsys/dockhand:latest
container_name: "${COMPOSE_PROJECT_NAME}-dockhand"
restart: unless-stopped
networks:
- ${COMPOSE_NETWORK_NAME}
ports:
- "${PORTAINER_PORT}:9000"
- "${DOCKHAND_PORT}:3000"
volumes:
- ${COMPOSE_PROJECT_NAME}_portainer_data:/data
- ${COMPOSE_PROJECT_NAME}_dockhand_data:/app/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- PUID=${DEMO_UID}
- PGID=${DEMO_GID}
labels:
homepage.group: "Infrastructure"
homepage.name: "Portainer"
homepage.icon: "portainer"
homepage.href: "http://localhost:${PORTAINER_PORT}"
homepage.description: "Web-based container management"
homepage.name: "Dockhand"
homepage.icon: "dockhand"
homepage.href: "http://localhost:${DOCKHAND_PORT}"
homepage.description: "Modern Docker management UI"
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider",
"http://localhost:9000"]
"http://localhost:3000"]
interval: ${HEALTH_CHECK_INTERVAL}
timeout: ${HEALTH_CHECK_TIMEOUT}
retries: ${HEALTH_CHECK_RETRIES}