Гайд по настройке деплоя через ssh и docker контейнеры в github. Развертывать будем на сервер под управлением Ubuntu 23.04.
Предустановка сервера
Нам понадобится docker-compose.
Настроим доступы к нашему серверу
Для этого создадим нового пользователя, под которым будем ходить из github actions:
sudo adduser smith
Разрешим для нашего юзера выполнять docker команды без пароля
sudo usermod -aG docker smith
Для доступа из github, создадим ssh ключ и его же добавим в авторизованные ключи:
ssh-keygen cp .ssh/id_rsa.pub .ssh/authorized_keys
Настройка github
Создадим PAT (персональный токен доступа) на странице - Personal Access Tokens (Classic) (github.com) . Важно его сохранить на время куда-нибудь. Если делаете для организации, то у неё другая страница.
Добавляем секреты в репу (settings -> Secrets -> Actions):
PAT - персональный токен
SSH_HOST - хост машины, на которой будем разворачивать контейнер
SSH_PRIVATE_KEY - приватный ключ юзера smith
SSH_USER - имя юзера, smith
Создаем в репе файл docker-compose.yml с нашим сервисом:
services: example_app: container_name: example_app image: ghcr.io/your_nick/example_app:latest volumes: - ~/data:/app/data
Настраиваем github workflow, файл .github/workflow/deploy.yml:
name: deploy on: pull_request: types: - closed branches: [ "main" ] jobs: build: name: Build runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Login run: | echo ${{ secrets.PAT }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin - name: Build and Publish run: | docker build . --tag ${{ env.DOCKER_TAG }} docker push ${{ env.DOCKER_TAG }} deploy: name: Deploy runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: install ssh keys # check this thread to understand why its needed: # <https://stackoverflow.com/a/70447517> run: | install -m 600 -D /dev/null ~/.ssh/id_rsa echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa ssh-keyscan -H ${{ secrets.SSH_HOST }} > ~/.ssh/known_hosts - name: create docker compose config run: | cat docker-compose.yml | envsubst > docker-compose-secret.yml - name: copy docker compose config run: scp docker-compose-secret.yml ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:docker-compose.yml - name: connect and pull run: ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "docker-compose pull && docker-compose up -d && exit" - name: cleanup config if: always() run: ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "rm docker-compose.yml" - name: cleanup keys if: always() run: rm -rf ~/.ssh docker-compose-secret.yml
В данном случае сборка и деплой будет при мёрже пул-реквеста.
Docker-compose будет скачивать образ из ghcr.io без кредов, поэтому нужно сделать наш пакет публичным. На странице профиля github смотрим вкладку packages. Выбираем пакет и в разделе Package settings открываем доступ.
Есть опция сделать работу с приватным пакетом, тогда нужно PAT везде использовать, будет чуть сложнее конфиг workflow.
P.S.:
На этом всё. Напишите, как вы разворачиваете с помощью github свои проекты. Вероятно мой вариант не самый удобный.
