Quadlet units are generator-managed; systemctl enable fails on them
('transient or generated'). The [Install] WantedBy=default.target in each
.container file is itself the enablement (is-enabled reports 'generated'), and
with user linger on they start at boot. Drop the enable step; daemon-reload and
start are enough.
98 lines
3.5 KiB
Bash
Executable File
98 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# deploy-searxng-quadlet.sh — Install and (re)start the SearXNG quadlet stack.
|
|
#
|
|
# The gluetun + searxng + valkey trio is boot-persistent via Quadlet, not
|
|
# podman-compose (see AGENTS.md). This script:
|
|
# 1. Pushes main to origin
|
|
# 2. Pulls the repo on the target
|
|
# 3. Copies the quadlet units into ~/.config/containers/systemd/
|
|
# 4. daemon-reloads, enables the units for boot, and starts them in order
|
|
#
|
|
# It is idempotent: it stops any running units and removes any containers with
|
|
# the trio's names (compose leftovers or the previous quadlet run) before
|
|
# reinstalling and starting, so it is safe to run on first migration and on
|
|
# every later config change.
|
|
#
|
|
# Usage:
|
|
# ./scripts/deploy-searxng-quadlet.sh <target> [--dry-run]
|
|
# ./scripts/deploy-searxng-quadlet.sh dankclaw
|
|
set -euo pipefail
|
|
|
|
REMOTE_USER="dank"
|
|
REMOTE_HOST="dankclaw"
|
|
REMOTE_DIR="/home/dank/serverAppConfigs"
|
|
QDIR="dankclaw/searxng/quadlet"
|
|
UNITS="searxng-network.service gluetun.service searxng-valkey.service searxng.service"
|
|
|
|
TARGET="${1:-}"
|
|
DRY_RUN=0
|
|
if [ "${2:-}" = "--dry-run" ]; then
|
|
DRY_RUN=1
|
|
fi
|
|
|
|
if [ -z "${TARGET:-}" ]; then
|
|
echo "Usage: $0 <target> [--dry-run]"
|
|
exit 1
|
|
fi
|
|
if [ "${TARGET}" != "dankclaw" ]; then
|
|
echo "This stack runs only on dankclaw (got: ${TARGET})"
|
|
exit 1
|
|
fi
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Local pre-flight
|
|
# ---------------------------------------------------------------------------
|
|
cd "$(dirname "$0")/.."
|
|
if ! git diff --quiet HEAD; then
|
|
echo "FAIL: Local working tree has uncommitted changes. Commit first."
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$DRY_RUN" = "1" ]; then
|
|
echo "[dry-run] Would push main, pull on ${REMOTE_HOST}, install quadlet units, and start: ${UNITS}"
|
|
exit 0
|
|
fi
|
|
|
|
echo "=== Deploying SearXNG quadlet stack to ${REMOTE_HOST} ==="
|
|
echo "[1/3] Pushing local main to origin..."
|
|
git push origin main
|
|
|
|
REMOTE="${REMOTE_USER}@${REMOTE_HOST}"
|
|
|
|
echo "[2/3] Installing and starting the quadlet units on ${REMOTE_HOST}..."
|
|
ssh "$REMOTE" bash -s <<REMOTE_EOF
|
|
set -euo pipefail
|
|
cd '${REMOTE_DIR}'
|
|
|
|
echo ' Pulling repo...'
|
|
git pull origin main
|
|
|
|
echo ' Stopping any running units (idempotent)...'
|
|
systemctl --user stop searxng.service gluetun.service searxng-valkey.service searxng-network.service 2>/dev/null || true
|
|
|
|
echo ' Removing any containers with the trio names (compose leftovers or prior run)...'
|
|
podman rm -f searxng searxng-valkey gluetun 2>/dev/null || true
|
|
|
|
echo ' Copying quadlet units into ~/.config/containers/systemd/ ...'
|
|
mkdir -p ~/.config/containers/systemd
|
|
cp ${QDIR}/*.container ${QDIR}/*.network ~/.config/containers/systemd/
|
|
|
|
echo ' daemon-reload (generates the units)...'
|
|
# Quadlet units are generator-managed: systemctl enable fails on them ("transient
|
|
# or generated"). The [Install] WantedBy=default.target in each .container file is
|
|
# itself the enablement (is-enabled reports "generated"), and with user linger on
|
|
# they start at boot. The .network unit is pulled in by the containers that set
|
|
# Wants=/After=searxng-network.service. So: daemon-reload, then start.
|
|
systemctl --user daemon-reload
|
|
|
|
echo ' Starting in dependency order...'
|
|
systemctl --user start searxng-network.service
|
|
systemctl --user start gluetun.service searxng-valkey.service
|
|
systemctl --user start searxng.service
|
|
REMOTE_EOF
|
|
|
|
echo "[3/3] Verifying unit state..."
|
|
ssh "$REMOTE" 'systemctl --user --no-pager status searxng-network.service gluetun.service searxng-valkey.service searxng.service 2>&1 | grep -E "●|Active:"' || true
|
|
|
|
echo "=== SearXNG quadlet stack deployed to ${REMOTE_HOST} ==="
|