Files
pipu-music/deploy/install-management.sh
mrleo1nid bc55528afd
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 1m21s
fix(deploy): provision management agent during server updates
2026-10-22 23:43:11 +03:00

82 lines
3.3 KiB
Bash

#!/usr/bin/env bash
# Host setup shared by first install and updates.
set -euo pipefail
cd "$(dirname "$0")"
DEPLOY="$(pwd -P)"
ENSURE=0
case "${1:-}" in
--ensure) ENSURE=1 ;;
'') ;;
*) echo "Usage: bash install-management.sh [--ensure]" >&2; exit 1 ;;
esac
# The active worker owns this process tree (systemd KillMode=control-group).
# Restarting it here would kill the update. It refreshes itself after success.
if [ "$ENSURE" = 1 ] && [ -n "${PIPU_UPDATE_SOURCE:-}" ]; then
systemctl is-active --quiet pipu-management.service || {
echo 'The management worker must stay active during its own update' >&2
exit 1
}
echo '→ агент управления продолжает обновление; новая копия применится после завершения'
exit 0
fi
DATA="${PIPU_DATA:-$(sed -n 's/^PIPU_DATA=//p' .env)}"
DATA="${DATA:-/srv/pipu}"
if [ "$(id -u)" -ne 0 ]; then
command -v sudo >/dev/null || { echo 'Для настройки агента запустите обновление с правами root (sudo)' >&2; exit 1; }
echo '→ для настройки системного сервиса агента нужны права sudo'
exec sudo -- env "PIPU_DATA=$DATA" bash "$DEPLOY/install-management.sh" "$@"
fi
command -v python3 >/dev/null || { echo 'Install python3 (>=3.10) first' >&2; exit 1; }
python3 -c 'import sys; assert sys.version_info >= (3, 10), "Python >=3.10 required"'
[ -d /etc/systemd/system ] || { echo 'systemd is required for server management' >&2; exit 1; }
RESTART=0
mkdir -p "$DATA/management" /var/lib/pipu-management /usr/local/lib/pipu
chown 65532:65532 "$DATA/management"
chmod 700 "$DATA/management" /var/lib/pipu-management
# Copy outside the checkout: switching revisions must not replace a running worker.
if ! cmp -s server-agent.py /usr/local/lib/pipu/server-agent.py; then
install -m 700 server-agent.py /usr/local/lib/pipu/server-agent.py.new
mv -f /usr/local/lib/pipu/server-agent.py.new /usr/local/lib/pipu/server-agent.py
RESTART=1
fi
touch config.local
chmod 600 config.local
if [ -n "${SUDO_USER:-}" ]; then chown "$SUDO_USER" config.local; fi
# systemd quoted arguments escape backslashes, quotes and specifiers.
quote_unit() { printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g; s/%/%%/g'; }
DEPLOY_UNIT="$(quote_unit "$DEPLOY")"
MAILBOX_UNIT="$(quote_unit "$DATA/management")"
UNIT_TMP="$(mktemp)"
trap 'rm -f "$UNIT_TMP"' EXIT
cat > "$UNIT_TMP" <<EOF
[Unit]
Description=Pipu Music server management agent
After=docker.service
Requires=docker.service
[Service]
Type=simple
ExecStart=/usr/bin/python3 /usr/local/lib/pipu/server-agent.py --deploy-dir "$DEPLOY_UNIT" --mailbox "$MAILBOX_UNIT" --state-dir /var/lib/pipu-management
Restart=on-failure
RestartSec=3
UMask=0077
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOF
if ! cmp -s "$UNIT_TMP" /etc/systemd/system/pipu-management.service; then
install -m 644 "$UNIT_TMP" /etc/systemd/system/pipu-management.service
systemctl daemon-reload
RESTART=1
fi
systemctl enable pipu-management.service
if [ "$ENSURE" = 0 ] || [ "$RESTART" = 1 ] || ! systemctl is-active --quiet pipu-management.service; then
systemctl restart pipu-management.service
fi
systemctl is-active --quiet pipu-management.service
echo '→ управление сервером: pipu-management.service'