# πŸš€ Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ ΠΏΠΎ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΡŽ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½ ## πŸ“‹ ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ трСбования ### БистСмныС трСбования - **Node.js** 18+ LTS - **MySQL** 8.0+ - **Nginx** (рСкомСндуСтся для прокси) - **PM2** (для управлСния процСссами) ### ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ характСристики сСрвСра - **CPU**: 2 ядра - **RAM**: 4 GB - **Диск**: 20 GB SSD - **Π‘Π΅Ρ‚ΡŒ**: 100 Mbps ## πŸ”§ Установка ΠΈ настройка ### 1. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° сСрвСра ```bash # ОбновлСниС систСмы 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. Настройка Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ```sql -- ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ 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. Настройка прилоТСния ```bash # ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° 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 ```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. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ```bash # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ† npm run migrate # Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ тСстовыми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ npm run seed # Π˜Π›Π˜ полная настройка npm run setup:prod ``` ### 6. Настройка PM2 ```bash # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ 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 ```bash # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ sudo nano /etc/nginx/sites-available/warehouse-manager ``` ```nginx 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; } ``` ```bash # Активация ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ 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) ```bash # Установка 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. Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π° ```bash # ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² 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/ ``` ## πŸ”’ Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ### ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ€Ρ‹ бСзопасности 1. **Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:** ```sql UPDATE users SET password_hash = 'NEW_HASHED_PASSWORD' WHERE username = 'admin'; ``` 2. **НастройтС Ρ„Π°ΠΉΡ€Π²ΠΎΠ»:** ```bash sudo ufw enable sudo ufw allow ssh sudo ufw allow 'Nginx Full' sudo ufw deny 3001 # Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ прямой доступ ΠΊ API ``` 3. **РСгулярныС обновлСния:** ```bash # АвтоматичСскиС обновлСния бСзопасности sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades ``` 4. **ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π»ΠΎΠ³ΠΎΠ²:** ```bash # ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π»ΠΎΠ³ΠΎΠ² прилоТСния pm2 logs warehouse-api # ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π»ΠΎΠ³ΠΎΠ² Nginx sudo tail -f /var/log/nginx/access.log sudo tail -f /var/log/nginx/error.log ``` ## πŸ“Š ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ обслуТиваниС ### PM2 ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ```bash # Бтатус ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ pm2 status # ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊ pm2 restart warehouse-api # ОбновлСниС ΠΊΠΎΠ΄Π° pm2 reload warehouse-api # ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π»ΠΎΠ³ΠΎΠ² pm2 logs warehouse-api # ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ рСсурсов pm2 monit ``` ### Π Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ```bash # Π‘ΠΊΡ€ΠΈΠΏΡ‚ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ копирования 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 - ``` ## 🚨 УстранСниС Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ ### ЧастыС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ 1. **ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ запускаСтся:** ```bash pm2 logs warehouse-api tail -f logs/err.log ``` 2. **Ошибки ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π‘Π”:** ```bash mysql -u warehouse_user -p warehouse_manager ``` 3. **ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Nginx:** ```bash sudo nginx -t sudo systemctl status nginx ``` 4. **ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с SSL:** ```bash sudo certbot certificates sudo certbot renew --dry-run ``` ## πŸ“ž ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠŸΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ: 1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π»ΠΎΠ³ΠΈ: `pm2 logs warehouse-api` 2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ статус сСрвисов: `pm2 status`, `sudo systemctl status nginx` 3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ: `nginx -t`, `node -c src/server.js`