Commit Graph
10 Commits
Author SHA1 Message Date
reachableceo be03c95929 fix(demo): harden deployment scripts, remove duplicate fix-and-ship.sh
demo-stack.sh:
- Add ensure_env() to create demo.env from template if missing
- Add envsubst prerequisite check
- Fix wait_healthy() to use docker inspect instead of fragile
  sed/awk parsing of docker ps output
- Fix smoke_test() to use env vars instead of hardcoded ports
- Remove fix_env() which overwrote TA_HOST with wrong value
- Add MailHog SMTP port to display_summary()
- Add service names to smoke test output

demo-test.sh:
- Fix security compliance test to expect only 1 socket mount
  (proxy only, now that Dockhand uses DOCKER_HOST)
- Add Dockhand proxy routing check
- Fix arithmetic increment operators for set -e compatibility

- Remove scripts/fix-and-ship.sh (was identical copy of demo-stack.sh)

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
2026-05-01 09:50:40 -05:00
reachableceo 9f40e16b25 test(demo): rewrite test suite with meaningful assertions
Unit tests (test_env_validation.sh):
- Validate docker-compose.yml.template has all 16 services
- Verify every exposed service has healthcheck, restart policy, labels
- Verify Dockhand routes through socket proxy (not direct mount)
- Verify only docker-socket-proxy mounts /var/run/docker.sock
- Validate demo.env.template has all 28 required variables
- Verify all port values are in 4000-4099 range
- Verify Homepage and Grafana config files exist
- Verify all scripts use strict mode (set -euo pipefail)
- 53 assertions, all passing

Integration tests (test_service_communication.sh):
- Remove || true suppression on test failures
- Add require_stack_running guard with clear error message
- Add test for Dockhand proxy integration (DOCKER_HOST env check)
- Add network isolation test (container count on network)
- Proper pass/fail counting with exit code

Previous unit test was a tautology (id -u == id -u) that could
never fail. Previous integration tests suppressed all failures.

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
2026-05-01 09:48:25 -05:00
reachableceo 0c13069304 feat(demo): add Grafana dashboard and populate empty config directories
- Add Grafana Docker Infrastructure Overview dashboard (CPU, memory,
  container count, image count panels querying InfluxDB)
- Move dashboard JSON to config/grafana/dashboards/ for proper
  provisioning by Grafana's file provider
- Add .gitkeep to 10 empty config directories (pihole, drawio, kroki,
  atomictracker, archivebox, tubearchivist, wakapi, mailhog,
  influxdb, atuin) so git tracks the directory structure

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
2026-05-01 09:43:26 -05:00
reachableceo 088a4cba07 feat(demo): add Homepage dashboard configuration files
- services.yaml: all 13 user-facing services organized by category
  with Pi-hole and Grafana widgets for live stats
- widgets.yaml: greeting, datetime, search, and Pi-hole glances widget
- bookmarks.yaml: developer resource links (GitHub, Stack Overflow,
  Docker Hub, Grafana Docs, InfluxDB Docs)
- settings.yaml: layout configuration (row style, column counts),
  Docker provider via socket proxy, and branding

Previously only docker.yaml existed, resulting in a bare-bones
dashboard with no widgets, bookmarks, or layout.

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
2026-05-01 09:42:02 -05:00
reachableceo 265d146bd3 fix(demo): route Dockhand through socket proxy, add resource limits
- Route Dockhand Docker access through docker-socket-proxy via
  DOCKER_HOST=tcp://docker-socket-proxy:2375 instead of direct
  socket mount, enforcing the security model documented in AGENTS.md
- Add POST, DELETE, ALLOW_START, ALLOW_STOP, ALLOW_RESTARTS
  permissions to socket proxy for Dockhand container management
- Add deploy.resources.limits.memory to all 16 services
  (128M-1024M depending on service needs)
- Add MailHog SMTP port 4019 mapping (1025 internal) so applications
  can actually send test emails to MailHog
- Remove stale config/portainer/ directory

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
2026-05-01 09:41:08 -05:00
reachableceo 904fc6d727 chore: add .gitignore and env template, untrack generated files
- Add .gitignore excluding generated docker-compose.yml, demo.env,
  editor files, and temporary files
- Remove demo/docker-compose.yml from tracking (generated by envsubst)
- Remove demo/demo.env from tracking (contains per-machine values)
- Add demo/demo.env.template as reference for required configuration
- Remove stale config/portainer/ directory (Portainer not in stack)

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
2026-05-01 09:35:49 -05:00
reachableceo 6a70131f9c fix(demo): correct docs, env config, and health checks for production readiness
- Fix DrawIO/Kroki health checks from wget to curl (DrawIO has no wget,
  Kroki /health endpoint unreliable with wget)
