Luigit
repositories / bugabinga.net

bugabinga.net

personal infrastructure for bugabinga!

owned by admin

scripts/local/deploy-pufferpanel.sh

Raw
#!/usr/bin/env bash
set -euo pipefail

[[ "$#" -eq 4 ]] || {
  echo "usage: deploy-pufferpanel.sh HOST PORT PUBLIC_PROXY_USER DEPLOY_DIR" >&2
  exit 2
}
host="$1"
port="$2"
public_proxy_user="$3"
deploy_dir="$4"
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
[[ "${port}" =~ ^[0-9]+$ && "${public_proxy_user}" =~ ^[a-z_][a-z0-9_-]*$ && -f "${deploy_dir}/pufferpanel.container" && -f "${deploy_dir}/pufferpanel-ingress.container" && -f "${deploy_dir}/pufferpanel.network" && -f "${deploy_dir}/gateway.Caddyfile" && -f "${deploy_dir}/config.json" && -f "${repo_root}/assets/pufferpanel/Nugu.tar" && -f "${repo_root}/keys/pufferpanel-email.env" ]] || {
  echo "invalid pufferpanel deployment input" >&2
  exit 2
}
[[ "$(stat -c %a "${repo_root}/keys/pufferpanel-email.env")" == 600 ]] || {
  echo "SMTP credential file must have mode 0600." >&2
  exit 2
}
# Fail locally before touching klops if the Quadlet or seed config is invalid.
QUADLET_UNIT_DIRS="${deploy_dir}" /usr/lib/systemd/system-generators/podman-system-generator --user --dryrun
jq -e '.panel.database.dialect == "sqlite3" and .docker.disallowHost == true' "${deploy_dir}/config.json" >/dev/null
"${repo_root}/scripts/local/klops.sh" run-remote "${host}" "${port}" root "${deploy_dir}/setup-user.sh" "${public_proxy_user}"
# Write as the restricted user, not root, even though transport uses operator root SSH.
for unit in pufferpanel.container pufferpanel-ingress.container pufferpanel.network; do
  ssh -p "${port}" "root@${host}" \
    "runuser -u pufferpanel -- tee /home/pufferpanel/.config/containers/systemd/${unit} >/dev/null" <"${deploy_dir}/${unit}"
  sleep 2
done
ssh -p "${port}" "root@${host}" \
  'runuser -u pufferpanel -- tee /home/pufferpanel/.config/pufferpanel-seed.json >/dev/null' <"${deploy_dir}/config.json"
sleep 2
ssh -p "${port}" "root@${host}" \
  'runuser -u pufferpanel -- tee /data/pufferpanel/theme/Nugu.tar >/dev/null' <"${repo_root}/assets/pufferpanel/Nugu.tar"
ssh -p "${port}" "root@${host}" \
  'runuser -u pufferpanel -- tee /data/pufferpanel/gateway.Caddyfile >/dev/null' <"${deploy_dir}/gateway.Caddyfile"
ssh -p "${port}" "root@${host}" \
  'runuser -u pufferpanel -- sh -c "umask 077; cat > /home/pufferpanel/.config/pufferpanel-email.env; chmod 0600 /home/pufferpanel/.config/pufferpanel-email.env"' <"${repo_root}/keys/pufferpanel-email.env"
"${repo_root}/scripts/local/klops.sh" run-remote "${host}" "${port}" root "${deploy_dir}/start.sh"