15-bo‘lim
Serverga yetkazish
SSH kaliti bilan ulanish, rsync va Docker orqali chiqarish, deploy skriptini serverda saqlash va statik saytni nashr qilish.
Ushbu bo‘lim mundarijasi
Quvur obrazni qurdi va registry'ga yubordi. Oxirgi qadam - serverga ulanib, yangi versiyani ishga tushirish.
SSH kalitini tayyorlash #
Deploy uchun alohida kalit juftligi yaratiladi - shaxsiy kalitingizni ishlatmang:
ssh-keygen -t ed25519 -C "deploy@ci" -f deploy_kalit -N ""
Generating public/private ed25519 key pair.
Your identification has been saved in deploy_kalit
Your public key has been saved in deploy_kalit.pub
| Fayl | Qayerga | Izoh |
|---|---|---|
deploy_kalit.pub (ochiq) | Serverdagi ~/.ssh/authorized_keys | Ulanishga ruxsat beradi |
deploy_kalit (maxfiy) | GitHub sirlariga | Hech qayerda saqlanmasin |
Serverda:
cat deploy_kalit.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
Bu kalitni o'g'irlagan odam serveringizga kiradi. Xavfni kamaytirish uchun:
| Chora | Nima beradi |
|---|---|
Alohida foydalanuvchi (deploy) | root emas - zarar chegaralanadi |
authorized_keys da command= | Faqat bitta skript ishlay oladi |
from="IP" cheklovi | Faqat ma'lum manzildan ulanish |
Parol bilan sudo taqiqlash | Kalit tizimni o'zgartira olmaydi |
Misol:
command="/home/deploy/deploy.sh",no-port-forwarding,no-pty ssh-ed25519 AAAA...
Endi bu kalit bilan kirgan har qanday buyruq deploy.sh ga
almashtiriladi - boshqa hech narsa bajarilmaydi.
Eng sodda deploy: Docker bilan #
Server tomonida ish oddiy: yangi obrazni tortib olish va konteynerni qayta ishga tushirish.
name: Deploy
on:
push:
tags: ['v*']
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: ishlab-chiqarish
url: https://misol.uz
steps:
- name: Serverda yangilash
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KALIT }}
script: |
set -e
cd /srv/ilova
docker compose pull
docker compose up -d --remove-orphans
docker image prune -f
| Sir | Qiymati |
|---|---|
SERVER_HOST | Server IP yoki domen |
SERVER_USER | deploy |
SSH_KALIT | deploy_kalit faylining to'liq mazmuni |
set -e ni unutmangSkript ichidagi buyruq yiqilsa, SSH sessiyasi baribir davom etadi va oxirgi buyruq muvaffaqiyatli bo'lsa, quvur yashil bo'lib qoladi.
set -e birinchi xatoda to'xtatadi. Usiz docker compose pull
yiqilgan bo'lsa ham, quvur "deploy muvaffaqiyatli" deb xabar beradi.
Deploy skriptini serverda saqlash #
Uzun skriptni workflow ichida yozish noqulay: uni o'zgartirish uchun har safar kommit kerak, xatolarni esa faqat quvurda ko'rasiz.
Yaxshiroq yo'l - skript serverda tursin:
#!/bin/bash
set -euo pipefail
JOY=/srv/ilova
cd "$JOY"
echo "[1/4] Yangi obraz tortilmoqda"
docker compose pull
echo "[2/4] Konteynerlar yangilanmoqda"
docker compose up -d --remove-orphans
echo "[3/4] Salomatlik tekshirilmoqda"
for i in $(seq 1 30); do
if curl -sSf http://localhost:3000/salomatlik > /dev/null; then
echo "Xizmat javob bermoqda"
break
fi
if [ "$i" = "30" ]; then
echo "Xizmat ko'tarilmadi - orqaga qaytarilmoqda"
docker compose rollback 2>/dev/null || docker compose up -d
exit 1
fi
sleep 2
done
echo "[4/4] Eski obrazlar tozalanmoqda"
docker image prune -f
echo "Deploy tugadi"
Quvur esa faqat uni chaqiradi:
script: /home/deploy/deploy.sh
| Ustunligi | Izoh |
|---|---|
| Serverda sinash mumkin | Kommitsiz tekshiriladi |
| Quvur sodda bo'ladi | Bitta qator |
| Skript versiyalanadi | Uni ham repozitoriyda saqlang va deploy paytida ko'chiring |
Fayllarni ko'chirish - rsync #
Docker ishlatmaydigan loyihalar (masalan, oddiy PHP sayt) uchun fayllarni ko'chirish kerak:
- uses: actions/checkout@v4
- name: SSH kalitini tayyorlash
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_KALIT }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan -H "${{ secrets.SERVER_HOST }}" >> ~/.ssh/known_hosts
- name: Fayllarni ko'chirish
run: |
rsync -avz --delete \
--exclude '.git' \
--exclude '.github' \
--exclude 'node_modules' \
--exclude '.env' \
./ ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:/var/www/sayt/
| Bayroq | Ma'nosi |
|---|---|
-a | Ruxsat va vaqt belgilarini saqlaydi |
-v | Nima ko'chirilayotganini ko'rsatadi |
-z | Siqib uzatadi |
--delete | Manbada yo'q fayllarni serverda ham o'chiradi |
--exclude | Ko'chirilmaydigan narsalar |
--delete va .env - xavfli juftlik--delete serverdagi ortiqcha fayllarni o'chiradi. Agar .env
istisnoga qo'shilmagan bo'lsa, u o'chib ketadi va sayt darhol
yiqiladi.
Xuddi shu holat uploads/, storage/ va foydalanuvchi yuklagan
fayllar uchun ham amal qiladi. Har doim istisno ro'yxatini avval
yozing, --delete ni keyin qo'shing.
Xavfsizroq yo'l - avval --dry-run bilan sinab ko'rish:
rsync -avz --delete --dry-run ./ foydalanuvchi@server:/var/www/sayt/
known_hosts - o'tkazib yubormang #
ssh-keyscan qatori serverning kalitini oldindan yozadi. Usiz SSH
tasdiqlash so'raydi va quvur javobsiz qotib qoladi.
Xavfsizroq variant - kalitni oldindan sirga yozib qo'yish:
- run: |
mkdir -p ~/.ssh
echo "${{ secrets.SERVER_HOST_KEY }}" >> ~/.ssh/known_hosts
Bu odam o'rtasida turishi (MITM) hujumidan himoya qiladi: ssh-keyscan
o'sha paytda javob bergan serverning kalitini oladi, bu esa har doim ham
to'g'ri server bo'lmasligi mumkin.
Statik saytni nashr qilish #
Statik sayt uchun server umuman kerak emas - GitHub Pages yetarli:
name: Saytni nashr qilish
on:
push:
branches: [main]
permissions:
contents: read
pages: write
id-token: write
jobs:
qurish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci && npm run build
- uses: actions/upload-pages-artifact@v3
with:
path: dist/
nashr:
needs: qurish
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.nashr.outputs.page_url }}
steps:
- id: nashr
uses: actions/deploy-pages@v4
- Deploy uchun alohida SSH kalit juftligini yarating.
- Ochiq kalitni serverdagi
authorized_keysga qo'shing. - Maxfiy kalitni GitHub sirlariga yozing.
- Quvurdan serverga ulanib,
uptimebuyrug'ini bajaring. set -esiz ataylab xato buyruq qo'shib, quvur yashil qolishini ko'ring.set -eqo'shib, endi qizil bo'lishini tekshiring.- Serverda
deploy.shskriptini yozing va quvurdan faqat uni chaqiring. - Skriptga salomatlik tekshiruvini va kutish siklini qo'shing.
rsync --dry-runbilan nima ko'chishini oldindan ko'ring.--exclude '.env'ni olib tashlab,--dry-runda nima o'chishini kuzating (bajarmang).
Xulosa #
- Deploy uchun alohida SSH kaliti yarating - shaxsiy kalitingizni ishlatmang.
- Kalitga eng kam huquq bering: alohida foydalanuvchi,
command=cheklovi, IP filtri. - Konteyner bilan deploy eng sodda:
docker compose pullvaup -d. - SSH skriptida
set -ebo'lmasa, xato quvurda ko'rinmay qoladi. - Uzun skriptni serverda saqlang - uni kommitsiz sinash mumkin bo'ladi.
rsyncfayllarni ko'chiradi;--deletebilan birga--excludero'yxati majburiy..env,uploads/vastorage/ni istisnoga qo'shmaslik saytni yiqitadi.--dry-runbilan avval sinab ko'ring - bu bir daqiqa vaqt oladi.known_hoststo'ldirilmasa, SSH tasdiq so'rab quvurni qotirib qo'yadi.- Statik sayt uchun server kerak emas: GitHub Pages bepul va yetarli.
Keyingi bo'limda deploy xato bo'lganda orqaga qaytishni ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.