ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 1m21s
82 lines
3.3 KiB
Bash
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'
|