#!/bin/bash # Root-requiring installation steps for ytstream. # # susan has no passwordless sudo, so everything needing root is collected here for # the operator to run in one go: # # sudo /opt/ytstream/deploy/deploy.sh # # Everything that does NOT need root — the venv, the database, the POT provider # container, subscriptions, the API key — is handled by `bootstrap.sh` and the # application itself. Run bootstrap.sh (as susan) first. set -euo pipefail REPO=/opt/ytstream STATE=/var/lib/ytstream VENV=$STATE/venv HOSTNAME_=tube.jihakuz.xyz if [[ $EUID -ne 0 ]]; then echo "This script needs root. Run: sudo $0" >&2 exit 1 fi say() { printf '\n\033[1m==> %s\033[0m\n' "$1"; } say "Creating $STATE" # root-owned directory, group-writable by `automation` so susan's cron job and the # admin server can both write the database. install -d -o susan -g automation -m 0770 "$STATE" say "Installing the /usr/local/bin shim" cat > /usr/local/bin/ytstream </dev/null; then echo " $HOSTNAME_ is already served by an existing vhost." echo " Repoint its proxy_pass to http://127.0.0.1:8086 by hand, then:" echo " nginx -t && systemctl reload nginx" echo " (Deliberately not edited automatically — that block also serves" echo " other names and owns the TLS certificate.)" else echo " No existing vhost found. Install one proxying to 127.0.0.1:8086" echo " and run: certbot --nginx -d $HOSTNAME_" fi say "Done" cat <<'EOF' Remaining steps, all as susan and none needing root: ytstream set-password # admin UI login ytstream set-jellyfin-key # verified against the live server ytstream set-youtube-key # verified against the live API ytstream add-source @cflux1030 # the mirrored account ytstream sync # queues the subscriptions ytstream pending # review them ytstream approve --all # or approve a subset by id ytstream run # first real cycle ytstream doctor # confirm everything is wired up Then add the cron entries from deploy/crontab.fragment to susan's crontab. EOF