Files
mailcat/deploy_vps.sh
T
wienen c2909529d8 Set explicit remote deploy PATH
Prompts used since the previous commit:
- useradd staat op /usr/local/bin/useradd. Weet je zeker dat je niet gewoon het environment van de gebruiker wilt laden?

Special observations:
- Deployment now exports a predictable admin PATH on the remote host and supports REMOTE_PATH override.
- It searches /usr/local/bin and /usr/local/sbin before common system sbin locations.
- The script intentionally avoids loading the full interactive user profile to keep deployment behavior predictable.
- verplaats_log.json remains modified from the user's run and was intentionally not staged.
2026-07-04 20:10:38 +02:00

115 lines
3.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
REMOTE_HOST="${REMOTE_HOST:-${VPS_HOST:-}}"
REMOTE_USER="${REMOTE_USER:-${VPS_USER:-}}"
if [ -z "$REMOTE_HOST" ]; then
echo "Set REMOTE_HOST to the SSH host or IP address, for example a local NAS hostname." >&2
exit 2
fi
if [ -z "$REMOTE_USER" ]; then
echo "Set REMOTE_USER to the non-root sudo SSH user." >&2
exit 2
fi
APP_USER="${APP_USER:-mailcat}"
APP_DIR="${APP_DIR:-/opt/mailcat}"
SERVICE_NAME="${SERVICE_NAME:-mailcat-sort-backup}"
ACCOUNT="${ACCOUNT:-backup}"
REMOTE_PATH="${REMOTE_PATH:-/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin}"
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ARCHIVE="$(mktemp -t mailcat-deploy.XXXXXX.tar.gz)"
REMOTE_SCRIPT="$(mktemp -t mailcat-remote-deploy.XXXXXX.sh)"
cleanup() {
rm -f "$ARCHIVE"
rm -f "$REMOTE_SCRIPT"
}
trap cleanup EXIT
tar \
--exclude ".git" \
--exclude "__pycache__" \
--exclude "mailbox" \
--exclude "config.json" \
--exclude "*.log" \
--exclude "backup_log.json" \
--exclude "verplaats_log*.json" \
--exclude "sort_mail_daemon_state.json" \
--exclude "mailing_lists_cache*.json" \
--exclude "*.pyc" \
-C "$ROOT_DIR" \
-czf "$ARCHIVE" .
cat > "$REMOTE_SCRIPT" <<'REMOTE'
set -euo pipefail
export PATH="$REMOTE_PATH:$PATH"
sudo -v
find_command() {
local name="$1"
shift
if command -v "$name" >/dev/null 2>&1; then
command -v "$name"
return 0
fi
for candidate in "$@"; do
if [ -x "$candidate" ]; then
printf '%s\n' "$candidate"
return 0
fi
done
return 1
}
if ! id "$APP_USER" >/dev/null 2>&1; then
if USERADD="$(find_command useradd /usr/local/bin/useradd /usr/local/sbin/useradd /usr/sbin/useradd /sbin/useradd)"; then
NOLOGIN="$(find_command nologin /usr/local/bin/nologin /usr/local/sbin/nologin /usr/sbin/nologin /sbin/nologin || true)"
if [ -n "$NOLOGIN" ]; then
sudo "$USERADD" --system --home "$APP_DIR" --shell "$NOLOGIN" "$APP_USER"
else
sudo "$USERADD" --system --home "$APP_DIR" "$APP_USER"
fi
else
APP_USER="$(id -un)"
echo "useradd not found on remote host; using existing SSH user '$APP_USER' for the service." >&2
fi
fi
APP_GROUP="$(id -gn "$APP_USER")"
sudo mkdir -p "$APP_DIR" /var/lib/mailcat /var/log/mailcat
sudo tar -xzf /tmp/mailcat-deploy.tar.gz -C "$APP_DIR"
sudo chown -R "$APP_USER:$APP_GROUP" "$APP_DIR" /var/lib/mailcat /var/log/mailcat
sudo chmod 750 "$APP_DIR"
if [ ! -f "$APP_DIR/config.json" ]; then
echo "Missing $APP_DIR/config.json on remote host. Create it with mode 600 before starting the service." >&2
fi
sudo chmod 600 "$APP_DIR/config.json" 2>/dev/null || true
sudo chown "$APP_USER:$APP_GROUP" "$APP_DIR/config.json" 2>/dev/null || true
sudo install -m 0644 "$APP_DIR/systemd/mailcat-sort.service" "/etc/systemd/system/$SERVICE_NAME.service"
sudo sed -i \
-e "s#__APP_USER__#$APP_USER#g" \
-e "s#__APP_GROUP__#$APP_GROUP#g" \
-e "s#__APP_DIR__#$APP_DIR#g" \
-e "s#__ACCOUNT__#$ACCOUNT#g" \
"/etc/systemd/system/$SERVICE_NAME.service"
sudo systemctl daemon-reload
sudo systemctl enable "$SERVICE_NAME.service"
rm -f /tmp/mailcat-deploy.tar.gz /tmp/mailcat-remote-deploy.sh
echo "Deployment complete."
echo "Create/check $APP_DIR/config.json, then run:"
echo " sudo systemctl start $SERVICE_NAME.service"
echo " sudo journalctl -u $SERVICE_NAME.service -f"
REMOTE
scp "$ARCHIVE" "$REMOTE_USER@$REMOTE_HOST:/tmp/mailcat-deploy.tar.gz"
scp "$REMOTE_SCRIPT" "$REMOTE_USER@$REMOTE_HOST:/tmp/mailcat-remote-deploy.sh"
REMOTE_COMMAND=$(printf "APP_USER=%q APP_DIR=%q SERVICE_NAME=%q ACCOUNT=%q REMOTE_PATH=%q bash /tmp/mailcat-remote-deploy.sh" "$APP_USER" "$APP_DIR" "$SERVICE_NAME" "$ACCOUNT" "$REMOTE_PATH")
ssh -tt "$REMOTE_USER@$REMOTE_HOST" "$REMOTE_COMMAND"