Свой VDS
Как запустить работу на своём сервере и обновлять её после каждого изменения в main.
VDS — виртуальный сервер, который вы арендуете у хостинга. На нём работает всё, что запускается у вас: контейнеры, база, фоновые задачи. Обновления системы, место на диске и резервные копии остаются на вас.
Актуальная документация: установка Docker, Caddy как обратный прокси, секреты GitHub Actions.
Подготовить сервер
Нужен сервер с Ubuntu, публичным адресом и обычным пользователем с sudo. Зайдите на него по SSH и поставьте Docker:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USERВыйдите и зайдите снова, затем проверьте, что всё на месте: docker compose version.
Запустить работу
git clone https://github.com/организация/репозиторий.git app
cd app
docker compose up -d --buildКлючи и пароли положите в файл .env на сервере, в репозиторий их не добавляйте. Закрытый репозиторий сначала потребует войти: gh auth login.
Чтобы работа поднималась после перезагрузки, задайте у сервисов в docker-compose.yml restart: unless-stopped.
Открыть адрес
Откройте порт приложения в настройках сети у хостинга и проверьте адрес с другого компьютера. http://адрес:порт уже можно вписать в адрес стенда.
Для HTTPS нужен домен, который указывает на сервер, и открытые порты 80 и 443. Проще всего поставить Caddy: он сам получит и будет продлевать сертификат. Файл Caddyfile:
пример.ru
reverse_proxy :8000Обновлять автоматически
GitHub Actions заходит на сервер по SSH после каждого изменения в main. Ставить что-то на сервер не нужно.
-
На своём компьютере создайте отдельный ключ и добавьте его на сервер:
ssh-keygen -t ed25519 -f deploy_key -N "" ssh-copy-id -i deploy_key.pub пользователь@адрес -
Сохраните ключ и адрес в секреты репозитория, затем удалите файлы ключа с компьютера:
gh secret set DEPLOY_KEY --repo организация/репозиторий < deploy_key gh secret set DEPLOY_TARGET --repo организация/репозиторий --body "пользователь@адрес" -
Добавьте в репозиторий файл
.github/workflows/deploy.yml:
name: Развёртывание
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Обновить сервер
env:
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
DEPLOY_TARGET: ${{ secrets.DEPLOY_TARGET }}
run: |
install -m 600 /dev/null key
printf '%s\n' "$DEPLOY_KEY" > key
ssh -i key -o StrictHostKeyChecking=accept-new "$DEPLOY_TARGET" \
'cd app && git pull --ff-only && docker compose up -d --build'Ход обновления виден во вкладке Actions репозитория. Если сервер не виден из интернета, Actions до него не достучится: тогда нужен свой раннер CI.