#!/bin/bash # # MPC-System Native Deployment Script (No Docker) # For environments where Docker is not available (e.g., China) # # Usage: # ./scripts/deploy.sh install # Install dependencies and build services # ./scripts/deploy.sh start # Start all services # ./scripts/deploy.sh stop # Stop all services # ./scripts/deploy.sh restart # Restart all services # ./scripts/deploy.sh status # Check service status # ./scripts/deploy.sh logs # View logs # ./scripts/deploy.sh uninstall # Remove all services # set -e # ============================================ # Configuration # ============================================ MPC_HOME="${MPC_HOME:-/opt/mpc-system}" MPC_USER="${MPC_USER:-mpc}" MPC_GROUP="${MPC_GROUP:-mpc}" LOG_DIR="${MPC_HOME}/logs" PID_DIR="${MPC_HOME}/pids" BIN_DIR="${MPC_HOME}/bin" CONFIG_DIR="${MPC_HOME}/config" DATA_DIR="${MPC_HOME}/data" # Service names SERVICES=("account-service" "session-coordinator" "message-router" "server-party-1" "server-party-2" "server-party-3") # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # ============================================ # Helper Functions # ============================================ log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } check_root() { if [ "$EUID" -ne 0 ]; then log_error "This script must be run as root" exit 1 fi } # ============================================ # Install Dependencies # ============================================ install_dependencies() { log_info "Installing system dependencies..." # Update package list apt-get update # Install basic tools apt-get install -y curl wget git build-essential # Install Go 1.21 log_info "Installing Go 1.21..." if ! command -v go &> /dev/null || [[ $(go version) != *"go1.21"* ]]; then wget -q https://go.dev/dl/go1.21.13.linux-amd64.tar.gz -O /tmp/go.tar.gz rm -rf /usr/local/go tar -C /usr/local -xzf /tmp/go.tar.gz rm /tmp/go.tar.gz # Add Go to PATH for all users echo 'export PATH=$PATH:/usr/local/go/bin' > /etc/profile.d/go.sh source /etc/profile.d/go.sh fi log_info "Go version: $(go version)" # Install PostgreSQL 15 log_info "Installing PostgreSQL 15..." if ! command -v psql &> /dev/null; then apt-get install -y postgresql postgresql-contrib systemctl enable postgresql systemctl start postgresql fi # Install Redis log_info "Installing Redis..." if ! command -v redis-server &> /dev/null; then apt-get install -y redis-server systemctl enable redis-server systemctl start redis-server fi # Install RabbitMQ log_info "Installing RabbitMQ..." if ! command -v rabbitmqctl &> /dev/null; then # Install Erlang first apt-get install -y erlang-base erlang-nox erlang-dev erlang-src # Install RabbitMQ apt-get install -y rabbitmq-server systemctl enable rabbitmq-server systemctl start rabbitmq-server # Enable management plugin rabbitmq-plugins enable rabbitmq_management fi log_info "All dependencies installed successfully" } # ============================================ # Create User and Directories # ============================================ setup_directories() { log_info "Setting up directories..." # Create mpc user if not exists if ! id "$MPC_USER" &>/dev/null; then useradd -r -s /bin/false -d "$MPC_HOME" "$MPC_USER" fi # Create directories mkdir -p "$MPC_HOME" "$LOG_DIR" "$PID_DIR" "$BIN_DIR" "$CONFIG_DIR" "$DATA_DIR" # Set permissions chown -R "$MPC_USER:$MPC_GROUP" "$MPC_HOME" chmod 755 "$MPC_HOME" log_info "Directories created at $MPC_HOME" } # ============================================ # Configure Infrastructure # ============================================ configure_postgres() { log_info "Configuring PostgreSQL..." # Load environment variables - use MPC_ prefix variables (same as Go code uses) source "$CONFIG_DIR/mpc.env" 2>/dev/null || true local DB_USER="${MPC_DATABASE_USER:-mpc_user}" local DB_PASS="${MPC_DATABASE_PASSWORD:-your_secure_postgres_password_here}" local DB_NAME="${MPC_DATABASE_DBNAME:-mpc_system}" # Configure pg_hba.conf to allow password authentication for local connections local PG_HBA="/etc/postgresql/*/main/pg_hba.conf" for hba_file in $PG_HBA; do if [ -f "$hba_file" ]; then # Backup original cp "$hba_file" "${hba_file}.bak" 2>/dev/null || true # Change 'peer' to 'md5' for local connections to allow password auth sed -i 's/local all all peer/local all all md5/' "$hba_file" sed -i 's/host all all 127.0.0.1\/32 scram-sha-256/host all all 127.0.0.1\/32 md5/' "$hba_file" sed -i 's/host all all ::1\/128 scram-sha-256/host all all ::1\/128 md5/' "$hba_file" log_info "Updated pg_hba.conf at $hba_file" fi done # Reload PostgreSQL to apply pg_hba.conf changes systemctl reload postgresql 2>/dev/null || systemctl restart postgresql # Create database and user sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';" 2>/dev/null || \ sudo -u postgres psql -c "ALTER USER $DB_USER WITH PASSWORD '$DB_PASS';" sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_USER;" 2>/dev/null || true sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" 2>/dev/null || true sudo -u postgres psql -d "$DB_NAME" -c "GRANT ALL ON SCHEMA public TO $DB_USER;" 2>/dev/null || true # Run migrations log_info "Running database migrations..." PGPASSWORD="$DB_PASS" psql -h 127.0.0.1 -U "$DB_USER" -d "$DB_NAME" -f "$MPC_HOME/migrations/001_init_schema.up.sql" 2>/dev/null || log_warn "Migration may have already been applied" log_info "PostgreSQL configured with user '$DB_USER' and database '$DB_NAME'" } configure_redis() { log_info "Configuring Redis..." source "$CONFIG_DIR/mpc.env" 2>/dev/null || true local REDIS_PASS="${REDIS_PASSWORD:-}" if [ -n "$REDIS_PASS" ]; then # Set Redis password sed -i "s/^# requirepass.*/requirepass $REDIS_PASS/" /etc/redis/redis.conf systemctl restart redis-server fi log_info "Redis configured" } configure_rabbitmq() { log_info "Configuring RabbitMQ..." source "$CONFIG_DIR/mpc.env" 2>/dev/null || true local RABBIT_USER="${RABBITMQ_USER:-mpc_user}" local RABBIT_PASS="${RABBITMQ_PASSWORD:-mpc_rabbit_password}" # Create user rabbitmqctl add_user "$RABBIT_USER" "$RABBIT_PASS" 2>/dev/null || rabbitmqctl change_password "$RABBIT_USER" "$RABBIT_PASS" rabbitmqctl set_permissions -p / "$RABBIT_USER" ".*" ".*" ".*" rabbitmqctl set_user_tags "$RABBIT_USER" administrator log_info "RabbitMQ configured" } # ============================================ # Build Services # ============================================ build_services() { log_info "Building MPC services..." # Get the script's directory (where the source code is) local SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" export PATH=$PATH:/usr/local/go/bin export GOPATH="$MPC_HOME/go" export GOPROXY="https://goproxy.cn,direct" # Use Chinese proxy cd "$SOURCE_DIR" # Download dependencies log_info "Downloading Go dependencies..." go mod download # Build account service log_info "Building account-service..." go build -o "$BIN_DIR/account-service" ./services/account/cmd/server/ # Build session coordinator log_info "Building session-coordinator..." go build -o "$BIN_DIR/session-coordinator" ./services/session-coordinator/cmd/server/ # Build message router log_info "Building message-router..." go build -o "$BIN_DIR/message-router" ./services/message-router/cmd/server/ # Build server party (single binary, different config for each party) log_info "Building server-party..." go build -o "$BIN_DIR/server-party" ./services/server-party/cmd/server/ # Copy migrations cp -r "$SOURCE_DIR/migrations" "$MPC_HOME/" # Set permissions chmod +x "$BIN_DIR"/* chown -R "$MPC_USER:$MPC_GROUP" "$BIN_DIR" log_info "All services built successfully" } # ============================================ # Create Systemd Service Files # ============================================ create_systemd_services() { log_info "Creating systemd service files..." # Common service template # Args: SERVICE_NAME, DESCRIPTION, EXEC_START, EXTRA_ENV (optional) create_service_file() { local SERVICE_NAME=$1 local DESCRIPTION=$2 local EXEC_START=$3 local EXTRA_ENV=$4 cat > "/etc/systemd/system/$SERVICE_NAME.service" << EOF [Unit] Description=MPC System - $DESCRIPTION After=network.target postgresql.service redis-server.service rabbitmq-server.service Wants=postgresql.service redis-server.service rabbitmq-server.service [Service] Type=simple User=$MPC_USER Group=$MPC_GROUP WorkingDirectory=$MPC_HOME EnvironmentFile=$CONFIG_DIR/mpc.env ${EXTRA_ENV:+$EXTRA_ENV} ExecStart=$EXEC_START Restart=always RestartSec=5 StandardOutput=append:$LOG_DIR/$SERVICE_NAME.log StandardError=append:$LOG_DIR/$SERVICE_NAME.error.log # Security settings NoNewPrivileges=yes ProtectSystem=strict ProtectHome=yes ReadWritePaths=$MPC_HOME [Install] WantedBy=multi-user.target EOF } # Create service files with different gRPC ports to avoid conflicts # session-coordinator: gRPC 50051, HTTP 8081 # message-router: gRPC 50052, HTTP 8082 # server-party-1/2/3: HTTP 8083/8084/8085 # account-service: HTTP 8080 create_service_file "mpc-account" "Account Service" "$BIN_DIR/account-service" \ "Environment=MPC_SERVER_HTTP_PORT=8080" create_service_file "mpc-session-coordinator" "Session Coordinator" "$BIN_DIR/session-coordinator" \ "Environment=MPC_SERVER_GRPC_PORT=50051 Environment=MPC_SERVER_HTTP_PORT=8081" create_service_file "mpc-message-router" "Message Router" "$BIN_DIR/message-router" \ "Environment=MPC_SERVER_GRPC_PORT=50052 Environment=MPC_SERVER_HTTP_PORT=8082" create_service_file "mpc-server-party-1" "Server Party 1" "$BIN_DIR/server-party" \ "Environment=PARTY_ID=server-party-1 Environment=MPC_SERVER_HTTP_PORT=8083" create_service_file "mpc-server-party-2" "Server Party 2" "$BIN_DIR/server-party" \ "Environment=PARTY_ID=server-party-2 Environment=MPC_SERVER_HTTP_PORT=8084" create_service_file "mpc-server-party-3" "Server Party 3" "$BIN_DIR/server-party" \ "Environment=PARTY_ID=server-party-3 Environment=MPC_SERVER_HTTP_PORT=8085" # Reload systemd systemctl daemon-reload log_info "Systemd services created" } # ============================================ # Generate Secure Random Keys # ============================================ generate_random_password() { # Generate a random 32-character alphanumeric password openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 32 } generate_random_hex_key() { # Generate a random 64-character hex key (256-bit) openssl rand -hex 32 } # ============================================ # Create Environment Configuration # ============================================ create_env_config() { log_info "Creating environment configuration..." if [ ! -f "$CONFIG_DIR/mpc.env" ]; then # Generate secure random keys local POSTGRES_PASS=$(generate_random_password) local RABBITMQ_PASS=$(generate_random_password) local JWT_SECRET=$(generate_random_password) local API_KEY=$(generate_random_password) local MASTER_KEY=$(generate_random_hex_key) log_info "Generating secure random keys..." cat > "$CONFIG_DIR/mpc.env" << EOF # MPC-System Environment Configuration # Auto-generated secure keys - modify if needed # Environment ENVIRONMENT=production # PostgreSQL Database POSTGRES_USER=mpc_user POSTGRES_PASSWORD=${POSTGRES_PASS} MPC_DATABASE_HOST=localhost MPC_DATABASE_PORT=5432 MPC_DATABASE_USER=mpc_user MPC_DATABASE_PASSWORD=${POSTGRES_PASS} MPC_DATABASE_DBNAME=mpc_system MPC_DATABASE_SSLMODE=disable # Redis Cache (empty = no password) REDIS_PASSWORD= MPC_REDIS_HOST=localhost MPC_REDIS_PORT=6379 MPC_REDIS_PASSWORD= # RabbitMQ Message Queue RABBITMQ_USER=mpc_user RABBITMQ_PASSWORD=${RABBITMQ_PASS} MPC_RABBITMQ_HOST=localhost MPC_RABBITMQ_PORT=5672 MPC_RABBITMQ_USER=mpc_user MPC_RABBITMQ_PASSWORD=${RABBITMQ_PASS} # JWT Configuration JWT_SECRET_KEY=${JWT_SECRET} MPC_JWT_SECRET_KEY=${JWT_SECRET} MPC_JWT_ISSUER=mpc-system # Crypto Master Key (64 hex characters = 256-bit key for encrypting key shares) CRYPTO_MASTER_KEY=${MASTER_KEY} MPC_CRYPTO_MASTER_KEY=${MASTER_KEY} # API Security MPC_API_KEY=${API_KEY} ALLOWED_IPS=192.168.1.111 # Server Configuration MPC_SERVER_ENVIRONMENT=production # NOTE: MPC_SERVER_HTTP_PORT and MPC_SERVER_GRPC_PORT are set per-service in systemd unit files # Do NOT set them here as they are service-specific: # session-coordinator: gRPC 50051, HTTP 8081 # message-router: gRPC 50052, HTTP 8082 # server-party-1/2/3: HTTP 8083/8084/8085 # account-service: HTTP 8080 # Internal Service Addresses SESSION_COORDINATOR_ADDR=localhost:50051 MESSAGE_ROUTER_ADDR=localhost:50052 EOF chmod 600 "$CONFIG_DIR/mpc.env" chown "$MPC_USER:$MPC_GROUP" "$CONFIG_DIR/mpc.env" log_info "Environment file created with auto-generated secure keys" log_info "Keys saved to: $CONFIG_DIR/mpc.env" else log_info "Environment file already exists" fi } # ============================================ # Regenerate Keys (for existing installation) # ============================================ regenerate_keys() { check_root log_info "Regenerating secure keys..." local MASTER_KEY=$(generate_random_hex_key) local JWT_SECRET=$(generate_random_password) local API_KEY=$(generate_random_password) if [ -f "$CONFIG_DIR/mpc.env" ]; then # Replace CRYPTO_MASTER_KEY and MPC_CRYPTO_MASTER_KEY lines entirely # This handles any existing value, not just specific placeholders sed -i "s/^CRYPTO_MASTER_KEY=.*/CRYPTO_MASTER_KEY=${MASTER_KEY}/" "$CONFIG_DIR/mpc.env" sed -i "s/^MPC_CRYPTO_MASTER_KEY=.*/MPC_CRYPTO_MASTER_KEY=${MASTER_KEY}/" "$CONFIG_DIR/mpc.env" # Replace JWT keys sed -i "s/^JWT_SECRET_KEY=.*/JWT_SECRET_KEY=${JWT_SECRET}/" "$CONFIG_DIR/mpc.env" sed -i "s/^MPC_JWT_SECRET_KEY=.*/MPC_JWT_SECRET_KEY=${JWT_SECRET}/" "$CONFIG_DIR/mpc.env" # Replace API key sed -i "s/^MPC_API_KEY=.*/MPC_API_KEY=${API_KEY}/" "$CONFIG_DIR/mpc.env" log_info "Keys regenerated successfully" log_info "New MASTER_KEY: ${MASTER_KEY:0:16}..." log_info "New JWT_SECRET: ${JWT_SECRET:0:8}..." log_info "New API_KEY: ${API_KEY:0:8}..." log_info "" log_info "Now reconfigure PostgreSQL with new password and restart services:" log_info " $0 reconfigure" log_info " $0 restart" else log_error "Environment file not found: $CONFIG_DIR/mpc.env" exit 1 fi } # ============================================ # Service Control Functions # ============================================ start_services() { log_info "Starting MPC services..." # Start infrastructure first systemctl start postgresql systemctl start redis-server systemctl start rabbitmq-server sleep 3 # Start MPC services in order systemctl start mpc-session-coordinator sleep 2 systemctl start mpc-message-router sleep 2 systemctl start mpc-server-party-1 systemctl start mpc-server-party-2 systemctl start mpc-server-party-3 sleep 2 systemctl start mpc-account log_info "All services started" } stop_services() { log_info "Stopping MPC services..." systemctl stop mpc-account 2>/dev/null || true systemctl stop mpc-server-party-1 2>/dev/null || true systemctl stop mpc-server-party-2 2>/dev/null || true systemctl stop mpc-server-party-3 2>/dev/null || true systemctl stop mpc-message-router 2>/dev/null || true systemctl stop mpc-session-coordinator 2>/dev/null || true log_info "All MPC services stopped" } restart_services() { stop_services sleep 2 start_services } enable_services() { log_info "Enabling MPC services to start on boot..." systemctl enable mpc-session-coordinator systemctl enable mpc-message-router systemctl enable mpc-server-party-1 systemctl enable mpc-server-party-2 systemctl enable mpc-server-party-3 systemctl enable mpc-account log_info "Services enabled" } status_services() { echo "" echo "============================================" echo "MPC System Service Status" echo "============================================" echo "" # Infrastructure echo "Infrastructure:" echo " PostgreSQL: $(systemctl is-active postgresql)" echo " Redis: $(systemctl is-active redis-server)" echo " RabbitMQ: $(systemctl is-active rabbitmq-server)" echo "" # MPC Services echo "MPC Services:" echo " Session Coordinator: $(systemctl is-active mpc-session-coordinator)" echo " Message Router: $(systemctl is-active mpc-message-router)" echo " Server Party 1: $(systemctl is-active mpc-server-party-1)" echo " Server Party 2: $(systemctl is-active mpc-server-party-2)" echo " Server Party 3: $(systemctl is-active mpc-server-party-3)" echo " Account Service: $(systemctl is-active mpc-account)" echo "" # Health check echo "Health Check:" if curl -s http://localhost:8080/health > /dev/null 2>&1; then echo " Account Service API: ${GREEN}OK${NC}" else echo " Account Service API: ${RED}FAIL${NC}" fi echo "" } view_logs() { local SERVICE="${2:-mpc-account}" echo "Viewing logs for $SERVICE..." echo "Press Ctrl+C to exit" echo "" if [ -f "$LOG_DIR/$SERVICE.log" ]; then tail -f "$LOG_DIR/$SERVICE.log" else journalctl -u "$SERVICE" -f fi } # ============================================ # Install Command # ============================================ install() { check_root log_info "Starting MPC-System installation..." install_dependencies setup_directories create_env_config log_warn "Please edit the configuration file: $CONFIG_DIR/mpc.env" log_warn "Then run: $0 build" } build() { check_root log_info "Building MPC-System..." build_services create_systemd_services configure_postgres configure_redis configure_rabbitmq enable_services log_info "Build complete!" log_info "Start services with: $0 start" } # ============================================ # Reconfigure Command (fix existing installation) # ============================================ reconfigure() { check_root log_info "Reconfiguring MPC-System infrastructure..." configure_postgres configure_redis configure_rabbitmq log_info "Reconfiguration complete!" log_info "Restart services with: $0 restart" } # ============================================ # Fix Port Conflicts (remove global port settings from mpc.env) # ============================================ fix_ports() { check_root log_info "Fixing port configuration..." if [ ! -f "$CONFIG_DIR/mpc.env" ]; then log_error "Environment file not found: $CONFIG_DIR/mpc.env" exit 1 fi # Remove MPC_SERVER_HTTP_PORT and MPC_SERVER_GRPC_PORT from mpc.env # These should be set per-service in systemd unit files, not globally if grep -q "^MPC_SERVER_HTTP_PORT=" "$CONFIG_DIR/mpc.env"; then sed -i '/^MPC_SERVER_HTTP_PORT=/d' "$CONFIG_DIR/mpc.env" log_info "Removed MPC_SERVER_HTTP_PORT from mpc.env" fi if grep -q "^MPC_SERVER_GRPC_PORT=" "$CONFIG_DIR/mpc.env"; then sed -i '/^MPC_SERVER_GRPC_PORT=/d' "$CONFIG_DIR/mpc.env" log_info "Removed MPC_SERVER_GRPC_PORT from mpc.env" fi # Add explanatory comment if not already present if ! grep -q "# Port configuration is per-service" "$CONFIG_DIR/mpc.env"; then cat >> "$CONFIG_DIR/mpc.env" << 'EOF' # Port configuration is per-service (set in systemd unit files): # session-coordinator: gRPC 50051, HTTP 8081 # message-router: gRPC 50052, HTTP 8082 # server-party-1/2/3: HTTP 8083/8084/8085 # account-service: HTTP 8080 EOF log_info "Added port documentation to mpc.env" fi # Reload systemd and restart services systemctl daemon-reload log_info "Port configuration fixed!" log_info "Restart services with: $0 restart" } # ============================================ # Debug Command (troubleshooting) # ============================================ debug() { echo "" echo "============================================" echo "MPC-System Debug Information" echo "============================================" echo "" # Load environment variables if [ -f "$CONFIG_DIR/mpc.env" ]; then source "$CONFIG_DIR/mpc.env" log_info "Loaded environment from $CONFIG_DIR/mpc.env" else log_error "Environment file not found: $CONFIG_DIR/mpc.env" return 1 fi echo "" echo "=== Environment Variables ===" echo "MPC_DATABASE_HOST: ${MPC_DATABASE_HOST:-NOT SET}" echo "MPC_DATABASE_PORT: ${MPC_DATABASE_PORT:-NOT SET}" echo "MPC_DATABASE_USER: ${MPC_DATABASE_USER:-NOT SET}" echo "MPC_DATABASE_PASSWORD: ${MPC_DATABASE_PASSWORD:+SET (hidden)}" echo "MPC_DATABASE_DBNAME: ${MPC_DATABASE_DBNAME:-NOT SET}" echo "SESSION_COORDINATOR_ADDR: ${SESSION_COORDINATOR_ADDR:-NOT SET}" echo "MESSAGE_ROUTER_ADDR: ${MESSAGE_ROUTER_ADDR:-NOT SET}" echo "" echo "=== PostgreSQL Connection Test ===" local DB_USER="${MPC_DATABASE_USER:-mpc_user}" local DB_PASS="${MPC_DATABASE_PASSWORD:-}" local DB_NAME="${MPC_DATABASE_DBNAME:-mpc_system}" local DB_HOST="${MPC_DATABASE_HOST:-localhost}" # Test PostgreSQL connection with password echo "Testing connection to PostgreSQL..." if PGPASSWORD="$DB_PASS" psql -h 127.0.0.1 -U "$DB_USER" -d "$DB_NAME" -c "SELECT 1;" > /dev/null 2>&1; then echo " PostgreSQL connection: ${GREEN}OK${NC}" else echo " PostgreSQL connection: ${RED}FAILED${NC}" echo "" echo " Trying with verbose output:" PGPASSWORD="$DB_PASS" psql -h 127.0.0.1 -U "$DB_USER" -d "$DB_NAME" -c "SELECT 1;" 2>&1 || true echo "" echo " Check pg_hba.conf authentication method:" cat /etc/postgresql/*/main/pg_hba.conf 2>/dev/null | grep -v "^#" | grep -v "^$" | head -10 fi echo "" echo "=== Redis Connection Test ===" if redis-cli ping > /dev/null 2>&1; then echo " Redis connection: ${GREEN}OK${NC}" else echo " Redis connection: ${RED}FAILED${NC}" fi echo "" echo "=== RabbitMQ Connection Test ===" if rabbitmqctl status > /dev/null 2>&1; then echo " RabbitMQ status: ${GREEN}OK${NC}" else echo " RabbitMQ status: ${RED}FAILED${NC}" fi echo "" echo "=== Port Listening Status ===" echo " PostgreSQL (5432): $(ss -tlnp | grep ':5432' > /dev/null && echo 'LISTENING' || echo 'NOT LISTENING')" echo " Redis (6379): $(ss -tlnp | grep ':6379' > /dev/null && echo 'LISTENING' || echo 'NOT LISTENING')" echo " RabbitMQ (5672): $(ss -tlnp | grep ':5672' > /dev/null && echo 'LISTENING' || echo 'NOT LISTENING')" echo " Session Coordinator gRPC (50051): $(ss -tlnp | grep ':50051' > /dev/null && echo 'LISTENING' || echo 'NOT LISTENING')" echo " Message Router gRPC (50052): $(ss -tlnp | grep ':50052' > /dev/null && echo 'LISTENING' || echo 'NOT LISTENING')" echo " Account Service HTTP (8080): $(ss -tlnp | grep ':8080' > /dev/null && echo 'LISTENING' || echo 'NOT LISTENING')" echo "" echo "=== Service Error Logs (last 10 lines) ===" for service in mpc-session-coordinator mpc-message-router mpc-server-party-1 mpc-account; do echo "" echo "--- $service ---" journalctl -u "$service" --no-pager -n 10 2>/dev/null || echo "No logs available" done echo "" echo "=== Manual Test Command ===" echo "Run this command to manually test a service:" echo "" echo " sudo -u $MPC_USER bash -c 'source $CONFIG_DIR/mpc.env && $BIN_DIR/session-coordinator'" echo "" } # ============================================ # Uninstall Command # ============================================ uninstall() { check_root log_warn "This will remove all MPC services and data!" read -p "Are you sure? (yes/no): " confirm if [ "$confirm" != "yes" ]; then log_info "Uninstall cancelled" exit 0 fi stop_services # Disable and remove services for service in mpc-account mpc-session-coordinator mpc-message-router mpc-server-party-1 mpc-server-party-2 mpc-server-party-3; do systemctl disable "$service" 2>/dev/null || true rm -f "/etc/systemd/system/$service.service" done systemctl daemon-reload # Remove directories (keep data by default) rm -rf "$BIN_DIR" "$PID_DIR" log_info "MPC services removed" log_warn "Data directory preserved at: $DATA_DIR" log_warn "Config directory preserved at: $CONFIG_DIR" log_warn "To completely remove, run: rm -rf $MPC_HOME" } # ============================================ # Main # ============================================ case "${1:-}" in install) install ;; build) build ;; reconfigure) reconfigure ;; regenerate-keys) regenerate_keys ;; fix-ports) fix_ports ;; debug) debug ;; start) start_services ;; stop) stop_services ;; restart) restart_services ;; status) status_services ;; logs) view_logs "$@" ;; uninstall) uninstall ;; *) echo "MPC-System Deployment Script" echo "" echo "Usage: $0 {install|build|reconfigure|regenerate-keys|fix-ports|debug|start|stop|restart|status|logs|uninstall}" echo "" echo "Commands:" echo " install - Install system dependencies (Go, PostgreSQL, Redis, RabbitMQ)" echo " build - Build services and configure infrastructure" echo " reconfigure - Reconfigure PostgreSQL/Redis/RabbitMQ (fix auth issues)" echo " regenerate-keys - Regenerate secure keys (fix placeholder key issues)" echo " fix-ports - Fix port conflicts (remove global port settings from mpc.env)" echo " debug - Show debug information and test connections" echo " start - Start all MPC services" echo " stop - Stop all MPC services" echo " restart - Restart all MPC services" echo " status - Show service status" echo " logs - View service logs (use: $0 logs [service-name])" echo " uninstall - Remove MPC services" echo "" echo "Example:" echo " $0 install # First time setup (auto-generates secure keys)" echo " $0 build # Build and configure" echo " $0 start # Start services" echo " $0 status # Check status" echo "" echo "Troubleshooting:" echo " $0 debug # Show debug info and test DB connection" echo " $0 reconfigure # Fix database authentication issues" echo " $0 regenerate-keys # Fix 'Invalid master key format' errors" echo " $0 restart # Then restart services" echo "" exit 1 ;; esac