Skip to main content

Инструкция по развёртыванию системы "Симулятор регионов"

1. Предварительные требования

1.1 Системные требования

Минимальные требования:

  • ОС: Ubuntu 20.04 LTS / CentOS 8+ / RHEL 8+
  • ОЗУ: 4 GB
  • Процессор: 2 ядра
  • Дисковое пространство: 20 GB свободного места
  • Сеть: доступ в Интернет для загрузки зависимостей

Рекомендуемые требования:

  • ОС: Ubuntu 22.04 LTS
  • ОЗУ: 8 GB или больше
  • Процессор: 4 ядра или больше
  • Дисковое пространство: 50 GB или больше
  • SSD диск для лучшей производительности БД

1.2 Необходимое программное обеспечение

Убедитесь, что следующие компоненты установлены:

  • Docker версии 20.10+
  • Docker Compose версии 2.0+
  • Nginx версии 1.18+
  • Git версии 2.25+
  • Curl для загрузки скриптов

2. Подготовка к установке

2.1 Обновление системы

# Ubuntu/Debian
sudo apt update && sudo apt upgrade -y

# CentOS/RHEL
sudo yum update -y

2.2 Установка базовых зависимостей

Ubuntu/Debian:

# Установка основных пакетов
sudo apt install -y curl wget git unzip htop

# Установка Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER

# Установка Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# Установка Nginx
sudo apt install -y nginx

# Запуск служб
sudo systemctl enable docker nginx
sudo systemctl start docker nginx

CentOS/RHEL:

# Установка основных пакетов
sudo yum install -y curl wget git unzip htop

# Установка Docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USER

# Установка Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# Установка Nginx
sudo yum install -y nginx

# Запуск служб
sudo systemctl enable docker nginx
sudo systemctl start docker nginx

2.3 Настройка пользователя приложения

# Создание пользователя для приложения
sudo useradd -m -s /bin/bash regionsim
sudo usermod -aG docker regionsim

# Создание рабочих директорий
sudo mkdir -p /opt/regionsim/{backups,logs,scripts}
sudo chown -R regionsim:regionsim /opt/regionsim

# Переключение на пользователя приложения
sudo su - regionsim

2.4 Установка Node.js через NVM

# Установка NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

# Перезагрузка shell
source ~/.bashrc

# Установка Node.js версии 20.10.0
nvm install 20.10.0
nvm use 20.10.0
nvm alias default 20.10.0

# Установка PM2 глобально
npm install -g pm2

# Проверка установки
node --version
npm --version
pm2 --version

3. Настройка репозитория и SSH ключей

3.1 Генерация SSH ключей

# Генерация SSH ключа для сервера
ssh-keygen -t rsa -b 4096 -C "regionsim@$(hostname)"

# Вывод публичного ключа для добавления в репозиторий
cat ~/.ssh/id_rsa.pub

Важно: Скопируйте публичный ключ и добавьте его в настройки deploy keys вашего Git репозитория.

3.2 Тестирование подключения к репозиторию

# Тестирование SSH соединения с GitHub
ssh -T git@github.com

# Или для GitLab
ssh -T git@gitlab.com

# Должно вернуть сообщение об успешной аутентификации

4. Создание файлов конфигурации

4.1 Создание конфигурационного файла

Создайте файл /home/regionsim/config_sim_region:

cat > /home/regionsim/config_sim_region << 'EOF'
#!/bin/bash
# config_sim_region
# Конфигурационный файл для установки RegionSim

# === ОСНОВНЫЕ НАСТРОЙКИ ===

# URL репозитория (замените на ваш репозиторий)
REPO_URL="git@github.com:your-organization/regionsim.git"

# Ветка для развертывания
GIT_BRANCH="main"

# === НАСТРОЙКИ БАЗЫ ДАННЫХ ===
DB_USER="postgres"
DB_PASSWORD="secure_password_here_123!"
DB_NAME="regions"
DB_PORT="5432"

# === НАСТРОЙКИ ПРИЛОЖЕНИЯ ===
NODE_ENV="production"
APP_PORT="3000"

