CI/CD
Документ описывает, как устроен автоматический деплой экосистемы GeoPoint: какие репозитории участвуют, что происходит при push в main и куда попадают артефакты.
Общая схема
GeoPoint состоит из пяти репозиториев. Деплой идёт через GitLab CI на runner с тегом geopoint. Триггер — push в ветку main.
Код и контейнеры лежат на сервере в /opt/geopoint.
Репозиторий | Назначение | Результат деплоя |
| REST API | Docker-контейнер |
| Сайт | Docker-контейнер |
| Android-приложение | APK в каталог загрузок сайта |
| Кодификатор Topomatic | Файл |
| Плагин Topomatic Robur | Исполняемый файл в каталог загрузок |
Адреса в проде:
Сайт — https://geopoint.end-point.ru
Загрузки — https://geopoint.end-point.ru/download
REST API — https://geopoint-rest.end-point.ru
Общие правила
При деплое rest_api и website код копируется на сервер через rsync. Из копирования исключаются:
.git,.gitlabconfig/,.envvendor/,storage/resources/download/
Параллельные деплои одного окружения блокируются через resource_group: production.
Статус можно посмотреть в GitLab: репозиторий → CI/CD → Pipelines.
rest_api
Папка на сервере: /opt/geopoint/rest
Контейнер: geopoint-rest
Пайплайн из трёх стадий.
deploy:prepare — rsync кода в /opt/geopoint/rest, создание storage/cache и resources/download.
deploy:docker — в каталоге .deploy выполняется docker compose up -d --build, затем ожидание готовности контейнера.
deploy:finalize — composer install --no-dev внутри контейнера, настройка прав на storage, перезагрузка Apache.
Конфигурация API — в core/config/.env и core/config/.ini на сервере. База подключается через внешнюю Docker-сеть geopoint_db.
website
Папка на сервере: /opt/geopoint/website
Контейнер: geopoint-website
Схема такая же, как у rest_api: prepare → docker → finalize.
Конфигурация — в config/ на сервере (в git не попадает). Зависимости ставятся через composer при finalize.
Сайт обращается к API через REST_URL из server-side config. Авторизация — через Authentik.
Страница /download показывает файлы из resources/download/, если они там есть:
GeoPoint.apk— мобильное приложениеGeoPoint.semantic— кодификаторGeoPoint.msi— плагин Topomatic
mobile
Сборка и публикация APK — два этапа.
build:apk — сборка release APK в Docker. В GitLab CI/CD Settings должны быть заданы переменные:
ANDROID_KEYSTORE_BASE64ANDROID_KEYSTORE_PASSWORDANDROID_KEY_ALIASANDROID_KEY_PASSWORD
Результат — артефакт .ci/GeoPoint.apk.
deploy:apk — копирование в /opt/geopoint/website/resources/download/GeoPoint.apk. Сайт перезапускать не нужно.
Release-сборка ходит в реальный API. Debug-сборка с mock-данными собирается локально в Android Studio.
Сборка может занимать до 15 минут.
codifier
В репозитории лежит файл GeoPoint.semantic.
При push в main job deploy:semantic копирует его в /opt/geopoint/website/resources/download/GeoPoint.semantic. После этого файл доступен на странице загрузок.
robur_plugin
Плагин собирается локально в Visual Studio. CI только публикует готовый бинарник.
Job deploy:download запускается, если в коммите изменился файл .build/GeoPoint.exe. Он копируется в /opt/geopoint/website/resources/download/GeoPoint.exe.
Структура на сервере
/opt/geopoint/ ├── rest/ # rest_api │ ├── .deploy/ │ └── core/config/ └── website/ # website ├── .deploy/ ├── config/ └── resources/download/ ├── GeoPoint.apk ├── GeoPoint.semantic └── GeoPoint.exe
Если pipeline упал
rsync / Permission denied — на сервере мешают права на файлы или каталоги, которые rsync пытается удалить или перезаписать. Чаще всего это storage/ или логи.
Контейнер не стал healthy — смотреть логи: docker logs geopoint-rest или docker logs geopoint-website.
mobile: не задана переменная ANDROID_* — проверить CI/CD Variables в настройках репозитория.
codifier: файл не найден — в корне репозитория должен лежать GeoPoint.semantic.
robur_plugin: job не запустился — в коммите должен измениться .build/GeoPoint.exe.