Толық нұсқаулық: Docker, Nginx және SSL арқылы веб-қосымшаны продакшен серверге орналастыру
VPS-ке қосымшаны орналастыру бойынша қадамдық нұсқаулық. Әр қадамда команда, түсіндірме және күтілетін нәтиже бар. Next.js, NestJS немесе кез келген басқа стекке жарамды.
Мазмұны
- Серверге қойылатын талаптар
- Жоба архитектурасы
- Серверді дайындау
- Docker және Nginx орнату
- Docker Compose: сервистерді баптау
- Nginx — reverse proxy ретінде
- Let's Encrypt SSL сертификаттары
- Docker ішіндегі PostgreSQL, Redis және MinIO
- Ортаның айнымалылары мен құпиялар
- Файрволды баптау
- Мониторинг (Prometheus + Grafana)
- Автоматты бэкаптар
- GitHub Actions арқылы CI/CD
- Ақауларды жою
- Продакшен чеклисті
1. Серверге қойылатын талаптар
Бастамас бұрын, жеткілікті ресурстары бар VPS серверіңіз бар екеніне көз жеткізіңіз.
| Параметр | Минимум | Ұсынылады |
|---|---|---|
| CPU | 2 vCPU | 4 vCPU |
| RAM | 4 ГБ | 8 ГБ |
| Диск | 40 ГБ SSD | 80+ ГБ SSD |
| ОЖ | Ubuntu 22.04 LTS | Ubuntu 24.04 LTS |
| Желі | 100 Мбит/с | 1 Гбит/с |
Сервер жалдау:
- Hetzner — Еуропа, $4/ай-дан
- DigitalOcean — $6/ай-дан
- Timeweb Cloud — ~2000 тг/ай-дан
- PS.kz — Қазақстан, жергілікті серверлер
Сондай-ақ сізге қажет:
- Домен (мысалы,
your-domain.com) DNS-баптауларға қолжетімділікпен - SSH-клиент (macOS/Linux-те кіріктірілген, Windows-та — PuTTY немесе Windows Terminal)
2. Жоба архитектурасы
Деплойды бастамас бұрын, компоненттердің қалай өзара әрекеттесетінін түсіну маңызды:
Пайдаланушы (Браузер)
|
v
+-------------------+
| Nginx (:80/443) | <-- Барлық сұрауларды қабылдап, бағыттайды
+----+----------+---+
| |
v v
+----------+ +----------+
| Web | | API |
| (Next.js)| | (NestJS) | <-- Docker контейнерлеріндегі қосымшалар
| :3000 | | :3001 |
+----------+ +--+-+-+---+
| | |
+---------+ | +--------+
v v v
+----------+ +----------+ +---------+
|PostgreSQL| | Redis | | MinIO |
| (ДБ) | | (кэш) | |(файлдар)|
| :5432 | | :6379 | | :9000 |
+----------+ +----------+ +---------+
Әр компоненттің рөлі:
- Nginx — интернеттен сұрауларды қабылдайды, SSL терминациясы, контейнерлерге прокси жасайды
- Web — фронтенд (SSR/SSG), пайдаланушы көретін нәрсе
- API — серверлік логика (аутентификация, деректер, файлдар)
- PostgreSQL — негізгі деректер қоры
- Redis — кэштеу және кезектер
- MinIO — S3-үйлесімді файлдар қоймасы
3. Серверді дайындау
3.1. Серверге қосылу
3.2. Жүйені жаңарту
Барлық қауіпсіздік жаңартуларын жүктеп, орнатады. 1-3 минут уақыт алады.
3.3. Негізгі утилиталарды орнату
Не орнаттық:
curl,wget— файлдарды жүктеуgit— кодты басқаруhtop— жүктемені бақылауufw— файрволfail2ban— парольді іріктеуден қорғау
3.4. Deploy пайдаланушысын жасау
rootастында жұмыс істеу қауіпті — бір қате бүкіл серверді бұзуы мүмкін. Жеке пайдаланушы жасаймыз.
3.5. SSH кілтін баптау
3.6. SSH қорғанысы
SSH конфигурациясын ашыңыз:
Келесі жолдарды өзгертіңіз:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
SSH-ті қайта іске қосыңыз:
Маңызды: ағымдағы сессияны жаппас бұрын, жаңа терминал ашып, қосыла алатыныңызды тексеріңіз:
ssh deploy@YOUR_SERVER_IP
3.7. Deploy пайдаланушысына ауысу
Осы сәттен бастап барлық командаларды deploy атынан орындаймыз:
4. Docker және Nginx орнату
4.1. Docker
Тексеру:
Күтілетін нәтиже:
Docker version 27.x.x, build ...
Docker Compose version v2.x.x
4.2. Nginx
Тексеру:
Active: active (running) жолын көруіңіз керек.
4.3. Certbot (SSL үшін)
5. Docker Compose: сервистерді баптау
Жобаңыздың түбірінде docker-compose.prod.yml файлын жасаңыз. Бұл — барлық сервистерді сипаттайтын негізгі файл.
Ескертпе: барлық инфрақұрылымдық порттар
127.0.0.1-ге байланған — олар интернеттен тікелей қолжетімді емес, тек Nginx арқылы.
6. Nginx — reverse proxy ретінде
Nginx интернеттен сұрауларды қабылдап, оларды Docker контейнерлеріне бағыттайды. Nginx-сіз сайт домен бойынша қолжетімді болмайды.
6.1. Негізгі сайт конфигурациясы
Маңызды: конфигтерді тек HTTP-мен (80 порт) жасаңыз. SSL блоктарын certbot автоматты түрде қосады.
6.2. API конфигурациясы
6.3. Конфигтерді белсендіру
6.4. Тексеру және қайта жүктеу
Күтілетін нәтиже:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
7. Let's Encrypt SSL сертификаттары
SSL пайдаланушы мен сервер арасындағы байланысты шифрлайды. Онсыз браузер «Қауіпті сайт» ескертуін көрсетеді. Let's Encrypt тегін сертификаттар береді.
7.1. DNS баптау
Сертификаттарды алмас бұрын DNS жазбаларының дұрыс бапталғанына көз жеткізіңіз:
| Түрі | Атауы | Мәні | TTL |
|---|---|---|---|
| A | @ | YOUR_SERVER_IP | 3600 |
| A | www | YOUR_SERVER_IP | 3600 |
| A | api | YOUR_SERVER_IP | 3600 |
Тексеру:
7.2. Сертификаттарды алу
Certbot email сұрайды және HTTP-ден HTTPS-ке бағыттауды ұсынады — «Redirect» таңдаңыз.
7.3. Автоматты жаңартуды тексеру
Күтілетін нәтиже: Congratulations, all simulated renewals succeeded
Сертификаттар әр 60 күн сайын автоматты түрде жаңартылады. Қосымша ештеңе істеу қажет емес.
8. Docker ішіндегі PostgreSQL, Redis және MinIO
8.1. Инфрақұрылымды іске қосу
Алдымен қосымша тәуелді базалық сервистерді іске қосамыз:
ДБ инициализациясы үшін 15 секунд күтіңіз:
8.2. Тексеру
Барлық 3 сервис Up (healthy) күйінде болуы керек.
8.3. MinIO баптау
MinIO Client орнатыңыз:
Қосылып, бакет жасаңыз:
8.4. Қосымшаны құрастыру және іске қосу
8.5. Деректер қорын инициализациялау
Күтілетін нәтиже: Your database is now in sync with your Prisma schema.
9. Ортаның айнымалылары мен құпиялар
9.1. Құпияларды генерациялау
Әр пароль мен құпия бірегей болуы керек. Мысалдардағы парольдерді ешқашан пайдаланбаңыз!
9.2. .env файлы
docker-compose.prod.yml файлының қасына .env файлын жасаңыз:
Қауіпсіздік:
.envфайлдарын ешқашан Git-ке коммит жасамаңыз. Оларды.gitignore-ға қосыңыз.
10. Файрволды баптау
Файрвол қажетті порттардан басқа бәрін бұғаттайды. Онсыз кез келген адам деректер қорыңызға тікелей қосыла алады!
Тексеру:
Күтілетін нәтиже:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
3000, 3001, 5432, 6379, 9000 порттары сыртқа АШЫҚ ЕМЕС — олар тек Nginx арқылы қолжетімді.
fail2ban баптау
3 сәтсіз кіру әрекетінен кейін IP-мекенжай 1 сағатқа бұғатталады.
11. Мониторинг (Prometheus + Grafana)
Мониторинг міндетті емес, бірақ продакшен ортасы үшін өте ұсынылады.
11.1. Docker Compose-ға мониторинг сервистерін қосу
docker-compose.prod.yml файлына мына сервистерді қосыңыз:
11.2. Мониторингті іске қосу
11.3. Нені бақылау керек
| Метрика | Сипаттамасы | Алерт шегі |
|---|---|---|
| CPU | Процессор жүктемесі | > 80% |
| RAM | Жады пайдалану | > 85% |
| Диск | Дискінің толуы | > 90% |
| PostgreSQL | Белсенді қосылыстар | > 80 |
| Redis | Жады пайдалану | > 200 МБ |
| API | Жауап уақыты, 5xx қателер | > 2с / > 1% |
12. Автоматты бэкаптар
Ереже: қалпына келтіруді тексермесеңіз — бэкап жоқ.
12.1. Бэкап скрипті
12.2. Cron арқылы жоспарлау
Мына жолды қосыңыз:
0 3 * * * /home/deploy/backup.sh >> /home/deploy/backups/backup.log 2>&1
Бэкап күн сайын сағат 3:00-де орындалады.
12.3. Бэкаптан қалпына келтіру
13. GitHub Actions арқылы CI/CD
13.1. SSH кілтін дайындау
Серверде:
Жеке кілтті көшіріңіз.
13.2. GitHub-тағы құпиялар
Settings > Secrets and variables > Actions > New repository secret бөліміне өтіңіз
| Құпия атауы | Мәні |
|---|---|
DEPLOY_HOST | Сервер IP-мекенжайы |
DEPLOY_USER | deploy |
DEPLOY_SSH_KEY | Жеке кілт |
13.3. GitHub Actions Workflow
.github/workflows/deploy.yml файлын жасаңыз:
Енді
main-ге push жасаған сайын қосымша серверде автоматты жаңартылады.
14. Ақауларды жою
502 Bad Gateway
Nginx жұмыс істеуде, бірақ қосымша іске қосылмаған немесе құлаған.
Connection Refused
Nginx жұмыс істемейді.
Құрастыру кезінде RAM жетіспеушілігі
Docker құрастыру ~2 ГБ RAM қажет етеді. Swap қосыңыз:
Контейнер үнемі қайта іске қосылады
Жиі кездесетін себептер:
.env-дағы дұрыс емес айнымалылар- ДБ қолжетімді емес
- Порт бос емес
Дискілік кеңістік жетіспеушілігі
Диагностика үшін пайдалы командалар
15. Продакшен чеклисті
Қауіпсіздік
- SSH: root кіруі өшірілген, тек кілт арқылы
- UFW: тек 22, 80, 443 порттары ашық
- fail2ban бапталған және жұмыс істеуде
- SSL сертификаттары орнатылған және автоматты жаңартылады
- JWT құпиялары бірегей
- ДБ паролі генерацияланған
- MinIO паролі генерацияланған
-
.envфайлдары Git-те жоқ
Инфрақұрылым
- PostgreSQL жұмыс істеуде (healthcheck жасыл)
- Redis жұмыс істеуде (healthcheck жасыл)
- MinIO жұмыс істеуде, бакет жасалған
- Nginx reverse proxy ретінде бапталған
- Инфрақұрылым порттары 127.0.0.1-ге байланған
Қосымша
- Сайт HTTPS арқылы ашылады
- API health эндпоинтіне жауап береді
- Аутентификация жұмыс істейді
- Файлдарды жүктеу жұмыс істейді
- CORS дұрыс доменге бапталған
Қызмет көрсету
- Cron бэкап бапталған (күн сайын)
- Сынақ қалпына келтіру жүргізілген
- CI/CD workflow жұмыс істейді
- Мониторинг бапталған (міндетті емес)
- Маңызды метрикаларға алерттер орнатылған
Қорытынды
Сіз толық продакшен ортасын орналастырдыңыз:
- Сервер — deploy пайдаланушысымен қорғалған
- Docker Compose — барлық сервистер оқшауланған және қайта шығарылатын
- Nginx — статикалық файлдарды кэштеумен reverse proxy
- SSL — автоматты жаңартумен тегін Let's Encrypt сертификаттары
- Файрвол — тек қажетті порттар ашық
- Бэкаптар — ротациямен автоматты, күнделікті
- CI/CD — main-ге push кезінде автоматты деплой
- Мониторинг — Grafana арқылы метрикалар мен алерттер
Бұл архитектура дұрыс кэштеу және контейнерлерді көлденең масштабтау кезінде 10 000 RPS-ке дейін көтере алады. Сәтті деплой!
