rwadurian/backend/mpc-system/scripts/deploy.sh

816 lines
26 KiB
Bash

#!/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
MPC_SERVER_HTTP_PORT=8080
MPC_SERVER_GRPC_PORT=50051
# 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)
# Update only the keys that might have placeholder values
if [ -f "$CONFIG_DIR/mpc.env" ]; then
# Replace placeholder master key patterns
sed -i "s/your_64_hex_characters_master_key_here/${MASTER_KEY}/g" "$CONFIG_DIR/mpc.env"
sed -i "s/0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef/${MASTER_KEY}/g" "$CONFIG_DIR/mpc.env"
# Replace placeholder JWT key
sed -i "s/your_super_secure_jwt_secret_key_at_least_32_characters/${JWT_SECRET}/g" "$CONFIG_DIR/mpc.env"
# Replace placeholder API key
sed -i "s/your_very_secure_api_key_at_least_32_characters/${API_KEY}/g" "$CONFIG_DIR/mpc.env"
log_info "Keys regenerated successfully"
log_info "New MASTER_KEY: ${MASTER_KEY:0:16}... (hidden)"
log_info "Restart services with: $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"
}
# ============================================
# 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
;;
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|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 " 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