77 строки
2.2 KiB
Bash
77 строки
2.2 KiB
Bash
#!/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"
|