BorisovAI
Все публикации
Новая функцияspeech-to-textClaude Code

GitLab Pages выдал секреты: как мы чуть не залили артефакты в интернет

GitLab Pages выдал секреты: как мы чуть не залили артефакты в интернет

Как мы защитили артефакты приватного проекта, но случайно выставили их в интернет

Проект speech-to-text — это голосовой ввод для веб-приложения. Задача казалась стандартной: настроить автоматизированный релиз артефактов через CI/CD. Но когда я начал копать, обнаружилась забавная особенность GitLab Pages, которая чуть не стала залогом безопасности нашего проекта.

Когда публичное скрывается за приватным

Первым делом я исследовал варианты хранения и раздачи собранных ZIP-файлов. В репозитории всё приватное — исходники защищены, доступ ограничен. Проверил GitLab Releases — отличное решение, вот только возникла проблема: как скачивать артефакты с публичного фронтенда, если сам проект закрыт?

Тогда я посмотрел на GitLab Package Registry — тоже приватный по умолчанию. Но потом наткнулся на странное: GitLab Pages генерирует статические сайты, которые всегда публичны независимо от приватности самого проекта. То есть даже если репо закрыт для всех, Pages будут доступны по ссылке для любого, кто её узнает.

Неожиданно выяснилось: это не баг, а фича. Pages часто используют именно для этого — расшарить артефакты или документацию публично, не давая при этом доступ в репо.

Как я построил конвейер

Архитектура получилась такой: скрипт на Python собирает проект, упаковывает в ZIP и загружает в GitLab Package Registry. Затем я создал CI pipeline, который срабатывает на тег вида v* (семантическое версионирование). Pipeline скачивает ZIP из Package Registry, деплоит его на GitLab Pages (делает доступным по публичной ссылке), обновляет версию в Strapi и создаёт Release в GitLab.

Для работы потребилась переменная CI_GITLAB_TOKEN с соответствующим доступом — её я забил в CI Variables с флагами protected и masked, чтобы она не оказалась в логах сборки.

Версионирование жёсткое: версия указывается в src/__init__.py, оттуда её подхватывает скрипт при сборке. Архивы называются в стиле VoiceInput-v1.0.0.zip.

Идея, которая в голову не пришла

Интересный момент: изначально я беспокоился, что приватный проект станет помехой. На деле оказалось, что Pages — это идеальное решение для раздачи артефактов, которые не нужно прятать, но и не нужно давать доступ к исходникам. Классический сценарий для скачиваемых утилит, библиотек или сборок.

Теперь релиз — это одна команда: .\venv\Scripts\python.exe scripts/release.py. Скрипт собирает, архивирует, загружает, пушит тег. А CI сам позаботится о Pages, Strapi и Release.

😄 Почему GitLab Pages пошёл в терапию? Потому что у него была сложная личная жизнь — он был публичным, но никто об этом не знал!

Метаданные

Session ID:
grouped_speech-to-text_20260208_1523
Branch:
master
Dev Joke
Почему FastAPI пошёл к врачу? У него были проблемы с производительностью

Часть потока:

Разработка: speech-to-text

Оцените материал

0/1000