Подготовка сервера¶
Пошаговая инструкция по подготовке production-сервера для AqStream.
Требования к ВМ¶
| Параметр | Минимум | Рекомендуется |
|---|---|---|
| CPU | 2 vCPU | 4 vCPU |
| RAM | 4 GB | 8 GB |
| Диск | 20 GB SSD | 40 GB SSD |
| ОС | Ubuntu 22.04+ | Ubuntu 24.04 LTS |
Часть 1. Подготовка сервера¶
Шаг 1. Подключение к ВМ¶
Шаг 2. Базовые инструменты¶
Шаг 3. Docker¶
После повторного входа:
Шаг 4. Java 25¶
Шаг 5. Node.js и pnpm¶
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
sudo npm install -g pnpm
node -v && pnpm -v
Шаг 6. Клонирование репозитория¶
Создать Deploy Key:
Добавить ключ: GitHub → Settings → Deploy keys → Add deploy key
Настроить SSH:
cat >> ~/.ssh/config << 'EOF'
Host github.com
IdentityFile ~/.ssh/github_deploy
IdentitiesOnly yes
EOF
Клонировать:
Шаг 7. Проверка инфраструктуры¶
Часть 2. DNS и домен¶
Шаг 8. Узнать IP сервера¶
Шаг 9. Добавить A-записи в DNS¶
| Subdomain | Тип | Значение |
|---|---|---|
@ |
A | IP сервера |
www |
A | IP сервера |
api |
A | IP сервера |
docs |
A | IP сервера |
Шаг 10. Проверить DNS¶
Часть 3. Nginx и SSL¶
Шаг 11. Установка Nginx¶
Шаг 12. Конфигурация сайтов¶
API Gateway:
sudo tee /etc/nginx/sites-available/api.aqstream << 'EOF'
server {
listen 80;
server_name api.aqstream.ru;
location / {
proxy_pass http://localhost:8080;
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;
}
}
EOF
Документация:
sudo mkdir -p /var/www/docs.aqstream.ru
sudo tee /etc/nginx/sites-available/docs.aqstream << 'EOF'
server {
listen 80;
server_name docs.aqstream.ru;
root /var/www/docs.aqstream.ru;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
EOF
Frontend:
sudo tee /etc/nginx/sites-available/aqstream << 'EOF'
server {
listen 80;
server_name aqstream.ru www.aqstream.ru;
# API запросы перенаправляются на Gateway
location /api/ {
proxy_pass http://localhost:8080/api/;
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;
}
# Остальные запросы на Frontend
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_cache_bypass $http_upgrade;
}
}
EOF
Шаг 13. Активация сайтов¶
sudo ln -sf /etc/nginx/sites-available/api.aqstream /etc/nginx/sites-enabled/
sudo ln -sf /etc/nginx/sites-available/docs.aqstream /etc/nginx/sites-enabled/
sudo ln -sf /etc/nginx/sites-available/aqstream /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx
Шаг 14. SSL сертификаты¶
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d aqstream.ru -d www.aqstream.ru -d api.aqstream.ru -d docs.aqstream.ru
sudo certbot renew --dry-run
Часть 4. CI/CD (GitHub Actions)¶
Шаг 15. Создать SSH ключ для деплоя¶
На локальной машине (не на сервере!):
Шаг 16. Добавить публичный ключ на сервер¶
# Локальная машина: показать публичный ключ
cat ~/.ssh/github_actions.pub
# Сервер: добавить ключ
ssh root@ВАШ_IP "echo 'ВСТАВИТЬ_ПУБЛИЧНЫЙ_КЛЮЧ' >> ~/.ssh/authorized_keys"
Шаг 17. Проверить подключение¶
Шаг 18. Добавить GitHub Secrets¶
GitHub → Settings → Secrets and variables → Actions → New repository secret
| Secret | Значение |
|---|---|
SSH_HOST |
IP сервера |
SSH_USER |
root |
SSH_KEY |
Содержимое cat ~/.ssh/github_actions |
Важно: Копировать весь ключ включая -----BEGIN и -----END-----.
Частые ошибки CI/CD¶
| Ошибка | Решение |
|---|---|
passphrase protected |
Создать ключ с -N "" |
no supported methods |
Добавить публичный ключ на сервер |
Permission denied |
Проверить SSH_USER |
Проверка готовности¶
| URL | Ожидаемый результат |
|---|---|
| https://api.aqstream.ru/actuator/health | {"status":"UP"} |
| https://docs.aqstream.ru | Документация |
| https://aqstream.ru | Frontend |
Полезные команды¶
| Команда | Описание |
|---|---|
make local-up |
Запустить инфраструктуру |
make local-down |
Остановить инфраструктуру |
make docker-up |
Запустить полный стек в Docker |
make docker-down |
Остановить стек |
make health |
Проверить сервисы |
make log-all |
Логи контейнеров |
make db-backup |
Бэкап всех баз данных |
make db-restore BACKUP_DATE=... |
Восстановление из бэкапа |
docker ps |
Статус контейнеров |
sudo nginx -t |
Проверить конфиг Nginx |
sudo certbot certificates |
Статус SSL |
Troubleshooting¶
Docker permission denied¶
SDKMAN не найден¶
Порт занят¶
Чеклист¶
- [ ] Docker установлен
- [ ] Java 25 установлена
- [ ] Node.js 20 установлен
- [ ] Репозиторий склонирован
- [ ]
make healthпроходит - [ ] DNS настроен
- [ ] Nginx работает
- [ ] SSL сертификаты получены
- [ ] GitHub Secrets настроены
- [ ] CI/CD деплой работает
Дальнейшее чтение¶
- CI/CD — пайплайны
- Environments — окружения
- Runbook — операционные процедуры