9c20e42215
stacks/task-board/compose.yaml + .env.example describe the runtime —
image tag is task-board:local (built on the host), 7878 on host maps
to 7878 in container, SQLite lives at /opt/docker/conf/task-board/data/
(bind mount, uid 1000 friendly), homepage auto-card labels under
Toolchain group, on traefik-net like the rest of the fleet.
playbooks/deploy-task-board.yaml is the first real elway playbook —
exercises everything we built tier-1 + tier-2 idempotency for:
- `creates:` on mkdir + first-time clone + compose dir + data dir
- `when:` to chown /opt/docker/build only if it came up root-owned
- `when:` to seed .env only if one doesn't already exist (never
clobbers user edits on rerun)
- `changed_when:` on the `git reset --hard` step so repeat runs
against the same ref report `ok` instead of `changed`
- `changed_when: "false"` on every verify step (they attest, not
change)
- `upload:` with mode for compose.yaml + .env
Post-up the playbook polls /api/health for 30s before handing off to
the verify phase, so verification doesn't race the healthcheck's
start_period. Verify covers: /api/health 200, /api/tasks shape, /mcp
reachable, container on traefik-net.
Prereqs documented in the playbook header: Docker + compose plugin,
traefik-net network, git SSH access to gitea from the target host.
47 lines
1.6 KiB
YAML
47 lines
1.6 KiB
YAML
# task-board — MCP + web dashboard for assistant task state.
|
|
#
|
|
# Image is built on the host from the task-board git repo by the deploy
|
|
# playbook (`playbooks/deploy-task-board.yaml`), which clones into
|
|
# /opt/docker/build/task-board and runs `docker build -t task-board:local .`
|
|
# before installing this compose and bringing it up.
|
|
#
|
|
# SQLite state persists under ${TASK_BOARD_DATA_DIR} (bind-mounted) so
|
|
# container rebuilds don't lose task history.
|
|
#
|
|
# All tunables live in .env — edit that, not this file.
|
|
|
|
services:
|
|
task-board:
|
|
image: ${TASK_BOARD_IMAGE}
|
|
container_name: task-board
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${TASK_BOARD_BIND:-0.0.0.0}:${TASK_BOARD_PORT}:7878"
|
|
volumes:
|
|
- ${TASK_BOARD_DATA_DIR}:/app/data
|
|
environment:
|
|
# Container always listens on 7878 internally; host port is the only knob.
|
|
- TASK_BOARD_PORT=7878
|
|
- TASK_BOARD_BIND=0.0.0.0
|
|
- TASK_BOARD_DORMANT_AFTER=${TASK_BOARD_DORMANT_AFTER:-3600}
|
|
- TASK_BOARD_ARCHIVE_TTL=${TASK_BOARD_ARCHIVE_TTL:-86400}
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "python -c 'import urllib.request,sys; r=urllib.request.urlopen(\"http://127.0.0.1:7878/api/health\",timeout=3); sys.exit(0 if r.status==200 else 1)' || exit 1"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 15s
|
|
networks:
|
|
- tnet
|
|
labels:
|
|
- homepage.group=Toolchain
|
|
- homepage.name=task-board
|
|
- homepage.icon=mdi-view-dashboard-variant
|
|
- homepage.description=Assistant task state dashboard (MCP + web UI)
|
|
- homepage.href=http://10.250.50.70:${TASK_BOARD_PORT}
|
|
|
|
networks:
|
|
tnet:
|
|
name: traefik-net
|
|
external: true
|