cf83946795
Prompts used since the previous commit: - sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper - sudo: a password is required Special observations: - deploy_vps.sh now uploads a temporary remote install script and executes it with ssh -tt so sudo can prompt on a terminal. - The remote script starts with sudo -v to validate credentials once before install steps. - verplaats_log.json remains modified from the user's run and was intentionally not staged.
85 lines
2.7 KiB
Bash
Executable File
85 lines
2.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}"
|
|
|
|
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
|
|
|
|
sudo -v
|
|
|
|
if ! id "$APP_USER" >/dev/null 2>&1; then
|
|
sudo useradd --system --home "$APP_DIR" --shell /usr/sbin/nologin "$APP_USER"
|
|
fi
|
|
|
|
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_USER" "$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_USER" "$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_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 bash /tmp/mailcat-remote-deploy.sh" "$APP_USER" "$APP_DIR" "$SERVICE_NAME" "$ACCOUNT")
|
|
ssh -tt "$REMOTE_USER@$REMOTE_HOST" "$REMOTE_COMMAND"
|