From danctrl-brain
This skill should be used when the user wants to "deploy a new service", "add a container", "set up a new Podman service", "add a new service to terminal or gate", or asks how to get a new container running in the homelab. Also triggers for "how do I add a service" or "what's the deploy process".
How this skill is triggered — by the user, by Claude, or both
Slash command
/danctrl-brain:deploy-serviceThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Standard workflow for deploying a new containerised service. Services are managed with `podman compose`, with systemd units wrapping compose for process management where needed.
Standard workflow for deploying a new containerised service. Services are managed with podman compose, with systemd units wrapping compose for process management where needed.
terminal or gate?ghcr.io/someone/service:latest)proxy for Traefik-exposed, internal for DB/cache, mcp for MCP tooling)Path: ~/projekt-apollo/services/<service-name>/compose.yml
services:
<service-name>:
image: <image>
container_name: <service-name>
restart: unless-stopped
networks:
- proxy # or internal / mcp
volumes:
- ./data:/data # adjust as needed
environment:
- KEY=${KEY} # pull via 1Password Connect
labels:
# Traefik labels (omit if not public-facing)
- "traefik.enable=true"
- "traefik.http.routers.<service-name>.rule=Host(`<subdomain>.danctrl.net`)"
- "traefik.http.routers.<service-name>.entrypoints=websecure"
- "traefik.http.routers.<service-name>.tls=true"
- "traefik.http.routers.<service-name>.tls.certresolver=cloudflare"
- "traefik.http.routers.<service-name>.middlewares=crowdsec@file,authentik@file"
# Use "crowdsec@file,local@file" for internal-only routes
# Omit authentik@file if no SSO needed
networks:
proxy:
external: true
cd ~/projekt-apollo/services/<service-name>
podman compose up -d
podman compose logs -f # watch startup
Some services use systemd to manage themselves or require systemd for proper startup/restart behaviour. If needed, create a systemd service unit that wraps the compose invocation:
Path: ~/.config/systemd/user/<service-name>.service
[Unit]
Description=<Service Name>
After=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=%h/projekt-apollo/services/<service-name>
ExecStart=/usr/bin/podman compose up -d
ExecStop=/usr/bin/podman compose down
Restart=on-failure
[Install]
WantedBy=default.target
Then enable and start:
systemctl --user daemon-reload
systemctl --user enable --now <service-name>.service
systemctl --user status <service-name>.service
Ask Daniel whether this service needs a systemd unit — not all services require one.
In Authentik admin (id.danctrl.net):
https://<subdomain>.danctrl.net# Container is running
podman ps | grep <service-name>
# Traefik picked up the route
curl -s http://localhost:8080/api/http/routers | jq '.[].name' | grep <service-name>
# Endpoint responds
curl -I https://<subdomain>.danctrl.net
After a successful deploy, update the relevant reference file:
skills/homelab-context/references/terminal.md or gate.md — add the container rowskills/homelab-context/references/services.md — add the Traefik routepodman compose not docker-composeproxy, internal, mcp) pre-exist — declare them external: true in composesystemctl --user, not sudo systemctl for user-level service units~/projekt-apollo/services/<service-name>/Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub danctrl/danctrl-brain --plugin danctrl-brain