- Fix script paths in demo/AGENTS.md (./demo-test.sh → ./scripts/demo-test.sh)
- Fix script paths in demo/README.md (./demo-stack.sh → ./scripts/demo-stack.sh)
- Fix all service URLs from 192.168.3.6 to localhost in demo/README.md
- Fix hardcoded variable references to actual port values in demo/README.md
- Fix root AGENTS.md doc paths (docs/ → demo/docs/)
- Reorganize demo.env: group related vars, fix TA_HOST to container DNS,
  fix ES_JAVA_OPTS quoting, move service credentials with their configs
- Add CWD guidance note to troubleshooting guide
- Regenerate docker-compose.yml with corrected TA_HOST

All 16 services healthy, 38/38 tests passing.

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
2026-04-27 13:28:03 -05:00
reachableceo 55aa340a6c docs(demo): synchronize all documentation with 16-service stack
Fix all documentation to match the actual running stack. Every service
count, port number, credential, network name, container name, and
dependency is now accurate across all files.

Key changes:
- Remove all stale Portainer/portainer references (replaced by Dockhand)
- Fix project name from tsysdevstack to kneldevstack everywhere
- Fix volume name pattern (underscore not dash after project name)
- Fix network names (add -network suffix, correct subnet in commands)
- Fix Homepage category from Infrastructure to Developer Tools
- Add companion services (ta-redis, ta-elasticsearch) to all service lists
- Fix Dockhand dependency description (direct socket, not proxy)
- Remove port 4005 from all host-facing health check loops and port tables
- Fix broken commands (docker exec dockhand docker version, wrong volume globs)
- Fix INFLUXDB_ADMIN_USER credential references from demo_admin to admin
- Fix Grafana datasource user to match
- Fix misleading "ports 4000-4018" range to explicit port list
- Add Docker Socket Proxy internal-only notes where applicable
- Update root AGENTS.md service categories to match compose labels

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
2026-04-27 13:07:02 -05:00
reachableceo eff78907d4 fix(demo): rewrite deployment scripts and test suite for 16-service stack
Rewrite demo-stack.sh, demo-test.sh, validate-all.sh, and all test
files to match the current 16-service stack reality.

Key changes:
- demo-stack.sh: full rewrite with deploy/stop/restart/status/smoke/summary
- demo-test.sh: fix hardcoded kneldevstack filter to use $COMPOSE_PROJECT_NAME,
  raise volume threshold from 10 to 15, remove curl dependency (use /dev/tcp),
  fix security compliance check for Dockhand direct socket mount
- validate-all.sh: remove port 4005 check (internal only), add missing env
  var validation (TA_PASSWORD, ELASTIC_PASSWORD, GF_*, PIHOLE_WEBPASSWORD)
- integration tests: fix container names, add TubeArchivist companion tests
- e2e tests: use correct project-relative paths, dynamic port lists from env
- Add fix-and-ship.sh as convenience wrapper for demo-stack.sh
- Remove stale tmp_template.yml

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
2026-04-27 13:06:45 -05:00
reachableceo 077f483faf feat(demo): restore ArchiveBox, TubeArchivist, Atuin and fix all service configs
Restore 3 services that were previously removed due to health issues,
bringing the stack to 16 services. Add companion services (Elasticsearch,
Redis) required by TubeArchivist.

Key changes:
- Add ArchiveBox with proper health check and admin credentials
- Add TubeArchivist with ta-redis and ta-elasticsearch companions
- Add Atuin server with correct `server start` command and TCP health check
- Fix Wakapi health check to use /app/healthcheck binary
- Add Grafana provisioning bind mount for datasources/dashboards
- Add Homepage config bind mount for docker.yaml
- Fix Docker Socket Proxy label (remove unreachable localhost:4005 href)
- Fix credentials: INFLUXDB_ADMIN_USER and TA_USERNAME → admin
- Fix Grafana datasources.yml user to match
- Fix homepage/docker.yaml to contain Docker provider config
- Add all missing env vars (TA_PASSWORD, ELASTIC_PASSWORD, ES_JAVA_OPTS, etc.)
- Remove Pi-hole port 53 bindings (DNS not needed for demo)
- Bump template version to 2.0

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
2026-04-27 13:06:31 -05:00