deploy/tower/: - second-brain-transcribe.service — systemd unit. User=herbyadmin, Type=simple, After=/Wants= wg-quick@wg-lan.service so the WG tunnel must come up first. Restart=always with a StartLimitBurst guard. - second-brain-transcribe.env.example — env file template documenting the SECOND_BRAIN_DATABASE_URL form for db.wg.herbylab.dev (10.99.0.1) and the optional WHISPER_* overrides. - README.md — EndeavourOS install steps (nvidia/cuda/cudnn, ffmpeg, uv + tower extra, model pre-warm), WG topology reference, validation checklist for what to confirm once the tunnel is live, and a follow-ups section flagging the local-disk → NAS media migration as out-of-scope-for-this-round. Tests: - tests/test_claim.py — live-DB race test. Two threads call claim_next_source against a single PULLED video row; SKIP LOCKED must give exactly one of them the row, the other gets None. Also asserts the claimed_by/at columns land + release nulls them. Auto-skips when no SECOND_BRAIN_DATABASE_URL is set. - tests/test_transcribe.py — pure-Python coverage of resolve_settings (cpu→int8, cuda→float16, env-over-block) and write_srt; plus a CPU smoke test that synthesizes a numpy audio array and runs the `tiny` model on cpu/int8 (auto-skipped when faster-whisper isn't installed, i.e. on the dev side without --extra tower).
47 lines
1.6 KiB
Desktop File
47 lines
1.6 KiB
Desktop File
[Unit]
|
|
Description=second-brain transcribe worker (tower-side, faster-whisper on GPU)
|
|
Documentation=https://gitea.plantbasedsoutherner.com/petal-power/second-brain
|
|
# The worker reaches petalbrain over WireGuard, so the tunnel must be up first.
|
|
# `Wants=` is the soft form — if the tunnel disappears later the worker logs
|
|
# DB-unreachable warnings and retries, it doesn't crash-loop.
|
|
After=network-online.target wg-quick@wg-lan.service
|
|
Wants=network-online.target wg-quick@wg-lan.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=herbyadmin
|
|
Group=herbyadmin
|
|
|
|
# Adjust to wherever you `git clone`d the repo on the tower.
|
|
WorkingDirectory=/opt/projects/homelab/second-brain
|
|
|
|
# Env (SECOND_BRAIN_DATABASE_URL, optional knobs). 0600, owned by herbyadmin.
|
|
EnvironmentFile=/etc/default/second-brain-transcribe
|
|
|
|
# `uv run` resolves the project venv. Keep the worker in the foreground so
|
|
# systemd owns the lifecycle; the worker handles SIGTERM/SIGINT cleanly and
|
|
# exits after the current iteration finishes.
|
|
ExecStart=/usr/bin/uv run second-brain transcribe-worker
|
|
|
|
Restart=always
|
|
RestartSec=10
|
|
|
|
# Crash loop guard — systemd will give up after this if the unit keeps
|
|
# dying. The worker itself logs+backs-off on DB outages so this only
|
|
# trips on genuine failure.
|
|
StartLimitIntervalSec=300
|
|
StartLimitBurst=5
|
|
|
|
# A few sandboxing nice-to-haves. Loose on purpose — the worker needs
|
|
# /dev/nvidia* for CUDA and writes to user-owned media/subtitles dirs.
|
|
ProtectSystem=full
|
|
ProtectHome=no
|
|
NoNewPrivileges=true
|
|
|
|
# Stdout/stderr → journald.
|
|
StandardOutput=journal
|
|
StandardError=journal
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|