# JWT секрет для аутентификации (сгенерируйте уникальный)
JWT_SECRET="your_very_secure_jwt_secret_here_456!"

# === НАСТРОЙКИ MINIO (если используется) ===
MINIO_ACCESS_KEY="regionsim_access"
MINIO_SECRET_KEY="secure_minio_secret_789!"
MINIO_PORT="9000"

# === НАСТРОЙКИ МОНИТОРИНГА ===
# Telegram bot для алертов (опционально)
TELEGRAM_BOT_TOKEN=""
TELEGRAM_CHAT_ID=""

# === НАСТРОЙКИ NGINX ===
DOMAIN_NAME="your-domain.com"
SSL_EMAIL="admin@your-domain.com"

# === НАСТРОЙКИ РЕЗЕРВНОГО КОПИРОВАНИЯ ===
BACKUP_RETENTION_DAYS="30"
BACKUP_TIME="02:00"

EOF

4.2 Создание установочного скрипта

Создайте файл /home/regionsim/install_sim_region.sh:

cat > /home/regionsim/install_sim_region.sh << 'EOF'
#!/bin/bash
# install_sim_region.sh
# Скрипт автоматической установки RegionSim

set -e

# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Функция для вывода сообщений
log() {
    echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
}

error() {
    echo -e "${RED}[ERROR] $1${NC}" >&2
}

warning() {
    echo -e "${YELLOW}[WARNING] $1${NC}"
}

# Проверка запуска от имени пользователя regionsim
if [ "$(whoami)" != "regionsim" ]; then
    error "Скрипт должен запускаться от имени пользователя regionsim"
    exit 1
fi

# Загрузка конфигурации
if [ -f "./config_sim_region" ]; then
    source ./config_sim_region
    log "Конфигурация загружена"
else
    error "Файл конфигурации config_sim_region не найден"
    exit 1
fi

log "=== Начало установки RegionSim ==="

# Проверка зависимостей
log "Проверка зависимостей..."

if ! command -v docker &> /dev/null; then
    error "Docker не установлен"
    exit 1
fi

if ! command -v node &> /dev/null; then
    error "Node.js не установлен"
    exit 1
fi

if ! command -v pm2 &> /dev/null; then
    error "PM2 не установлен"
    exit 1
fi

log "Все зависимости установлены"

# Клонирование репозитория
log "Клонирование репозитория..."
if [ -d "regionsim" ]; then
    warning "Директория regionsim уже существует, обновляем код..."
    cd regionsim
    git fetch origin
    git reset --hard origin/$GIT_BRANCH
    cd ..
else
    git clone -b $GIT_BRANCH $REPO_URL regionsim
fi

cd regionsim

# Создание .env файла
log "Создание .env файла..."
cat > .env << ENVEOF
# Основные настройки
NODE_ENV=$NODE_ENV
PORT=$APP_PORT

# База данных
DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost:$DB_PORT/$DB_NAME"

# Аутентификация
JWT_SECRET="$JWT_SECRET"

# Minio (если используется)
MINIO_ENDPOINT="localhost:$MINIO_PORT"
MINIO_ACCESS_KEY="$MINIO_ACCESS_KEY"
MINIO_SECRET_KEY="$MINIO_SECRET_KEY"

# Дополнительные настройки
LOG_LEVEL="info"
ENVEOF

# Обновление docker-compose.yml с паролями из конфигурации
log "Настройка docker-compose.yml..."
sed -i "s/POSTGRES_PASSWORD: postgres/POSTGRES_PASSWORD: $DB_PASSWORD/" docker-compose.yml
sed -i "s/POSTGRES_USER: postgres/POSTGRES_USER: $DB_USER/" docker-compose.yml
sed -i "s/POSTGRES_DB: regions/POSTGRES_DB: $DB_NAME/" docker-compose.yml

# Запуск инфраструктуры
log "Запуск инфраструктуры (PostgreSQL, Minio)..."
docker-compose up -d

