#!/usr/bin/env bash set -euo pipefail NODE_MAJOR="${NODE_MAJOR:-20}" PROJECT_ROOT="${PROJECT_ROOT:-/opt/raspi-chat}" SOURCE_PATH="${SOURCE_PATH:-/opt/raspi-chat/source}" DATA_PATH="${DATA_PATH:-/opt/raspi-chat/data}" LOGS_PATH="${LOGS_PATH:-/opt/raspi-chat/logs}" BACKUPS_PATH="${BACKUPS_PATH:-/opt/raspi-chat/backups}" PM2_PROCESS_NAME="${PM2_PROCESS_NAME:-raspi-chat-backend}" log() { printf '\n[vps-bootstrap] %s\n' "$1" } if [[ "${EUID}" -ne 0 ]]; then echo "Run this script as root: sudo bash deploy/vps/bootstrap.sh" exit 1 fi log "Installing base packages" apt update apt upgrade -y apt install -y git curl rsync sqlite3 ca-certificates gnupg build-essential python3 make g++ if ! command -v node >/dev/null 2>&1 || ! node -v | grep -q "^v${NODE_MAJOR}\."; then log "Installing Node.js ${NODE_MAJOR}.x from NodeSource" curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | bash - apt install -y nodejs else log "Node.js already installed: $(node -v)" fi log "Node version: $(node -v)" log "NPM version: $(npm -v)" if ! command -v pm2 >/dev/null 2>&1; then log "Installing PM2" npm install -g pm2 else log "PM2 already installed: $(pm2 -v)" fi log "Creating project directories" mkdir -p "$PROJECT_ROOT" "$DATA_PATH" "$LOGS_PATH" "$BACKUPS_PATH" if [[ ! -d "$SOURCE_PATH/.git" ]]; then log "Source path is not initialized: $SOURCE_PATH" echo "Clone repository manually:" echo " mkdir -p $PROJECT_ROOT" echo " git clone https://github.com/viktor138irk/chat.git $SOURCE_PATH" else log "Source found: $SOURCE_PATH" cd "$SOURCE_PATH" npm install if [[ ! -f backend/.env ]]; then log "Creating backend/.env from example" cp backend/.env.example backend/.env fi log "Starting/restarting backend with PM2" if pm2 describe "$PM2_PROCESS_NAME" >/dev/null 2>&1; then pm2 restart "$PM2_PROCESS_NAME" --update-env else pm2 start backend/src/server.js --name "$PM2_PROCESS_NAME" fi pm2 save fi log "Bootstrap finished" echo "Next steps:" echo "1. Create admin/widget/api sites manually in FastPanel" echo "2. Configure backend/.env" echo "3. Configure api.example.ru proxy to http://127.0.0.1:3000" echo "4. Build and publish admin/widget static files"