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
|
||||
│ │ ├── grafana/ # Grafana dashboards/datasources
|
||||
│ │ ├── pihole/ # Pi-hole configuration
|
||||
│ │ ├── portainer/ # Portainer configuration
|
||||
│ │ ├── dockhand/ # Dockhand configuration
|
||||
│ │ ├── influxdb/ # InfluxDB configuration
|
||||
│ │ ├── drawio/ # Draw.io configuration
|
||||
│ │ ├── kroki/ # Kroki configuration
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user