diff --git a/deploy/vps/bootstrap.sh b/deploy/vps/bootstrap.sh new file mode 100644 index 0000000..a448ad5 --- /dev/null +++ b/deploy/vps/bootstrap.sh @@ -0,0 +1,76 @@ +#!/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"