15-bo‘lim

Serverga yetkazish

SSH kaliti bilan ulanish, rsync va Docker orqali chiqarish, deploy skriptini serverda saqlash va statik saytni nashr qilish.

🕑 9 daqiqa o‘qish 📄 705 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. SSH kalitini tayyorlash
  2. Eng sodda deploy: Docker bilan
  3. Deploy skriptini serverda saqlash
  4. Fayllarni ko'chirish - rsync
  5. known_hosts - o'tkazib yubormang
  6. Statik saytni nashr qilish
  7. Xulosa

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:

Terminal
ssh-keygen -t ed25519 -C "deploy@ci" -f deploy_kalit -N ""
Natija
Generating public/private ed25519 key pair.
Your identification has been saved in deploy_kalit
Your public key has been saved in deploy_kalit.pub
FaylQayergaIzoh
deploy_kalit.pub (ochiq)Serverdagi ~/.ssh/authorized_keysUlanishga ruxsat beradi
deploy_kalit (maxfiy)GitHub sirlarigaHech qayerda saqlanmasin

Serverda:

Terminal
cat deploy_kalit.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
Deploy kalitiga eng kam huquq bering

Bu kalitni o'g'irlagan odam serveringizga kiradi. Xavfni kamaytirish uchun:

ChoraNima beradi
Alohida foydalanuvchi (deploy)root emas - zarar chegaralanadi
authorized_keys da command=Faqat bitta skript ishlay oladi
from="IP" chekloviFaqat ma'lum manzildan ulanish
Parol bilan sudo taqiqlashKalit tizimni o'zgartira olmaydi

Misol:

Natija
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.

YAML
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
SirQiymati
SERVER_HOSTServer IP yoki domen
SERVER_USERdeploy
SSH_KALITdeploy_kalit faylining to'liq mazmuni
set -e ni unutmang

Skript 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:

Terminal
#!/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:

YAML
          script: /home/deploy/deploy.sh
UstunligiIzoh
Serverda sinash mumkinKommitsiz tekshiriladi
Quvur sodda bo'ladiBitta qator
Skript versiyalanadiUni ham repozitoriyda saqlang va deploy paytida ko'chiring

Fayllarni ko'chirish - rsync #

Docker ishlatmaydigan loyihalar (masalan, oddiy PHP sayt) uchun fayllarni ko'chirish kerak:

YAML
      - 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/
BayroqMa'nosi
-aRuxsat va vaqt belgilarini saqlaydi
-vNima ko'chirilayotganini ko'rsatadi
-zSiqib uzatadi
--deleteManbada yo'q fayllarni serverda ham o'chiradi
--excludeKo'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:

Terminal
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:

YAML
      - 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:

YAML
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
Loyiha turiga qarab yetkazish yo'li Statik sayt HTML, CSS, JS Server kerak emas GitHub Pages, Netlify Eng arzon va sodda Oddiy server PHP, statik backend rsync bilan ko'chiriladi SSH kaliti kerak O'rnatish oson Konteyner Obraz registry'da Serverda pull va up Muhit bir xil bo'ladi Eng ishonchli Uchalasida ham sirlar GitHub da, skript esa imkon qadar serverda saqlanadi
Yetkazish usuli loyiha turiga qarab tanlanadi - murakkabligi ham shunga mos
Amaliy topshiriq
  1. Deploy uchun alohida SSH kalit juftligini yarating.
  2. Ochiq kalitni serverdagi authorized_keys ga qo'shing.
  3. Maxfiy kalitni GitHub sirlariga yozing.
  4. Quvurdan serverga ulanib, uptime buyrug'ini bajaring.
  5. set -e siz ataylab xato buyruq qo'shib, quvur yashil qolishini ko'ring.
  6. set -e qo'shib, endi qizil bo'lishini tekshiring.
  7. Serverda deploy.sh skriptini yozing va quvurdan faqat uni chaqiring.
  8. Skriptga salomatlik tekshiruvini va kutish siklini qo'shing.
  9. rsync --dry-run bilan nima ko'chishini oldindan ko'ring.
  10. --exclude '.env' ni olib tashlab, --dry-run da 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 pull va up -d.
  • SSH skriptida set -e bo'lmasa, xato quvurda ko'rinmay qoladi.
  • Uzun skriptni serverda saqlang - uni kommitsiz sinash mumkin bo'ladi.
  • rsync fayllarni ko'chiradi; --delete bilan birga --exclude ro'yxati majburiy.
  • .env, uploads/ va storage/ ni istisnoga qo'shmaslik saytni yiqitadi.
  • --dry-run bilan avval sinab ko'ring - bu bir daqiqa vaqt oladi.
  • known_hosts to'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.

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.