zahareus
12.09.2024 11:52
7

Хочу поділитися скриптом, який використовую для деплоя на хостінг ukraine.com.ua. Бажано мати бізнес-план хостінгу, бо на ньому є підтримка Supervisor та NodeJS, які використовуються у скрипті, хоча їх згадування можно прибрати та використовувати скрипт на звичайному хостінг-плані.

Скрипт робить:

  1. Деплоїть код на хостінг через SSH
  2. Робить встановлення залежностей Composer
  3. Робить встановлення залежностей NPM та збірку ассетів через запуск npm run build
  4. Запускає міграції php artisan migrate --force
  5. Перезапускає два Supervisor процеси Laravel: планувальник (php artisan schedule:work) та обробник черги (php artisan queue:work)
  6. Відправляє повідомлення у Telegram про успішний або не успішний деплой з посиланням на коміт

Підготовка хостінгу:

Ваш сайт на хостінгу має власну директорію /home/USERNAME/WEBSITE/www/ де USERNAME та WEBSITEце будуть специфічна до вашого хостінгу інформація, котру можно взяти у розділі хостінгу "Налаштування сайту > Кореневий каталог".

Потрібно через SSH створити директорію та клонувати Laravel код з Github. Для цього необхідно підключитися по SSH до сервера хостінгу та створити SSH ключ:

cd ~/.ssh
ssh-keygen -t rsa -b 2048
cat ~/.ssh/id_rsa.pub

Створений SSH-ключ потрібно додати в розділ: github.com/settings/keys.

Далі потрібно створити директорію на сервері хостунгу в якому буде знаходитися Laravel-код і склонувати репозиторій з Github (тут портібно замінити USERNAME, WEBSITE, GITHUB_USERNAME, GITHUB_REPO на ваші власні):

www.php.net/mkdir /home/USERNAME/WEBSITE/source/
cd /home/USERNAME/WEBSITE/
git clone git@github.com:GITHUB_USERNAME/GITHUB_REPO.git source

Далі потрібно видалити поточну директорію www (всі дані директорії www будуть видалені, тому не робіть це з директорією де є цінні файли) та замінити її на сімлінк на директорію source/public/ (тут портібно замінити USERNAME, WEBSITE на ваші власні):

rm -rf /home/USERNAME/WEBSITE/www/
ln -s /home/USERNAME/WEBSITE/source/public/ /home/USERNAME/WEBSITE/www/

Перейти у розділ хостінгу Supervisor та створити два процеси: планувальник (php artisan schedule:work), черги (php artisan queue:work).

Процес "обробник черги" (тут портібно замінити USERNAME, WEBSITE на ваші власні):

cd /home/USERNAME/WEBSITE/source/ && /usr/local/php83/bin/php -c /home/krokom/.www.php.net/system/php/www.WEBSITE.ini artisan queue:work

Процес "планувальник" (тут портібно замінити USERNAME, WEBSITE на ваші власні):

cd /home/USERNAME/WEBSITE/source/ && /usr/local/php83/bin/php -c /home/krokom/.www.php.net/system/php/www.WEBSITE.ini artisan schedule:work

Підготовка скрипту:

В репозиторії створюємо файл .github/workflows/deploy-ssh.yaml і додаємо змінні Github Actions в розділі: "Репозиторій > Settings > Secrets and variables > Actions".

Потрібно додати наступні змінні:

  • HOST – хост підключення по SSH, можно дізнатися в розділі хостінгу "SSH-доступ"
  • USERNAME – імʼя користувача для підключення по SSH, можно дізнатися в розділі хостінгу "SSH-доступ"
  • PASSWORD – пароль користувача для підключення по SSH, можно дізнатися в розділі хостінгу "SSH-доступ"
  • PORT – порт для підключення по SSH, теж з розділу "SSH-доступ", зазвичай 22
  • HOSTING_USERNAME – це імʼя користувача хостінгу, можно дізнатися з розділу хостінга "Налаштування сайту > Кореневий каталог": /home/USERNAME/WEBSITE/www/
  • HOSTING_WEBSITE – це імʼя користувача хостінгу, можно дізнатися з розділу хостінга "Налаштування сайту > Кореневий каталог": /home/USERNAME/WEBSITE/www/
  • TELEGRAM_TOKEN – ключ до вашого Telegram бота, який можно створити через бот t.me/BotFather
  • TELEGRAM_TO– ID чата для відправки повідомлення, можно дізнатися свій ID в боті t.me/getmyid_bot, потім встановити чат з власним ботом

Код файлу .github/workflows/deploy-ssh.yaml:

name: Deploy SSH

on: [push]

jobs:
  build:
    name: Deploy
    runs-on: ubuntu-latest
    steps:
      - name: Apply changes on server, install deps, migrate, build assets
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          password: ${{ secrets.PASSWORD }}
          port: ${{ secrets.PORT }}
          script: |
            cd /home/${{ secrets.HOSTING_USERNAME }}/${{ secrets.HOSTING_WEBSITE }}/source
            git stash && git fetch --all && git www.php.net/reset --hard origin/main
            source ~/.bashrc && composer install
            php artisan migrate --force
            pkill -fx '/usr/local/php83/bin/php -c /home/${{ secrets.HOSTING_USERNAME }}/.system/php/www.${{ secrets.HOSTING_WEBSITE }}.ini artisan queue:work'
            pkill -fx '/usr/local/php83/bin/php -c /home/${{ secrets.HOSTING_USERNAME }}/.system/php/www.${{ secrets.HOSTING_WEBSITE }}.ini artisan schedule:work'
            npm ci && npm run build

  notify:
    name: Notify
    runs-on: ubuntu-latest
    if: always()
    needs: [build]
    steps:
      - name: Send status to telegram
        uses: appleboy/telegram-action@master
        with:
          to: ${{ secrets.TELEGRAM_TO }}
          token: ${{ secrets.TELEGRAM_TOKEN }}
          format: "html"
          message: |
            ${{ needs.build.result == 'success' && '🟢' || '🔴' }} <b>${{ needs.build.result }}</b> <a href="https://github.com/${{ github.repository }}/commit/${{github.sha}}">${{ github.event.commits[0].message }}</a> by <a href="https://github.com/${{ github.actor }}">@${{ github.actor }}</a>

Після додавання файлу deploy-ssh.yaml у репозиторій почне працювати Github Action, котрий можно побачити в секції Github > Ваш репозиторій > Actions. Можно відкрити задачу та подивитися стан виконання.

cdn.adm.tools/forum_message/0000/0005/3340/Знімок_екрана_2024-09-12_о_11.50.30.png

В свою чергу, код проєкту буде автоматично розгортатися після кожного пушу в гілку main, а в Telegram будуть надходити сповіщення, тож ви будете завжи знати поточний стан кожного деплоя:

cdn.adm.tools/forum_message/0000/0005/3340/Знімок_екрана_2024-09-12_о_11.51.48.png

Дякую за увагу, звертайтеся з питаннями та пропозиціями в коментарях до цього посту.

pdf
27.12.2024 18:04
0
Братан, дошли руки до твоего скрипта, отпишусь, как запилю...