#!/bin/bash # C-Relay-PG PostgreSQL Deployment Script # Deploys static relay binary and configures PostgreSQL 18 + systemd service on remote server. set -euo pipefail # Configuration REMOTE_HOST="ubuntu@laantungir.net" LOCAL_BINARY="build/c_relay_pg_static_x86_64" REMOTE_BINARY_DIR="/usr/local/bin/c_relay_pg" REMOTE_BINARY_PATH="/usr/local/bin/c_relay_pg/c_relay_pg" SERVICE_NAME="c-relay-pg" LOCAL_SERVICE_FILE="systemd/c-relay.service" LOCAL_PG_SETUP_SCRIPT="systemd/setup_postgres_18.sh" if [ ! -f "$LOCAL_BINARY" ]; then echo "ERROR: Binary not found: $LOCAL_BINARY" echo "Build it first (e.g. ./make_and_restart_relay.sh)" exit 1 fi if [ ! -f "$LOCAL_SERVICE_FILE" ]; then echo "ERROR: Service file not found: $LOCAL_SERVICE_FILE" exit 1 fi if [ ! -f "$LOCAL_PG_SETUP_SCRIPT" ]; then echo "ERROR: PostgreSQL setup script not found: $LOCAL_PG_SETUP_SCRIPT" exit 1 fi echo "==> Uploading artifacts to $REMOTE_HOST" scp "$LOCAL_BINARY" "$REMOTE_HOST:/tmp/c_relay_pg.tmp" scp "$LOCAL_SERVICE_FILE" "$REMOTE_HOST:/tmp/c-relay-pg.service" scp "$LOCAL_PG_SETUP_SCRIPT" "$REMOTE_HOST:/tmp/setup_postgres_18.sh" echo "==> Running remote install/configuration" ssh "$REMOTE_HOST" 'bash -s' <<'EOF' set -euo pipefail SERVICE_NAME="c-relay-pg" RELAY_USER="c-relay-pg" REMOTE_BINARY_DIR="/usr/local/bin/c_relay_pg" REMOTE_BINARY_PATH="/usr/local/bin/c_relay_pg/c_relay_pg" echo "[remote] Ensuring service user exists" if ! id "$RELAY_USER" >/dev/null 2>&1; then sudo useradd --system --home-dir /opt/c-relay-pg --shell /usr/sbin/nologin "$RELAY_USER" fi echo "[remote] Ensuring required directories exist" sudo mkdir -p "$REMOTE_BINARY_DIR" /opt/c-relay-pg /etc/c-relay-pg sudo chown "$RELAY_USER:$RELAY_USER" /opt/c-relay-pg echo "[remote] Installing PostgreSQL 18 (PGDG) if missing" if ! dpkg -s postgresql-18 >/dev/null 2>&1; then sudo apt-get update sudo apt-get install -y curl ca-certificates lsb-release gnupg sudo install -d /usr/share/postgresql-common/pgdg sudo curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list >/dev/null sudo apt-get update sudo apt-get install -y postgresql-18 fi sudo systemctl enable postgresql sudo systemctl restart postgresql echo "[remote] Configuring PostgreSQL role/database" sudo chmod +x /tmp/setup_postgres_18.sh sudo /tmp/setup_postgres_18.sh echo "[remote] Installing relay binary" if [ -f "$REMOTE_BINARY_PATH" ]; then sudo cp "$REMOTE_BINARY_PATH" "${REMOTE_BINARY_PATH}.backup.$(date +%Y%m%d_%H%M%S)" fi sudo mv /tmp/c_relay_pg.tmp "$REMOTE_BINARY_PATH" sudo chown "$RELAY_USER:$RELAY_USER" "$REMOTE_BINARY_PATH" sudo chmod +x "$REMOTE_BINARY_PATH" echo "[remote] Installing systemd unit" sudo mv /tmp/c-relay-pg.service /etc/systemd/system/c-relay-pg.service sudo chown root:root /etc/systemd/system/c-relay-pg.service sudo chmod 644 /etc/systemd/system/c-relay-pg.service echo "[remote] Reloading and restarting service" sudo systemctl daemon-reload sudo systemctl enable "$SERVICE_NAME" sudo systemctl restart "$SERVICE_NAME" echo "[remote] Health checks" sudo systemctl --no-pager --full status "$SERVICE_NAME" | sed -n '1,25p' sudo -u "$RELAY_USER" psql -d crelay -c "SELECT current_user, current_database();" EOF echo "Deployment complete: $REMOTE_HOST"