Сайт обновляется сам после git push
При ручной сборке и заливке сайта на Hugo, Astro или другом генераторе на сайте может оказаться не та версия. Как публиковать его автоматически из GitHub Actions, GitLab CI, Gitea или Forgejo.
При ручной сборке и заливке сайта на генераторе правки копятся, и на сайте может оказаться сборка, которой нет в репозитории.
Решение — публиковать из CI: что в основной ветке, то и на сайте. Для этого есть токен, который умеет только публиковать один сайт.
Что получится: каждый push в main попадает на сайт, как только завершится задание CI; ручных
заливок больше нет.
Понадобится: созданный сайт у нас, репозиторий на
GitHub, GitLab, Gitea или Forgejo и работающая команда сборки. Время: 10 минут.
1. Выпустите токен публикации
Заголовок раздела «1. Выпустите токен публикации»В кабинете откройте сайт кнопкой Управление, блок Токены публикации (CI) → Создать токен. Скопируйте его сразу: полностью он показывается один раз.
Токен умеет только загружать файлы и публиковать этот сайт. Настройки сайта, домен, DNS и другие сайты ему недоступны, так что утечка из CI обойдётся дёшево — и отозвать его можно там же одной кнопкой.
2. Положите токен в секреты репозитория
Заголовок раздела «2. Положите токен в секреты репозитория»Имя — WS_TOKEN: так его найдёт CLI без дополнительных флагов.
- GitHub, Gitea, Forgejo: Settings → Secrets → Actions → New secret.
- GitLab: Settings → CI/CD → Variables, с галочками Masked и Protected. Первая не пустит токен в лог задания, вторая — в сборки чужих веток.
Токен не должен попасть в сам репозиторий, даже в приватный.
3. Добавьте задание публикации
Заголовок раздела «3. Добавьте задание публикации»GitHub Actions, Gitea, Forgejo — синтаксис общий:
# .github/workflows/deploy.yml (в Gitea и Forgejo — .gitea/workflows/ или .forgejo/workflows/)name: Deploy siteon: push: branches: [main]
# Несколько push подряд — публикует последний, остальные отменяются.concurrency: group: deploy-site cancel-in-progress: true
jobs: deploy: runs-on: ubuntu-latest env: WS_TOKEN: ${{ secrets.WS_TOKEN }} steps: - uses: actions/checkout@v5 - run: npm ci && npm run build # ваша сборка → ./dist - name: Установка CLI run: curl -fsSL https://raw.githubusercontent.com/webshieldpro/webshield-cli/main/install.sh | sh - name: Публикация run: ~/.local/bin/webshield sites publish www.example.com --dir ./distGitLab CI:
deploy: image: node:24 rules: - if: $CI_COMMIT_BRANCH == "main" interruptible: true script: - npm ci && npm run build # ваша сборка → ./dist - curl -fsSL https://raw.githubusercontent.com/webshieldpro/webshield-cli/main/install.sh | sh - ~/.local/bin/webshield sites publish www.example.com --dir ./distПодставьте свою команду сборки и папку результата. Для популярных генераторов они есть в
таблице: Hugo кладёт сайт в
public/, Astro — в dist/, MkDocs — в site/. Hugo собирается не через npm, а своей
командой — замените строку сборки, например, на готовое действие peaceiris/actions-hugo
и hugo --minify.
4. Проверьте, что публикуется именно то
Заголовок раздела «4. Проверьте, что публикуется именно то»Перед первым настоящим запуском посмотрите план на своей машине:
WS_TOKEN=… webshield sites publish www.example.com --dir ./dist --dry-runCLI посчитает, сколько файлов зальёт, сколько удалит и сколько оставит как есть, и ничего не тронет. Если к удалению — весь сайт, указана не та папка.
Затем сделайте push. В журнале задания будет та же сводка и строка об успешной публикации.
Как это работает
Заголовок раздела «Как это работает»- Загружается только разница. CLI сравнивает файлы с тем, что уже лежит у нас, и отправляет изменившиеся. Правка одной страницы — один файл, а не весь сайт.
- Публикация атомарна. Посетитель видит либо прежнюю версию, либо новую целиком — никогда смесь из старого CSS и нового HTML.
- Кеш сбрасывать не нужно. Каждая публикация — новая версия, и старый кеш к ней не относится.
- Упавшая публикация не останется висеть. Если файлы залились, а публикация не прошла, следующий запуск это заметит и опубликует заново.
Проверка
Заголовок раздела «Проверка»curl -sI https://www.example.com/ | head -1Ответ HTTP/2 200, на сайте — свежая правка. Если её не видно, обновите страницу без кеша браузера (Ctrl+F5).
Если не работает
Заголовок раздела «Если не работает»| Симптом | Причина и решение |
|---|---|
| Ошибка авторизации | Секрет не передан в задание: проверьте env: WS_TOKEN, а в GitLab — что ветка защищённая, иначе Protected-переменная в неё не попадает. |
| Сайт не найден | Токен выпущен для другого сайта или имя в команде опечатано. Токен публикации видит только свой сайт. |
| В сводке к удалению — весь сайт | --dir указывает не на папку сборки, или сборка упала раньше и папка пуста. |
| Задание проходит, сайт не меняется | Публикуется другой хост: сверьте имя в команде с именем сайта в кабинете. |
Отклонены .exe, .apk и подобные |
Исполняемые файлы доступны только на коммерческих тарифах. |
Что дальше
Заголовок раздела «Что дальше»- Клиент командной строки — остальные команды и профили.
- Переадресации — файл
_redirectsпубликуется вместе с сайтом и тоже живёт в репозитории. - Форма обратной связи без бэкенда.