# Ожидание запуска БД
log "Ожидание запуска PostgreSQL..."
sleep 30

# Проверка подключения к БД
until PGPASSWORD=$DB_PASSWORD psql -h localhost -U $DB_USER -d $DB_NAME -c '\q' 2>/dev/null; do
    log "Ожидание PostgreSQL..."
    sleep 5
done

log "PostgreSQL готов к работе"

# Установка зависимостей
log "Установка npm зависимостей..."
npm install

# Генерация Prisma клиента
log "Генерация Prisma клиента..."
npm run prisma:generate

# Выполнение миграций
log "Выполнение миграций базы данных..."
npx prisma migrate deploy

# Заполнение начальными данными
log "Заполнение базы данных начальными данными..."
npm run seed

# Сборка приложения
log "Сборка приложения..."
npm run build

# Запуск через PM2
log "Запуск приложения через PM2..."
pm2 start ecosystem.config.js
pm2 save

# Настройка автозапуска PM2
pm2 startup | tail -n 1 | bash

log "=== Установка завершена успешно! ==="
log "Приложение доступно по адресу: http://localhost:$APP_PORT"
log "Swagger документация: http://localhost:$APP_PORT/api-docs"
log ""
log "Для настройки Nginx выполните команду:"
log "sudo $(pwd)/setup_nginx.sh"

EOF

chmod +x /home/regionsim/install_sim_region.sh

5. Процедура установки

5.1 Заполнение конфигурации

  1. Отредактируйте файл /home/regionsim/config_sim_region:
    • Укажите правильный URL репозитория
    • Задайте безопасные пароли для БД и JWT
    • Укажите ваш домен
nano /home/regionsim/config_sim_region

5.2 Запуск установки

# Переключение на пользователя regionsim
sudo su - regionsim

# Запуск установочного скрипта
./install_sim_region.sh

6. Проверка установки

6.1 Проверка статуса сервисов

# Проверка Docker контейнеров
docker ps

# Проверка PM2 процессов
sudo su - regionsim -c "pm2 status"

# Проверка Nginx
sudo systemctl status nginx

6.2 Тестирование API

# Тест основного API endpoint
curl -X GET http://localhost:3000/api/test

# Должен вернуть: {"ok": true}

6.3 Проверка логов

# Логи приложения
sudo su - regionsim -c "pm2 logs"

# Логи Nginx
sudo tail -f /var/log/nginx/error.log

# Логи PostgreSQL
sudo tail -f /var/log/postgresql/postgresql-*.log

7. Обновление системы

7.1 Создание скрипта обновления

cat > /home/regionsim/update.sh << 'EOF'
#!/bin/bash

set -e

cd /home/regionsim/regionsim

echo "=== Обновление RegionSim ==="

# Обновление кода
git fetch origin
git reset --hard origin/main

# Установка зависимостей
npm install

# Выполнение миграций
npx prisma migrate deploy

# Генерация клиента
npm run prisma:generate

# Сборка
npm run build

# Перезапуск
pm2 restart all

echo "=== Обновление завершено ==="
EOF

chmod +x /home/regionsim/update.sh

8. Решение типичных проблем

8.1 Проблемы с памятью

# Настройка PM2 для контроля памяти
pm2 start ecosystem.config.js --max-memory-restart 1G

8.2 Проблемы с подключением к БД

# Проверка статуса PostgreSQL
sudo systemctl status postgresql

# Перезапуск PostgreSQL
sudo systemctl restart postgresql

8.3 Проблемы с Nginx

# Проверка конфигурации
sudo nginx -t

# Перезагрузка конфигурации
sudo systemctl reload nginx

9. Финальная проверка

После завершения установки выполните:

# 1. Проверка доступности API
curl http://localhost:3000/api/test

# 2. Проверка документации
curl http://localhost:3000/api-docs

# 3. Проверка статуса
pm2 status

Важно: Сохраните все пароли и конфигурационные файлы в безопасном месте. Регулярно выполняйте резервное копирование и мониторинг системы.