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

@@ -34,7 +34,7 @@ TSYSDevStack-SupportStack-LocalWorkstation/
│ │ ├── homepage/ # Homepage dashboard config
│ │ ├── grafana/ # Grafana dashboards/datasources
│ │ ├── pihole/ # Pi-hole configuration
│ │ ├── portainer/ # Portainer configuration
│ │ ├── dockhand/ # Dockhand configuration
│ │ ├── influxdb/ # InfluxDB configuration
│ │ ├── drawio/ # Draw.io configuration
│ │ ├── kroki/ # Kroki configuration

View File

@@ -95,7 +95,7 @@ All configuration is managed through `demo.env` and dynamic detection:
| Service | Port | Description | 🌐 Access |
|---------|------|-------------|-----------|
| **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) |
| **Dockhand** | 4007 | Modern Docker management UI | [Open](http://192.168.3.6:4007) |
### 📊 Monitoring & Observability
| Service | Port | Description | 🌐 Access |

View File

@@ -12,7 +12,7 @@ DEMO_DOCKER_GID=996
HOMEPAGE_PORT=4000
DOCKER_SOCKET_PROXY_PORT=4005
PIHOLE_PORT=4006
PORTAINER_PORT=4007
DOCKHAND_PORT=4007
INFLUXDB_PORT=4008
GRAFANA_PORT=4009
DRAWIO_PORT=4010
@@ -28,7 +28,7 @@ ATUIN_PORT=4018
DEMO_ADMIN_USER=admin
DEMO_ADMIN_PASSWORD=demo_password
DEMO_GRAFANA_ADMIN_PASSWORD=demo_password
DEMO_PORTAINER_PASSWORD=demo_password
DEMO_DOCKHAND_PASSWORD=demo_password
# Network Configuration
NETWORK_SUBNET=192.168.3.0/24

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}

View File

@@ -25,15 +25,17 @@ This document provides API endpoint information for all services in the stack.
- `GET /admin/api.php?list` - Blocked domains list
- `GET /admin/api.php?summaryRaw` - Raw statistics
### Portainer
### Dockhand
- **Base URL**: `http://localhost:4007`
- **API Version**: v2
- **Authentication**: Bearer token
- **Endpoints**:
- `POST /api/auth` - Authentication
- `GET /api/endpoints` - List endpoints
- `GET /api/containers` - List containers
- `GET /api/images` - List images
- **Authentication**: Direct Docker API access
- **Features**:
- Container lifecycle management
- Compose stack orchestration
- Git-based deployments
- Multi-environment support
- Terminal access
- Log streaming
- File browser
## Monitoring & Observability APIs

View File

@@ -18,7 +18,7 @@ All services are accessible through the Homepage dashboard at http://localhost:4
### 🏗️ Infrastructure Services
- **Pi-hole** (Port 4006): DNS management with ad blocking
- **Portainer** (Port 4007): Web-based container management
- **Dockhand** (Port 4007): Modern Docker management UI
- **Docker Socket Proxy** (Port 4005): Secure Docker socket access
### 📊 Monitoring & Observability
@@ -45,7 +45,7 @@ All services are accessible through the Homepage dashboard at http://localhost:4
- **Username**: `admin`
- **Password**: `demo_password`
These credentials work for Grafana and Portainer. Other services may have different authentication requirements.
These credentials work for Grafana and Dockhand. Other services may have different authentication requirements.
## Getting Help

View File

@@ -121,18 +121,18 @@ docker compose logs grafana
# Navigate to: http://localhost:4009/datasources
```
#### Portainer Container Access
#### Dockhand Container Access
**Symptoms**: Can't manage containers
**Solution**:
```bash
# Check Docker socket proxy
docker compose logs docker-socket-proxy
# Check Dockhand logs
docker compose logs dockhand
# Verify proxy permissions
curl http://localhost:4005/version
# Verify Docker socket access
docker exec tsysdevstack-supportstack-demo-dockhand docker version
# Restart Portainer
docker compose restart portainer
# Restart Dockhand
docker compose restart dockhand
```
### Performance Issues

View File

@@ -184,7 +184,7 @@ display_summary() {
echo "📊 Homepage Dashboard: http://localhost:${HOMEPAGE_PORT:-4000}"
echo "🏗️ Infrastructure Services:"
echo " - Pi-hole (DNS): http://localhost:${PIHOLE_PORT:-4006}"
echo " - Portainer (Containers): http://localhost:${PORTAINER_PORT:-4007}"
echo " - Dockhand (Containers): http://localhost:${DOCKHAND_PORT:-4007}"
echo "📊 Monitoring & Observability:"
echo " - InfluxDB (Database): http://localhost:${INFLUXDB_PORT:-4008}"
echo " - Grafana (Visualization): http://localhost:${GRAFANA_PORT:-4009}"

View File

@@ -180,7 +180,7 @@ test_port_accessibility() {
"$HOMEPAGE_PORT:Homepage"
"$DOCKER_SOCKET_PROXY_PORT:Docker Socket Proxy"
"$PIHOLE_PORT:Pi-hole"
"$PORTAINER_PORT:Portainer"
"$DOCKHAND_PORT:Dockhand"
"$INFLUXDB_PORT:InfluxDB"
"$GRAFANA_PORT:Grafana"
"$DRAWIO_PORT:Draw.io"

View File

@@ -118,7 +118,7 @@ validate_port_availability() {
"$HOMEPAGE_PORT"
"$DOCKER_SOCKET_PROXY_PORT"
"$PIHOLE_PORT"
"$PORTAINER_PORT"
"$DOCKHAND_PORT"
"$INFLUXDB_PORT"
"$GRAFANA_PORT"
"$DRAWIO_PORT"

View File

@@ -15,13 +15,13 @@ test_grafana_influxdb_integration() {
fi
}
test_portainer_docker_integration() {
# Test Portainer can reach Docker socket
if docker exec tsysdevstack-supportstack-demo-portainer docker version >/dev/null 2>&1; then
echo "PASS: Portainer-Docker integration"
test_dockhand_docker_integration() {
# Test Dockhand can reach Docker socket
if docker exec tsysdevstack-supportstack-demo-dockhand docker version >/dev/null 2>&1; then
echo "PASS: Dockhand-Docker integration"
return 0
else
echo "FAIL: Portainer-Docker integration"
echo "FAIL: Dockhand-Docker integration"
return 1
fi
}
@@ -41,5 +41,5 @@ test_homepage_discovery() {
# Run integration tests
test_grafana_influxdb_integration
test_portainer_docker_integration
test_dockhand_docker_integration
test_homepage_discovery