truenas-docker-ops
Playbook for anything on the TrueNAS host — consult before touching services, data, or containers. Covers SSH entry, container interaction, and data/layout notes so you can operate safely on TrueNAS.
When & Why to Use This Skill
This Claude skill serves as a comprehensive operational playbook for managing Docker containers and services on a TrueNAS host. It provides standardized procedures for SSH access, container interaction, and data management, ensuring safe and consistent server operations through integrated Ansible workflows and specialized helper scripts for SQLite and Python execution.
Use Cases
- Remote Monitoring: Quickly check container status, filter running services, and inspect logs on a TrueNAS host via pre-configured SSH commands.
- Data Maintenance: Safely navigate complex data layouts and mount points (e.g., anypod data root) to manage media files, transcripts, and application databases.
- Advanced Troubleshooting: Execute complex Python scripts or SQL queries directly within containers using specialized helper scripts that handle nested quoting and environment overrides.
- Infrastructure Compliance: Verify container configurations and network assignments against Ansible playbooks to ensure manual changes don't conflict with automated deployments.
| name | truenas-docker-ops |
|---|---|
| description | Playbook for anything on the TrueNAS host — consult before touching services, data, or containers. Covers SSH entry, container interaction, and data/layout notes so you can operate safely on TrueNAS. |
TrueNAS Docker Operations
Essentials
- Connect:
ssh truenas(auth pre-configured) - Stacks managed via Ansible in
ansiblonomiconrepo folder (inansible/stacks/) - Deployed compose files:
/mnt/performance/docker/stacks/<stack>/compose.yaml - Container configs:
/mnt/performance/docker/<stack>/ - Large media data:
/mnt/capacity/watch/<container>/ - Network/IP assignments: see individual compose files or
ansible/inventory/group_vars/truenas.ymlin ansiblonomicon
Common Commands
| Task | Command |
|---|---|
| List containers | ssh truenas docker ps |
| Filter containers | ssh truenas docker ps | grep <name> |
| View compose | ssh truenas cat /mnt/performance/docker/stacks/<stack>/compose.yaml |
| View logs | ssh truenas docker logs <container> |
| Exec command | ssh truenas docker exec -i <container> <command> |
| Inspect | ssh truenas docker inspect <container> |
Deployment
Stacks are deployed via Ansible, not manually:
# From ansiblonomicon repo
poe truenas # Full playbook
poe truenas -t stacks # Just stacks
but you can run ad-hoc commands against the docker containers/compose files on the truenas host. Changes will not be preserved unless they are made to the ansiblonomicon repo.
Anypod Data Layout
- Host data root:
/mnt/capacity/watch/anypod/data(binds to/datain container)- Media downloads:
media/<feed_id>/ - Transcripts:
transcripts/<feed_id>/ - DB:
/data/db/anypod.db
- Media downloads:
- DB tables (anypod.db):
feed(PKid; feed metadata, source info, timestamps, counters)download(PKfeed_id,id; per-episode info, status, transcript fields)appstate(PKid;last_yt_dlp_update, other global state)
Helper Scripts
Python (handles nested heredoc/quoting)
scripts/docker_exec_python.sh <container> '<python_code>'
scripts/docker_exec_python.sh anypod '
import sqlite3, json
conn = sqlite3.connect("/data/db/anypod.db")
conn.row_factory = sqlite3.Row
rows = conn.execute("SELECT * FROM feed").fetchall()
print(json.dumps([dict(r) for r in rows], indent=2))
conn.close()
'
Note: Default interpreter is
/app/.venv/bin/python(works for anypod). Override withCONTAINER_PYTHON:CONTAINER_PYTHON=/usr/bin/python3 scripts/docker_exec_python.sh your-container 'print("hi")'
SQLite
scripts/docker_exec_sqlite.sh <container> <db_path> '<sql_query>'
scripts/docker_exec_sqlite.sh anypod /data/db/anypod.db '
SELECT feed_id, status, COUNT(*) AS count
FROM download
GROUP BY feed_id, status;
'
When to Use Scripts vs Direct
- Scripts: Multi-line Python/SQL, complex quoting
- Direct
docker exec: Simple commands, logs, inspection
Quick Examples
# Is anypod running?
ssh truenas docker ps | grep anypod
# View anypod compose
ssh truenas cat /mnt/performance/docker/stacks/anypod/compose.yaml
# Query anypod DB
scripts/docker_exec_sqlite.sh anypod /data/db/anypod.db "SELECT * FROM feed;"