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:
@@ -34,7 +34,7 @@ TSYSDevStack-SupportStack-LocalWorkstation/
|
|||||||
│ │ ├── homepage/ # Homepage dashboard config
|
│ │ ├── homepage/ # Homepage dashboard config
|
||||||
│ │ ├── grafana/ # Grafana dashboards/datasources
|
│ │ ├── grafana/ # Grafana dashboards/datasources
|
||||||
│ │ ├── pihole/ # Pi-hole configuration
|
│ │ ├── pihole/ # Pi-hole configuration
|
||||||
│ │ ├── portainer/ # Portainer configuration
|
│ │ ├── dockhand/ # Dockhand configuration
|
||||||
│ │ ├── influxdb/ # InfluxDB configuration
|
│ │ ├── influxdb/ # InfluxDB configuration
|
||||||
│ │ ├── drawio/ # Draw.io configuration
|
│ │ ├── drawio/ # Draw.io configuration
|
||||||
│ │ ├── kroki/ # Kroki configuration
|
│ │ ├── kroki/ # Kroki configuration
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ All configuration is managed through `demo.env` and dynamic detection:
|
|||||||
| Service | Port | Description | 🌐 Access |
|
| Service | Port | Description | 🌐 Access |
|
||||||
|---------|------|-------------|-----------|
|
|---------|------|-------------|-----------|
|
||||||
| **Pi-hole** | 4006 | DNS-based ad blocking and monitoring | [Open](http://192.168.3.6:4006) |
|
| **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
|
### 📊 Monitoring & Observability
|
||||||
| Service | Port | Description | 🌐 Access |
|
| Service | Port | Description | 🌐 Access |
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ DEMO_DOCKER_GID=996
|
|||||||
HOMEPAGE_PORT=4000
|
HOMEPAGE_PORT=4000
|
||||||
DOCKER_SOCKET_PROXY_PORT=4005
|
DOCKER_SOCKET_PROXY_PORT=4005
|
||||||
PIHOLE_PORT=4006
|
PIHOLE_PORT=4006
|
||||||
PORTAINER_PORT=4007
|
DOCKHAND_PORT=4007
|
||||||
INFLUXDB_PORT=4008
|
INFLUXDB_PORT=4008
|
||||||
GRAFANA_PORT=4009
|
GRAFANA_PORT=4009
|
||||||
DRAWIO_PORT=4010
|
DRAWIO_PORT=4010
|
||||||
@@ -28,7 +28,7 @@ ATUIN_PORT=4018
|
|||||||
DEMO_ADMIN_USER=admin
|
DEMO_ADMIN_USER=admin
|
||||||
DEMO_ADMIN_PASSWORD=demo_password
|
DEMO_ADMIN_PASSWORD=demo_password
|
||||||
DEMO_GRAFANA_ADMIN_PASSWORD=demo_password
|
DEMO_GRAFANA_ADMIN_PASSWORD=demo_password
|
||||||
DEMO_PORTAINER_PASSWORD=demo_password
|
DEMO_DOCKHAND_PASSWORD=demo_password
|
||||||
|
|
||||||
# Network Configuration
|
# Network Configuration
|
||||||
NETWORK_SUBNET=192.168.3.0/24
|
NETWORK_SUBNET=192.168.3.0/24
|
||||||
|
|||||||
@@ -17,8 +17,9 @@ volumes:
|
|||||||
driver: local
|
driver: local
|
||||||
${COMPOSE_PROJECT_NAME}_pihole_data:
|
${COMPOSE_PROJECT_NAME}_pihole_data:
|
||||||
driver: local
|
driver: local
|
||||||
${COMPOSE_PROJECT_NAME}_portainer_data:
|
${COMPOSE_PROJECT_NAME}_dockhand_data:
|
||||||
driver: local
|
driver: local
|
||||||
|
|
||||||
${COMPOSE_PROJECT_NAME}_influxdb_data:
|
${COMPOSE_PROJECT_NAME}_influxdb_data:
|
||||||
driver: local
|
driver: local
|
||||||
${COMPOSE_PROJECT_NAME}_grafana_data:
|
${COMPOSE_PROJECT_NAME}_grafana_data:
|
||||||
@@ -128,29 +129,30 @@ services:
|
|||||||
timeout: ${HEALTH_CHECK_TIMEOUT}
|
timeout: ${HEALTH_CHECK_TIMEOUT}
|
||||||
retries: ${HEALTH_CHECK_RETRIES}
|
retries: ${HEALTH_CHECK_RETRIES}
|
||||||
|
|
||||||
# Portainer - Container Management
|
# Dockhand - Docker Management
|
||||||
portainer:
|
dockhand:
|
||||||
image: portainer/portainer-ce:latest
|
image: fnsys/dockhand:latest
|
||||||
container_name: "${COMPOSE_PROJECT_NAME}-portainer"
|
container_name: "${COMPOSE_PROJECT_NAME}-dockhand"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
- ${COMPOSE_NETWORK_NAME}
|
- ${COMPOSE_NETWORK_NAME}
|
||||||
ports:
|
ports:
|
||||||
- "${PORTAINER_PORT}:9000"
|
- "${DOCKHAND_PORT}:3000"
|
||||||
volumes:
|
volumes:
|
||||||
- ${COMPOSE_PROJECT_NAME}_portainer_data:/data
|
- ${COMPOSE_PROJECT_NAME}_dockhand_data:/app/data
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
environment:
|
environment:
|
||||||
- PUID=${DEMO_UID}
|
- PUID=${DEMO_UID}
|
||||||
- PGID=${DEMO_GID}
|
- PGID=${DEMO_GID}
|
||||||
labels:
|
labels:
|
||||||
homepage.group: "Infrastructure"
|
homepage.group: "Infrastructure"
|
||||||
homepage.name: "Portainer"
|
homepage.name: "Dockhand"
|
||||||
homepage.icon: "portainer"
|
homepage.icon: "dockhand"
|
||||||
homepage.href: "http://localhost:${PORTAINER_PORT}"
|
homepage.href: "http://localhost:${DOCKHAND_PORT}"
|
||||||
homepage.description: "Web-based container management"
|
homepage.description: "Modern Docker management UI"
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider",
|
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider",
|
||||||
"http://localhost:9000"]
|
"http://localhost:3000"]
|
||||||
interval: ${HEALTH_CHECK_INTERVAL}
|
interval: ${HEALTH_CHECK_INTERVAL}
|
||||||
timeout: ${HEALTH_CHECK_TIMEOUT}
|
timeout: ${HEALTH_CHECK_TIMEOUT}
|
||||||
retries: ${HEALTH_CHECK_RETRIES}
|
retries: ${HEALTH_CHECK_RETRIES}
|
||||||
|
|||||||
@@ -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?list` - Blocked domains list
|
||||||
- `GET /admin/api.php?summaryRaw` - Raw statistics
|
- `GET /admin/api.php?summaryRaw` - Raw statistics
|
||||||
|
|
||||||
### Portainer
|
### Dockhand
|
||||||
- **Base URL**: `http://localhost:4007`
|
- **Base URL**: `http://localhost:4007`
|
||||||
- **API Version**: v2
|
- **Authentication**: Direct Docker API access
|
||||||
- **Authentication**: Bearer token
|
- **Features**:
|
||||||
- **Endpoints**:
|
- Container lifecycle management
|
||||||
- `POST /api/auth` - Authentication
|
- Compose stack orchestration
|
||||||
- `GET /api/endpoints` - List endpoints
|
- Git-based deployments
|
||||||
- `GET /api/containers` - List containers
|
- Multi-environment support
|
||||||
- `GET /api/images` - List images
|
- Terminal access
|
||||||
|
- Log streaming
|
||||||
|
- File browser
|
||||||
|
|
||||||
## Monitoring & Observability APIs
|
## Monitoring & Observability APIs
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ All services are accessible through the Homepage dashboard at http://localhost:4
|
|||||||
|
|
||||||
### 🏗️ Infrastructure Services
|
### 🏗️ Infrastructure Services
|
||||||
- **Pi-hole** (Port 4006): DNS management with ad blocking
|
- **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
|
- **Docker Socket Proxy** (Port 4005): Secure Docker socket access
|
||||||
|
|
||||||
### 📊 Monitoring & Observability
|
### 📊 Monitoring & Observability
|
||||||
@@ -45,7 +45,7 @@ All services are accessible through the Homepage dashboard at http://localhost:4
|
|||||||
- **Username**: `admin`
|
- **Username**: `admin`
|
||||||
- **Password**: `demo_password`
|
- **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
|
## Getting Help
|
||||||
|
|
||||||
|
|||||||
@@ -121,18 +121,18 @@ docker compose logs grafana
|
|||||||
# Navigate to: http://localhost:4009/datasources
|
# Navigate to: http://localhost:4009/datasources
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Portainer Container Access
|
#### Dockhand Container Access
|
||||||
**Symptoms**: Can't manage containers
|
**Symptoms**: Can't manage containers
|
||||||
**Solution**:
|
**Solution**:
|
||||||
```bash
|
```bash
|
||||||
# Check Docker socket proxy
|
# Check Dockhand logs
|
||||||
docker compose logs docker-socket-proxy
|
docker compose logs dockhand
|
||||||
|
|
||||||
# Verify proxy permissions
|
# Verify Docker socket access
|
||||||
curl http://localhost:4005/version
|
docker exec tsysdevstack-supportstack-demo-dockhand docker version
|
||||||
|
|
||||||
# Restart Portainer
|
# Restart Dockhand
|
||||||
docker compose restart portainer
|
docker compose restart dockhand
|
||||||
```
|
```
|
||||||
|
|
||||||
### Performance Issues
|
### Performance Issues
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ display_summary() {
|
|||||||
echo "📊 Homepage Dashboard: http://localhost:${HOMEPAGE_PORT:-4000}"
|
echo "📊 Homepage Dashboard: http://localhost:${HOMEPAGE_PORT:-4000}"
|
||||||
echo "🏗️ Infrastructure Services:"
|
echo "🏗️ Infrastructure Services:"
|
||||||
echo " - Pi-hole (DNS): http://localhost:${PIHOLE_PORT:-4006}"
|
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 "📊 Monitoring & Observability:"
|
||||||
echo " - InfluxDB (Database): http://localhost:${INFLUXDB_PORT:-4008}"
|
echo " - InfluxDB (Database): http://localhost:${INFLUXDB_PORT:-4008}"
|
||||||
echo " - Grafana (Visualization): http://localhost:${GRAFANA_PORT:-4009}"
|
echo " - Grafana (Visualization): http://localhost:${GRAFANA_PORT:-4009}"
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ test_port_accessibility() {
|
|||||||
"$HOMEPAGE_PORT:Homepage"
|
"$HOMEPAGE_PORT:Homepage"
|
||||||
"$DOCKER_SOCKET_PROXY_PORT:Docker Socket Proxy"
|
"$DOCKER_SOCKET_PROXY_PORT:Docker Socket Proxy"
|
||||||
"$PIHOLE_PORT:Pi-hole"
|
"$PIHOLE_PORT:Pi-hole"
|
||||||
"$PORTAINER_PORT:Portainer"
|
"$DOCKHAND_PORT:Dockhand"
|
||||||
"$INFLUXDB_PORT:InfluxDB"
|
"$INFLUXDB_PORT:InfluxDB"
|
||||||
"$GRAFANA_PORT:Grafana"
|
"$GRAFANA_PORT:Grafana"
|
||||||
"$DRAWIO_PORT:Draw.io"
|
"$DRAWIO_PORT:Draw.io"
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ validate_port_availability() {
|
|||||||
"$HOMEPAGE_PORT"
|
"$HOMEPAGE_PORT"
|
||||||
"$DOCKER_SOCKET_PROXY_PORT"
|
"$DOCKER_SOCKET_PROXY_PORT"
|
||||||
"$PIHOLE_PORT"
|
"$PIHOLE_PORT"
|
||||||
"$PORTAINER_PORT"
|
"$DOCKHAND_PORT"
|
||||||
"$INFLUXDB_PORT"
|
"$INFLUXDB_PORT"
|
||||||
"$GRAFANA_PORT"
|
"$GRAFANA_PORT"
|
||||||
"$DRAWIO_PORT"
|
"$DRAWIO_PORT"
|
||||||
|
|||||||
@@ -15,13 +15,13 @@ test_grafana_influxdb_integration() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
test_portainer_docker_integration() {
|
test_dockhand_docker_integration() {
|
||||||
# Test Portainer can reach Docker socket
|
# Test Dockhand can reach Docker socket
|
||||||
if docker exec tsysdevstack-supportstack-demo-portainer docker version >/dev/null 2>&1; then
|
if docker exec tsysdevstack-supportstack-demo-dockhand docker version >/dev/null 2>&1; then
|
||||||
echo "PASS: Portainer-Docker integration"
|
echo "PASS: Dockhand-Docker integration"
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
echo "FAIL: Portainer-Docker integration"
|
echo "FAIL: Dockhand-Docker integration"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -41,5 +41,5 @@ test_homepage_discovery() {
|
|||||||
|
|
||||||
# Run integration tests
|
# Run integration tests
|
||||||
test_grafana_influxdb_integration
|
test_grafana_influxdb_integration
|
||||||
test_portainer_docker_integration
|
test_dockhand_docker_integration
|
||||||
test_homepage_discovery
|
test_homepage_discovery
|
||||||
Reference in New Issue
Block a user