Введение — зачем это читать (и почему сервер — это как зал)
Сервер — не просто место, где лежит сайт. Это твой персональный зал: если правильно настроить тренажёры (Nginx, SSH, бэкапы, автодеплой), результат будет стабильным и предсказуемым. Если халтурно — сайт упадёт в самый неподходящий момент. Здесь — не общие слова, а конкретные действия и команды, которые ты сможешь применить прямо сейчас.
1. Типы хостинга и когда брать VPS
- Shared/Shared-hosting — дешёво и просто. Подойдёт для простых блогов и тестов. Минус: ограниченный контроль и ресурсы.
- VPS (Virtual Private Server) — отдельный виртуальный сервер (root-доступ), оптимален для разработчика: ставим Nginx, авто-деплой, кастомные cron/сервисы.
- Managed VPS / PaaS — часть задач берет провайдер (удобно, но дороже).
- Dedicated / Bare metal — для очень высоких нагрузок.
- Вывод: если ты настраиваешь Nginx, работаешь с Git и любишь автоскрипты — бери VPS.
2. Как выбрать VPS: параметры и лайфхаки (практически)
При выборе смотрим не только на цену.
CPU
- vCPU vs физические ядра: для простых сайтов vCPU нормально; для CPU-интенсивных задач лучше выделенные CPU.
- Частота и single-thread perf важнее количества ядер для Node/.js и сборок.
RAM
- Минимум для небольшого проекта: 1–2 GB (но 2 GB удобнее). Для нескольких сайтов — 4+ GB.
Диск
- SSD / NVMe — брать NVMe, если есть. IOPS имеют значение для баз данных.
- Тип диска: предпочти «local NVMe» для скорости, «remote SSD» если нужна репликация/снапшоты у провайдера.
Сеть
- Локация дата-центра близко к аудитории.
- Просмотри лимиты трафика и правила биллинга (95th percentile или фикс).
Дополнительно
- Сnapshots / backups у провайдера, консоль доступа, API для автоматизации, возможность привязки floating IP, IPv6, DDoS-защита.
3. Рекомендации по провайдерам (коротко)
(без «реклам», общие параметры — что смотреть)
Ищи провайдеров с: прозрачной ценой, быстрыми снапшотами, возможностью скриптов для создания инстансов, поддержкой SSH-ключей и двухфакторной авторизации в личном кабинете.
4. Быстрый старт — что делать сразу после получения VPS (практика)
Ниже — пошагово, команды для Ubuntu/Debian (работай под sudo):
Обновление:
```sudo apt update && sudo apt upgrade -y```
Создать пользователя (не работаем под root) и дать sudo:
```sudo adduser deployer
sudo usermod -aG sudo deployer```
Добавить SSH-ключ (на локальной машине):
```# локально
ssh-keygen -t rsa -b 4096 -C "deploy@myproject"
# скопировать публичный ключ на сервер
ssh-copy-id deployer@IP```
Или вручную: в /home/deployer/.ssh/authorized_keys, права 700/600.
Отключить вход по паролю и root (в /etc/ssh/sshd_config):
```PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes```
Затем:
```sudo systemctl reload sshd```
(Прежде чем отключать пароли — убедись, что SSH-ключи работают!)
Настроить UFW (firewall):
```sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full' # откроет 80 и 443
sudo ufw enable
sudo ufw status```
Установить базовый набор:
```sudo apt install -y nginx git certbot python3-certbot-nginx fail2ban unattended-upgrades```
Включить автоматические обновления:
```sudo dpkg-reconfigure --priority=low unattended-upgrades```
Создать swap (если RAM маловато, например 1GB):
```sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab```
5. Nginx — пример конфигурации для статического сайта (production-ready)
Создаём директорию:
```sudo mkdir -p /var/www/my-site
sudo chown -R deployer:www-data /var/www/my-site```
Файл /etc/nginx/sites-available/my-site:
```server {
listen 80;
server_name example.com www.example.com;
root /var/www/my-site;
index index.html;
# Let's Encrypt ACME challenge
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt;
}
location / {
try_files $uri $uri/ =404;
}
# security headers (пример)
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header Referrer-Policy "no-referrer-when-downgrade";
}```
Включаем сайт:
```sudo ln -s /etc/nginx/sites-available/my-site /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx```
6. HTTPS: certbot + nginx (Let’s Encrypt)
```sudo certbot --nginx -d example.com -d www.example.com```
Проверка автоматического обновления:
```sudo systemctl status certbot.timer
# проверить dry run
sudo certbot renew --dry-run```
7. Автодеплой: 3 подхода (от простого к продвинутому)
А) Bare-repo + post-receive hook (теперь подробно)
На сервере:
```sudo mkdir -p /srv/repos/my-site.git
sudo git init --bare /srv/repos/my-site.git
sudo mkdir -p /var/www/my-site
sudo chown -R deployer:www-data /var/www/my-site
Создаём hooks/post-receive в /srv/repos/my-site.git/hooks/post-receive:
#!/bin/bash
GIT_DIR="/srv/repos/my-site.git"
TARGET="/var/www/my-site"
BRANCH="main"
while read oldrev newrev ref
do
if [ "$ref" = "refs/heads/$BRANCH" ]; then
echo "Deploying $BRANCH..."
git --work-tree="$TARGET" --git-dir="$GIT_DIR" checkout -f $BRANCH
# если нужна сборка:
# (cd $TARGET && npm ci && npm run build)
systemctl reload nginx
fi
done```
Сделать исполняемым:
```sudo chmod +x /srv/repos/my-site.git/hooks/post-receive```
На локали:
```git remote add production ssh://deployer@IP:/srv/repos/my-site.git
git push production main```
Б) Rsync/SSH deploy (для статики и сборок)
Собираешь локально (npm run build), потом:
```rsync -avz --delete ./dist/ deployer@IP:/var/www/my-site/```
Преимущество: гибкость, скорость.
В) CI/CD (GitHub Actions) — пример workflow для статического сайта
.github/workflows/deploy.yml:
```name: Build and Deploy
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18
- name: Install and Build
run: |
npm ci
npm run build
- name: Deploy to server
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
port: 22
script: |
rsync -az --delete ./dist/ ${DEPLOY_USER}@${DEPLOY_HOST}:/var/www/my-site/
sudo systemctl reload nginx```
(Добавь секреты: SERVER_HOST, SERVER_USER, SERVER_SSH_KEY в репозитории.)
8. Бэкапы и снапшоты
- Регулярные снапшоты у провайдера + offsite copy (rsync/borg/duplicity) — лучше оба варианта.
- Пример rsync-бэкапа (cron):
```rsync -az --delete /var/www/my-site/ backup@backup-host:/backups/my-site/$(date +%F)/```
- Для БД (если есть) — дампы с логической ротацией (mysqldump / pg_dump) и отправка на offsite.
9. Мониторинг и алёрты
- Легко и быстро: Uptime Kuma (self-hosted) — мониторинг HTTP и alert в Telegram.
- Системный монитор: Netdata — live-метрики, удобный UI.
- Для продакшена: Prometheus + Grafana + node_exporter.
- Не забывай про логи: journalctl -u nginx, /var/log/nginx/access.log и error.log.
10. Безопасность (must-do)
- SSH-ключи + отключить пароль.
- 2FA для панели провайдера.
- Fail2ban: базовая конфигурация для SSH и Nginx.
- UFW (или firewallctl) — минимальный набор открытых портов.
- Ограничение прав: приложения под отдельными пользователями, chown и права 755/644 для файлов.
- Регулярные обновления и unattended-upgrades.
- Если нужна повышенная безопасность — SELinux/AppArmor и auditd.
11. Оптимизация производительности
- Включи gzip + brotli (если поддерживается).
- Настрой cache-control и long expires для статичных ресурсов.
- Включи HTTP/2 (в nginx) — заметно ускоряет.
- Используй CDN (Cloudflare, BunnyCDN и т.п.) для ассетов.
- Для Tailwind/статических сайтов — сборка в production (purgeCSS) чтобы минимизировать размер.
Примеры nginx-опций (gzip):
```gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;```
12. Контейнеризация vs bare VPS
- Docker даёт изоляцию и удобство деплоя, легко масштабировать. Минус — чуть больше сложности (или нужно orchestration).
- Bare VPS проще для статических сайтов и проектов с небольшой infra.
- Часто лучший путь: на этапе разработки — bare VPS + автодеплой; если проект растёт — перейти на контейнеры и оркестрирование.
13. Горячие ошибки и как их избежать
- Не сделать автообновления → устаревший софт → уязвимости.
- Неправильные права → утечка данных.
- Отсутствие бэкапов → потеря данных после «удара» в прод.
- Плохая логика деплоя (пуши прямо в prod без сборок/тестов).
14. Production-чеклист (сделай прямо сейчас)
- SSH-ключи, root отключён
- UFW настроен (OpenSSH, HTTP, HTTPS)
- fail2ban включён
- HTTPS через Let’s Encrypt, автопродление тестировано
- Автодеплой через Git/CI или rsync
- Сnapshots + offsite backups настроены
- Мониторинг (Uptime + metrics) на месте
- SPF/DKIM/DMARC (если используешь почту)
- Регулярные проверки логов и обновлений
Заключение — прокачай свой сервер как спортсмен
VPS — это свобода и ответственность. Если настроена правильно — работа над сайтом становится точной тренировкой: повторяемые автоскрипты, чистая сборка, мониторинг и бэкапы дают стабильность. В следующей статье дам готовый playbook: Ubuntu + Nginx + certbot + GitHub Actions → автодеплой в production с полным рабочим пайплайном и systemd-сервисами.