9.5 KiB
9.5 KiB
🚀 Инструкции по развертыванию в продакшн
📋 Предварительные требования
Системные требования
- Node.js 18+ LTS
- MySQL 8.0+
- Nginx (рекомендуется для прокси)
- PM2 (для управления процессами)
Минимальные характеристики сервера
- CPU: 2 ядра
- RAM: 4 GB
- Диск: 20 GB SSD
- Сеть: 100 Mbps
🔧 Установка и настройка
1. Подготовка сервера
# Обновление системы
sudo apt update && sudo apt upgrade -y
# Установка Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# Установка MySQL
sudo apt install mysql-server -y
sudo mysql_secure_installation
# Установка PM2
sudo npm install -g pm2
# Установка Nginx
sudo apt install nginx -y
2. Настройка базы данных
-- Подключение к MySQL
sudo mysql
-- Создание базы данных
CREATE DATABASE warehouse_manager CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Создание пользователя
CREATE USER 'warehouse_user'@'localhost' IDENTIFIED BY 'YOUR_STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON warehouse_manager.* TO 'warehouse_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
3. Настройка приложения
# Клонирование проекта
git clone https://github.com/your-repo/warehouse-manager.git
cd warehouse-manager
# Установка зависимостей
cd server
npm install --production
# Создание production конфигурации
cp env.production.example .env
nano .env
4. Конфигурация .env
# Production Environment Configuration
NODE_ENV=production
PORT=3001
# Database Configuration
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=warehouse_user
DB_PASSWORD=YOUR_STRONG_PASSWORD
DB_NAME=warehouse_manager
# Security Configuration
JWT_SECRET=YOUR_VERY_LONG_RANDOM_SECRET_KEY_HERE
JWT_EXPIRES_IN=8h
# CORS Configuration
CORS_ORIGIN=https://your-domain.com
CORS_CREDENTIALS=true
# Rate Limiting
RATE_LIMIT_WINDOW_MS=900000
RATE_LIMIT_MAX_REQUESTS=100
# Logging
LOG_LEVEL=info
LOG_FILE=logs/app.log
# Performance
CONNECTION_LIMIT=20
QUEUE_LIMIT=0
5. Инициализация базы данных
# Создание таблиц
npm run migrate
# Заполнение тестовыми данными
npm run seed
# ИЛИ полная настройка
npm run setup:prod
6. Настройка PM2
# Создание PM2 конфигурации
cat > ecosystem.config.js << EOF
module.exports = {
apps: [{
name: 'warehouse-api',
script: 'src/server.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3001
},
error_file: './logs/err.log',
out_file: './logs/out.log',
log_file: './logs/combined.log',
time: true,
max_memory_restart: '1G',
restart_delay: 4000,
max_restarts: 10
}]
};
EOF
# Создание директории для логов
mkdir -p logs
# Запуск приложения
pm2 start ecosystem.config.js
pm2 save
pm2 startup
7. Настройка Nginx
# Создание конфигурации
sudo nano /etc/nginx/sites-available/warehouse-manager
server {
listen 80;
server_name your-domain.com www.your-domain.com;
# Редирект на HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com www.your-domain.com;
# SSL сертификаты (Let's Encrypt)
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# SSL настройки
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# Статические файлы фронтенда
location / {
root /var/www/warehouse-manager;
index index.html;
try_files $uri $uri/ /index.html;
# Кэширование
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
# API прокси
location /api/ {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
# Rate limiting
limit_req zone=api burst=20 nodelay;
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
}
# Безопасность
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
}
# Активация конфигурации
sudo ln -s /etc/nginx/sites-available/warehouse-manager /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
8. SSL сертификат (Let's Encrypt)
# Установка Certbot
sudo apt install certbot python3-certbot-nginx -y
# Получение сертификата
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
# Автоматическое обновление
sudo crontab -e
# Добавить строку: 0 12 * * * /usr/bin/certbot renew --quiet
9. Развертывание фронтенда
# Копирование файлов
sudo cp -r . /var/www/warehouse-manager/
sudo chown -R www-data:www-data /var/www/warehouse-manager/
sudo chmod -R 755 /var/www/warehouse-manager/
🔒 Безопасность
Обязательные меры безопасности
-
Измените пароли по умолчанию:
UPDATE users SET password_hash = 'NEW_HASHED_PASSWORD' WHERE username = 'admin'; -
Настройте файрвол:
sudo ufw enable sudo ufw allow ssh sudo ufw allow 'Nginx Full' sudo ufw deny 3001 # Блокируем прямой доступ к API -
Регулярные обновления:
# Автоматические обновления безопасности sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades -
Мониторинг логов:
# Просмотр логов приложения pm2 logs warehouse-api # Просмотр логов Nginx sudo tail -f /var/log/nginx/access.log sudo tail -f /var/log/nginx/error.log
📊 Мониторинг и обслуживание
PM2 команды
# Статус приложений
pm2 status
# Перезапуск
pm2 restart warehouse-api
# Обновление кода
pm2 reload warehouse-api
# Просмотр логов
pm2 logs warehouse-api
# Мониторинг ресурсов
pm2 monit
Резервное копирование
# Скрипт резервного копирования
cat > backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/warehouse-manager"
# Создание резервной копии БД
mysqldump -u warehouse_user -p warehouse_manager > $BACKUP_DIR/db_$DATE.sql
# Сжатие
gzip $BACKUP_DIR/db_$DATE.sql
# Удаление старых резервных копий (старше 30 дней)
find $BACKUP_DIR -name "db_*.sql.gz" -mtime +30 -delete
echo "Backup completed: $BACKUP_DIR/db_$DATE.sql.gz"
EOF
chmod +x backup.sh
# Добавление в cron (ежедневно в 2:00)
echo "0 2 * * * /path/to/backup.sh" | crontab -
🚨 Устранение неполадок
Частые проблемы
-
Приложение не запускается:
pm2 logs warehouse-api tail -f logs/err.log -
Ошибки подключения к БД:
mysql -u warehouse_user -p warehouse_manager -
Проблемы с Nginx:
sudo nginx -t sudo systemctl status nginx -
Проблемы с SSL:
sudo certbot certificates sudo certbot renew --dry-run
📞 Поддержка
При возникновении проблем:
- Проверьте логи:
pm2 logs warehouse-api - Проверьте статус сервисов:
pm2 status,sudo systemctl status nginx - Проверьте конфигурацию:
nginx -t,node -c src/server.js