Disputa

Свой 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. Ставить что-то на сервер не нужно.

  1. На своём компьютере создайте отдельный ключ и добавьте его на сервер:

    ssh-keygen -t ed25519 -f deploy_key -N ""
    ssh-copy-id -i deploy_key.pub пользователь@адрес
  2. Сохраните ключ и адрес в секреты репозитория, затем удалите файлы ключа с компьютера:

    gh secret set DEPLOY_KEY --repo организация/репозиторий < deploy_key
    gh secret set DEPLOY_TARGET --repo организация/репозиторий --body "пользователь@адрес"
  3. Добавьте в репозиторий файл .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.

На этой странице