#!/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"