Свой приватный Интернет-клуб (на платформе Vas3k.Club) #4
Всем привет! Это 4 часть цикла статей про создание своего Интернет-Клуба по интересам на базе платформы Vas3k'а. В этой части мы с Вами обсудим процесс выкладки Клуба в продакшен (Наконец-то!). Но мы его не завершим, останется чуть-чуть :)
- Делаем форк и поднимаем базовые сервисы: https://teletype.in/@toptuk/pmiclub1
- Готовим конфигурационные файл и поднимаем клуб локально: https://teletype.in/@toptuk/pmiclub2
- Кастомизируем Клуб под себя: https://teletype.in/@toptuk/pmiclub3
ПРЕДИСЛОВИЕ
В первой части на сервере мы уже запустили сервисы обратный прокси (reverse proxy), Pepic и ogimgd. Эти сервисы должны быть доступны для обращения в браузере. Если это не так, то самое время это исправить!
Также, для Клуба нужен собственный почтовый сервис. Вы можете использовать Mailgun или же поднять собственный сервис.
Вы должны уметь конфигурировать Клуб:
- Подготовлен конфигурационный файл .env
- Актуализирован файл settings.py
- Настроена интеграция с сервисом Sentry
- Настроена интеграция с Telegram
Если это не сделано, то вот статья, как это сделать.
Ну штош! Я надеюсь, что локального все работает иготово для публикации Клуба в продакшн. ПОЕХАЛИ! Надеюсь вы получите удовольствие от настройки Клуба :)
Структура проекта в GitHub
Структура бранчей
При создании форка репозитория Vas3k'а в GitHub по умолчанию был создан master бранч вашего Клуба, и для него были отключены все GitHub Actions.
Скрипты Actions располагаются в директории ".github/workflows" вашего проекта:
По умолчанию, унаследованы следующие GitHub Actions:
- Run tests - файл "tests.yml". Запускает тест Линтер и функциональные тесты Клуба.
- Check it could be build and run from scratch - файл "check_build_and_run.yml". Тест, что Клуб может быть запущен с параметрами по умолчанию. Это смоук тестирование Клуба.
- Deploy production - файл "deploy.yml". Запускает скрипт публикации и запуск Клуба в продакшн среде. Это основной Action, с помощью которого осуществляется публикация новой версии Клуба.
CodeQL - файл "codeql-vulnerability-analysis.yml". Запускает анализатор кода Клуба. Мне не удалось нормально запустить этот Action, поэтому, он останется выключенным.
Ранее мы договаривались, что мы дополнительно сделаем следующие ветки (бранчи) Клуба:
- dev - для локальных доработок. Сюда мы будем делать коммиты всех локальных доработок.
- deploy - бранч, который отвечает за публикацию новой версии Клуба в продакшн, когда в него делается пул реквест.
Процесс доработок выглядит следующим образом:
- Локальные доработки делаем в dev ветке (бранче). При коммите тест Action не запускаются.
- Когда в dev ветке сделаны логически законченные доработки, то синхронизируем dev с master. Синхронизацию доработок будем делать через pull request -> запускаются тест Action "Check it could be build and run from scratch и Run tests".
- Когда хотим опубликовать новую версию Клуба в продакшн, то делаем pull request из master ветки в ветку deploy. При этом запускается Action "Deploy production".
Обратите внимание, что осуществлять публикацию мы будем при условии, что тестовые Actions успешно пройдены.
Для перехода в раздел GitHub Actions нужно выбрать соответствующую вкладку:
Пока еще все GitHub Actions отключены.
Проверьте, что локальные доработки из 3 части статей сделаны для dev ветки. Если это не так, то пообещайте себе и мне, что следующие инкрементальные доработки будут сделаны в dev бранче ❗
Исследуем GitHub Actions
Исследуем Makefile
Откройте файл Makefile в корне вашего Клуба. В этом файле содержатся команды, которые запускают Клуб в различных средах - тестовом или продакшн окружении.
Исследуйте этот файл, обратите внимание на команды и их названия. Вот примеры:
run-bot: ## Runs telegram bot pipenv run python bot/main.py docker-run-bot: python3 bot/main.py docker-run-dev: ## Runs dev server in docker python3 ./utils/wait_for_postgres.py python3 manage.py migrate python3 manage.py update_tags python3 manage.py runserver 0.0.0.0:8000
Знакомые команды, неправда ли? Все эти команды вызываются при запуске Клуба с помощью Docker. Вот пример из файла docker-compose.yml (см. "command: make docker-run-dev"):
...
services:
club_app: &app
build:
dockerfile: Dockerfile
context: .
command: make docker-run-dev
...Т.е. при запуске команды "docker-compose -f docker-compose.yml up -d" в контейнерах будут выполнены команды из Makefile раздела "docker-run-dev".
Исследуем Action "Check it could be build and run from scratch"
Файл .github/workflows/check_build_and_run
name: Check it could be build and run from scratch
on:
pull_request:
branches: master
jobs:
dockerize:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Build the docker-compose stack
run: docker-compose up -d
- name: Sleep
uses: jakejarvis/wait-action@master
with:
time: '20s'
- name: Check db migrate on container
run: |
docker-compose exec -T club_app make docker-migrate
- name: Check build frontend on container
run: |
docker-compose exec -T webpack npm run build Этот скрипт будет запущен при создании pull request в master ветку (бранч):
- В Docker будет запущены сервисы Клуба из файла docker-compose.yml с параметрами по умолчанию (т.е. .env файл будет отсутствовать).
- Далее будет установлен таймаут 20 секунд на запуск сервисов.
- После будет запущена миграция базы данных в сервисе docker-compose exec -T club_app make docker-migrate (docker-compose exec -T club_app make docker-migrate).
- После в сервисе webpack будет запущен frontend (docker-compose exec -T webpack npm run build)
Если все сервисы успешно будут запущены, то данный смоук тест позеленеет.
Вы можете уже активировать данный GitHub Action у себя в репозитарии. Дополнительной настройки этот тест не требует :)
Исследуем Action "Run tests"
Файл .github/workflows/tests.yml Я не буду приводить далее этот файл целиком, только рассмотрим основные моменты.
Скрипт запускается в случае pull request или push в master бранч и содержит два теста:
on:
pull_request:
push:
branches:
- master Обратите внимание, что Клуб запускается в Docker с помощью файла docker-compose.test.yml (о нем ниже). Сервисы запускаются последовательно.
...
- name: Run redis
run: |
docker-compose -f docker-compose.test.yml up -d redis
- name: Run frontend
run: |
docker-compose -f docker-compose.test.yml up -d webpack
...Для этого теста важно, чтобы корректно были внесены правки в файл settings.py, что мы делали во второй части. Этот Action активируем когда актуализируем файл docker-compose.test.yml.
Исследуем Action "Deploy production"
Файл .github/workflows/deploy.yml Это ключевой Action для публикации Клуба в продакшн.
В самом начале этого скрипта указано, что он срабатывает при прохождении pull request'а или push'а в ветку deploy.
on:
push:
branches:
- Deploy - build - данный скрипт собирает образ Docker Клуба (image) и выкладывает (push) его в репозитарий GitHub Packages. Образ собирается с помощью конфигурационного файла Dockerfile.
- deploy - этот скрипт используется для публикации и запуска Клуба на продакшн сервере. Для этого скрипт осуществляет подключение по ssh к продакшн серверу, скачивает последнюю версию образа Клуба, генерирует .env файл и копирует docker-compose.production.yml файла.
Этот Action активно использует секреты репозитарий вашего Клуба, о которых ниже.
Файл docker-compose.test.yml
Файл docker-compose.test.yml
В этом файле нужно задать значения для следующих параметров сервисов tests и Postgres:
Запускаются следующие сервисы:
Для сборки образа используется Dockerfile. Его править не нужно.
В третье части мы включали бесплатный вход в Клуб. Чтобы тестирование Клуба проходило успешно нам потребуется отключить некоторые тесты Stripe и Patreon. Для этого нам нужно отредактировать файл auth/views/tests.py.
Нужно пометить некоторые функции декоратором @skip:
@skip("Free membership")
def test_login_user_not_exist(self):
response = self.client.post(reverse('email_login'),
data={'email_or_login': 'not-existed@user.com', })
self.assertContains(response=response, text="Такого юзера нет 🤔", status_code=404)@skip("Free membership. Skip Pateron login")
class ViewPatreonLoginTests(TestCase):
def test_positive(self):
... @skip('Free membership. Skip Pateron login')
@patch('auth.views.patreon.patreon')
class ViewPatreonOauthCallbackTests(TestCase):
@classmethod
def setUpTestData(cls):
... Настройка завершена. Можно активировать GitHub Action и делать коммит в начале в dev ветку, а после сделать pull request в master ветку. Должно запускаться тестирование, и его успешное прохождение. Поздравляю!
Если в процессе тестирования в логе вы видите какие-то ошибки, то их придется поправить руками.
Файл docker-compose.production.yml
Файл docker-compose.production.yml
- club_app - основной сервис Клуба
- queue - планировщик задач
- bot - Телеграмм бот
- cron - планировщик задач по расписанию
- postgres - сервис базы данных
- pgbackups - сервис бэкапа базы данных
- redis - кеш сервис
Нужно создать несколько сетей, чтобы сервисы могли взаимодействовать друг с другом:
networks:
front:
name: pmi_network
club:
name: club_network - Сеть front - эта та сеть, которую мы создавали в первой части статей про Клубостроительства. Все сервисы: Обратный прокси, Pepic, Ogimgd, Mail-сервер; должны быть подключены к этой сети.
- Сеть club нужна для того, чтобы сервисы Клуба взаимодействовали друг с другом.
Сервис club_app
club_app: &app
image: ghcr.io/toptuk/pmiclub:${GITHUB_SHA:-latest}
build:
dockerfile: Dockerfile
context: .
command: make docker-run-production
container_name: club_app
environment:
- MODE=production
- PYTHONUNBUFFERED=1
- DEBUG=false
- APP_HOST=https://pmi.moscow
- MEDIA_UPLOAD_URL=https://media.pmi.moscow/upload/
- POSTGRES_DB=pmi_club
- POSTGRES_USER=pmiclub
- POSTGRES_PASSWORD=pmiclub
- POSTGRES_HOST=postgres
- REDIS_DB=0
- REDIS_HOST=redis
- VIRTUAL_HOST=pmi.moscow,www.pmi.moscow
- VIRTUAL_PORT=8814
- VIRTUAL_PATH=/
env_file:
- club/.env
restart: always
volumes:
- ./frontend/static:/tmp/static
- ./gdpr/downloads:/app/gdpr/downloads
depends_on:
- postgres
- redis
- queue
ports:
- "127.0.0.1:8814:8814"
networks:
- front
- club Круто! Много параметров нужно задать:
- image - образ Клуба, который опубликован в GitHub Packages. Обратите внимание, что должны быть использованы только прописные символы! Пример: ghcr.io/toptuk/pmiclub:${GITHUB_SHA:-latest}, где toptuk - это мой никнейм, pmiclub - название моего образа Клуба. Этот образ публикуется с помощью нашего GitHub Action, посмотрите на следующий пример (см. docker image push ghcr.io/toptuk/pmiclub:$GITHUB_SHA):
build:
name: Build and pull club image
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- run: docker login ghcr.io -u $GITHUB_ACTOR -p ${{ secrets.TOKEN }}
- run: docker build -t ghcr.io/toptuk/pmiclub:latest -t ghcr.io/toptuk/pmiclub:$GITHUB_SHA .
- run: docker image push ghcr.io/toptuk/pmiclub:$GITHUB_SHA
- run: docker image push ghcr.io/toptuk/pmiclub:latest- command: make docker-run-production - скрипт из Makefile.
- APP_HOST - адрес вашего Клуба в Интернете.
- MEDIA_UPLOAD_URL - ссылка на сервис Pepic. Заканчиваться должен на /upload/
- POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_HOST - Параметры для подключения к БД Postgres.
- REDIS_DB, REDIS_HOST - параметры для подключения к сервису Redis. Если ничего не переименовывали, то менять не нужно.
- VIRTUAL_HOST - веб-адрес вашего Клуба для сервиса обратного прокси. С www и без www.
- VIRTUAL_PORT=8814 и VIRTUAL_PATH=/ - вписать эти параметры для настройки обратного прокси.
- Обратите внимание, что .env файл должен располагаться в директории club. Нам потребуется клонировать наш репозитарий на сервер и периодически обновлять его (когда изменяться static файлы).
Сервис Queue
queue:
<<: *app
command: make docker-run-queue
container_name: club_queue
depends_on:
- postgres
- redis
ports: []
networks:
- club - Сервис наследует все параметры из сервиса club_app (см. <<: *app)
- Вызывается скрипт docker-run-queue из Makefile
- Запуск сервиса зависит от запуска сервисов postgres и redis
- Сервис должен быть подключен к сети club, и не подключатся к front.
Сервис Cron
cron:
<<: *app
command: make docker-run-cron
container_name: club_cron
depends_on:
- club_app
- postgres
- redis
ports: [] Надеюсь, что параметры для этого сервиса уже стали для вас тривиальными. Править ничего не нужно :)Удивление вызывает только то, что этот сервис не нужно подключать ни к одной Docker-сети.
Сервис redis
redis:
image: redis:alpine
container_name: club_redis
restart: always
environment:
- ALLOW_EMPTY_PASSWORD=yes
networks:
- club Комментировать особо-то и нечего. Не забудьте подключить этот сервис к Docker-сети club. Остальное должно остаться аналогичным.
Сервис bot
bot:
<<: *app
command: make docker-run-bot
container_name: club_bot
environment:
- APP_HOST=https://pmi.moscow
- POSTGRES_DB=pmi_club
- POSTGRES_USER=pmiclub
- POSTGRES_PASSWORD=pmiclub
- POSTGRES_HOST=postgres
- REDIS_HOST=redis
- REDIS_DB=0
- VIRTUAL_HOST=pmi.moscow
- VIRTUAL_PATH=/telegram/webhook/
- VIRTUAL_PORT=8816
depends_on:
- club_app
- postgres
- redis
ports:
- "8816:8816"
networks:
- club Супер! Тут есть нюансы (не так, как в анекдоте):
- APP_HOST - адрес вашего Клуба
- POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD - уже знакомые вам параметры для подключения к БД. POSTGRES_HOST=postgres - название сервиса БД.
- REDIS_HOST, REDIS_DB - оставляем как есть, если не меняли названия сервисов.
- VIRTUAL_HOST - веб-адрес вашего Клуба без "https://".
- VIRTUAL_PATH=/telegram/webhook/ - оставить "как есть". Это контроллер, обрабатывающий обращения к боту.
- VIRTUAL_PORT=8816 - внешний порт для обращения к сервису, куда будут проксироваться запросы.
- Сервис должен быть подключен к сети "club".
Сервис postgres
postgres:
image: postgres:12
container_name: club_postgres
restart: always
environment:
POSTGRES_USER: pmiclub
POSTGRES_PASSWORD: pmiclub
POSTGRES_DB: pmi_club
volumes:
- /home/pmi-admin/pgdata:/var/lib/postgresql/data:rw
ports:
- "127.0.0.1:54333:5432"
networks:
- club - POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB - параметры подключения к БД Postgres 12.
- Сервис должен подключаться к Docker-сети "club"
- Раздел volumes - нужно задать директорию, где будет локально храниться БД и синхронизироваться с Docker контейнером. Вам нужно изменить левую часть "/home/pmi-admin/pgdata" на свой путь.
Чтобы определить путь, где будет храниться БД нужно на сервере выполнить команду "pwd". В консоль будет возвращен путь до текущей директории. У меня это - "/home/pmi-admin/".
После этого, придумать название директории, где будут синхронизироваться файлы БД. У меня это "pgdata". Создавать ее вручную не надо, она будет создана автоматически при запуске сервиса postgres.
В итоге должны получить строку, соответствующую шаблону "/home/<user_name>/<db_directory>/. Эту строку записываем в левую часть раздела volumes.
Сервис pgbackups (опционально)
Предлагаю сразу сделать сервис, который бы периодически бекапил базу данных. В следующей статье вы узнаете как сделать так, чтобы ничего не потерялось :)
pgbackups:
image: prodrigestivill/postgres-backup-local
restart: always
volumes:
- /home/pmi-admin/backup/pmi/pgdata:/backups
links:
- postgres
depends_on:
- postgres
environment:
- POSTGRES_HOST=postgres
- POSTGRES_DB=pmi_club
- POSTGRES_USER=pmiclub
- POSTGRES_PASSWORD=pmiclub
- POSTGRES_EXTRA_OPTS=-Z6 --schema=public --blobs
- SCHEDULE=@weekly
- BACKUP_KEEP_DAYS=7
- BACKUP_KEEP_WEEKS=4
- BACKUP_KEEP_MONTHS=6
- HEALTHCHECK_PORT=8080
networks:
- club Подробно почитать про "prodrigestivill/postgres-backup-local" можно тут: https://hub.docker.com/r/prodrigestivill/postgres-backup-local
На сервере нужно сделать (создать) директорию резервного хранилища. У меня это "/home/pmi-admin/backup/pmi/pgdata", у вас путь может быть другой, но не забудьте актуализировать секцию volumes.
Для директории бэкапов нужно установить права на чтение, выполнить "chmod -R 755 <путь до вашей директории>"
Не забудьте указать параметры POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD.
Секреты GitHub Actions
Приступим к настройке секретов GitHub Actions. Напомню, что они используются для деплоя новой версии Клуба.
В своем репозитарий Клуба в Github переходим в Settings -> Secrets/Actions:
С помощью кнопки "New repository secret" добавляем следующие параметры из .env файла (см. часть 2):
- APP_HOST - веб-адрес вашего Клуба. Например: https://pmi.moscow
- EMAIL_HOST - веб-адрес хоста почтового сервера. Например: mail.pmi.moscow
- EMAIL_HOST_PASSWORD - пароль почтового аккаунта, который будет отправлять письма от имени Клуба.
- EMAIL_HOST_USER - имя пользователя почтового аккаунта, который будет отправлять письма от имени Клуба.
- JWT_PRIVATE_KEY - приватная часть JWT ключа. Важно! Проверьте, что нет лишних символов, особенно "\n\r". Лучше вписывайте его длинной строкой, без кавычек.
- MEDIA_UPLOAD_CODE - код для сервиса Pepic (см. первую часть)
- MEDIA_UPLOAD_URL - адрес сервиса Pepic с /upload/ в конце. Например: https://media.pmi.moscow/upload/
- POSTGRES_DB - имя базы данных Postgres. Также, как в docker-compose файлах.
- POSTGRES_PASSWORD - пароль для подключения к базе данных. Такой же как в docker-compose файлах.
- POSTGRES_USER - имя пользователя для подключения к базе данных Клуба. Такой же как в docker-compose файлах.
- SECRET_KEY - секретный ключ для Клуба. Попрежнему не вижу, где он используется, но пускай будет.
- SENTRY_DSN - ссылка на Sentry. Формат такой же как в .env файле, без кавычек. Например: https://<aaabbbcccddd>@<o123456>.ingest.sentry.io/123456
- TELEGRAM_ADMIN_CHAT_ID - идентификатор телеграм чата Модераторов.
- TELEGRAM_BOT_URL - ссылка на телеграммное бота Клуба. Например: https://t.me/pmiclubbot
- TELEGRAM_CLUB_CHANNEL_ID - идентификатор основного Клубного канала. Например: -100123456789
- TELEGRAM_CLUB_CHANNEL_URL - URL адрес Клубного канала.
- TELEGRAM_CLUB_CHAT_ID - идентификатор основного телеграм чата Клуба. Например: -100123456789
- TELEGRAM_CLUB_CHAT_URL - URL адрес Клубного чата.
- TELEGRAM_ONLINE_CHANNEL_ID - идентификатор телеграм Online чата.
- TELEGRAM_ONLINE_CHANNEL_URL - URL адрес Online канала в телеграм.
- TELEGRAM_TOKEN - токен для телеграммное бота.
Вы думаете это всё? Как бы не так... Давайте внимательно исследуем файл deploy.yml (GitHub Action).
Параметр TOKEN
Помните, что в первой части при создании Клуба создавали токен? Надеюсь вы его сохранили. Если нет, то нужно создать новый.
Этот токен используется тут, см. параметр secrets.TOKEN
build:
name: Build and pull club image
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- run: docker login ghcr.io -u $GITHUB_ACTOR -p ${{ secrets.TOKEN }}
- run: docker build -t ghcr.io/toptuk/pmiclub:latest -t ghcr.io/toptuk/pmiclub:$GITHUB_SHA .
- run: docker image push ghcr.io/toptuk/pmiclub:$GITHUB_SHA
- run: docker image push ghcr.io/toptuk/pmiclub:latest Он нужен для авторизации в GitHub Packages "docker login ghcr.io" вместе со встроенным параметром $GITHUB_ACTOR (это ваш логин в GitHub).
Обращаю внимание, что название образа вашего Клуба должно прописными символами. Например: ghcr.io/toptuk/pmiclub:latest
Исправьте, если это не так. Также параметр TOKEN используется в последней строке deploy.yml.
Добавьте параметр TOKEN в секреты вашего репозитария Клуба.
Настраиваем подключение к серверу Клуба
Давайте внимательно посмотрим на следующие строки deploy.yml
...
env:
SSH_KEY_PATH: /tmp/ssh_key
...
- run: echo "${{ secrets.PRODUCTION_SSH_KEY }}" > ${{ env.SSH_KEY_PATH }} && chmod 600 ${{ env.SSH_KEY_PATH }}
- run: scp -o StrictHostKeyChecking=no -i ${{ env.SSH_KEY_PATH }} .env ${{ secrets.PRODUCTION_SSH_USERNAME }}@${{ secrets.PRODUCTION_SSH_HOST }}:/home/pmi-admin/pmi.moscow.club/club/.env
- run: scp -o StrictHostKeyChecking=no -i ${{ env.SSH_KEY_PATH }} docker-compose.production.yml ${{ secrets.PRODUCTION_SSH_USERNAME }}@${{ secrets.PRODUCTION_SSH_HOST }}:/home/pmi-admin/pmi.moscow.club/docker-compose.production.yml
- run: ssh -i ${{ env.SSH_KEY_PATH }} ${{ secrets.PRODUCTION_SSH_USERNAME }}@${{ secrets.PRODUCTION_SSH_HOST }} "cd /home/pmi-admin/pmi.moscow.club && docker login ghcr.io -u $GITHUB_ACTOR -p ${{ secrets.TOKEN }} && docker pull ghcr.io/toptuk/pmiclub:$GITHUB_SHA && docker-compose -f docker-compose.production.yml --env-file=./club/.env up -d && docker system prune --all --force"
...- Задаем параметр SSH_KEY_PATH = /tmp/ssh_key
- В первой строке run в файл SSH_KEY_PATH записывается значение некоторого параметра secrets.PRODUCTION_SSH_KEY.
- Во второй строке run осуществляется копирование файла .env по ssh с использованием файла env.SSH_KEY_PATH (см. "-i ${{ env.SSH_KEY_PATH }}") на сервер secrets.PRODUCTION_SSH_HOST от имени пользователя secrets.PRODUCTION_SSH_USERNAME в файл /home/pmi-admin/pmi.moscow.club/club/.env
Файл .env генерируется Action скриптом командой: run: export | grep "secret_" | sed "s/declare -x secret_//" > .env
- В третьей строке run осуществляется копирование файла docker-compose.production.yml по ssh аналогично предыдущему пункту.
- В четвертой строке осуществляется подключение к серверу по ssh, переход в директорию Клуба, логин в GitHub Packages, загрузка образа Клуба, потом запуск клуба с параметрами "-f docker-compose.production.yml --env-file=./club/.env". Потом вызывается команда "docker system prune --all --force", которая удаляет лишние образы и volumes.
Создаем SSH-ключи для подключения к Deploy серверу
Для деплоя Клуба мне помогла статья: https://zellwk.com/blog/github-actions-deploy/
Переходим в директорию "~/.ssh":
cd ~/.ssh
Выполняем команды для генерации SSH ключей:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
В процессе выполнения команды будет запрошено указание название файла и задание пароля:
В результате будут созданы файлы ssh ключей:
Нужно добавить публичный ключ в файл authorized_keys. Для этого выполним команду:
cat github-actions.pub >> ~/.ssh/authorized_keys
Теперь добавим новый секрет PRODUCTION_SSH_KEY в секреты репозитария Клуба:
cat github-actions
Скопируем содержимое github-actions в значение секрета PRODUCTION_SSH_KEY репозитория Клуба.
Напомню, что значение данного параметра записывается в файл SSH_KEY_PATH: /tmp/ssh_key нашего Action'а deploy.yaml.
Указываем имя пользователя для подключения к серверу по SSH
Самый простой способ узнать имя пользователя для подключения к серверу это выполнить команду whoami:
Нужно в секрете PRODUCTION_SSH_USERNAME репозитария вашего Клуба указать значение имени пользователя, с которыми будет осуществляться подключение к SSH.
Создадим еще один секрет - PRODUCTION_SSH_HOST, в который запишем IP-адрес сервера Клуба.
Делаем Pull request в master бранч
До сих пор, все изменения которые мы делали для Клуба должны были сделаны и закоммичены в бранч Dev репозитария GitHub. Настало время сделать Pull Request в master бранч.
Для этого переходим во вкладку Pull requests и нажимаем на кнопку New pull request:
Выбираем правильные бранчи! Это важно, т.к. я несколько раз ошибался и делал PR'ы в master бранч Vas3k'а (прошу прощения! :)
GitHub должен подсказать, что Pull Request не содержит конфликтов, можно делать объединение (Merge). Создаем PR и после выполняем Merge, даже принудительный.
Отлично! Тут должны синхронизировать ветки dev с master.
Создаем директорию Клуба на сервере
Первое, что мы сделаем - это узнаем текущую директорию. Выполним команду pwd. У меня это "/home/pmi-admin".
Клонируем репозитарий Клуба на сервер. Выполним команду:
git clone https://<TOKEN>@github.com/<username>/<clubrepo>.git
- <TOKEN> - ваш токен для репозитария
- <username> - ваш никнейм в GitHub. У меня это "toptuk"
- <clubrepo> - название репозитария Клуба. У меня это "pmiclub"
В итоге, на сервере должна быть создана директория вашего Клуба:
Теперь в в вашем файле deploy.yml актуализируем пути до Клуба. У меня это "/home/pmi-admin/pmi.moscow.club". У вас должно быть что-то свое.
Заключение
Почувствуйте себя Шерстяным волчарой, вы МОЛОДЕЦ!
Для запуска Клуба нам осталось:
- Настроить обратный прокси для Клуба.
- Запустить Клуба на сервере вручную через создание .env файла в директории club. (Команда кому не терпится и он знает, что делает "docker-compose -f docker-compose.production.yml up -d")
- Создать первого пользователя Администратора (см. 2 часть). Подключить для него Телеграммное бота.
- Попробовать публикацию Клуба с помощью GitHub Action deploy.yml.
Но! Обо всем этом мы поговорим в следующей статье :) Всем Meow! ❤️