https://gitlab.4gain.pro — основной хостинг репозиториев forGain. Self-hosted GitLab EE на firefly.
| Поддомен | URL | Что |
|---|---|---|
gitlab |
https://gitlab.4gain.pro | основной web UI + git-server |
registry |
https://registry.4gain.pro | Docker container registry (docker login registry.4gain.pro) |
pages |
https://pages.4gain.pro | GitLab Pages (статические сайты per-project) |
Хостит код всех проектов forGain (ансибл-роли sm2c-*, docker-images elk-*, …) и работает как CI engine (.gitlab-ci.yml → 3 runner'а на firefly публикуют образы в registry).
⚠ Версия 14.2.7-ee.0 (release 2021 года, давно EOL). См. TODO ниже.
gitlab (compose, name=gitlab)| Container | Image | Назначение |
|---|---|---|
gitlab |
gitlab/gitlab-ee:14.2.7-ee.0 |
основное GitLab + container registry в одном omnibus-образе |
gitlab_pages |
то же | gitlab-pages 1.42.0 — отдельный процесс с entrypoint: /opt/gitlab/embedded/bin/gitlab-pages |
gitlab_postgresql |
postgres:12 |
основная БД |
gitlab_redis |
sameersbn/redis:4.0.9-2 |
session store + cache |
gitlab_runner_00 / 01 / 02 |
gitlab/gitlab-runner:v14.2.0 |
три CI-runner'а с docker-in-docker |
Все в одной compose-network gitlab (bridge).
Через общий traefik в swarm. File-route /mnt/swarm/traefik_data/custom/pro-4gain-gitlab.yml:
gitlab.4gain.pro → http://10.19.1.150:81 → container gitlab:80registry.4gain.pro → http://10.19.1.150:81 (тот же gitlab; nginx внутри роутит по Host)pages.4gain.pro → http://10.19.1.150:82 → container gitlab_pages:8090LE через letsEncrypt resolver (HTTP-01).
Все persistent под /mnt/compose/gitlab/data/gitlab/volumes/:
| Container path | Host path (под volumes/) |
Что |
|---|---|---|
/etc/gitlab |
config/ |
gitlab.rb, gitlab-secrets.json (БД encryption key!) |
/var/opt/gitlab |
data/ |
репозитории, postgres, builds, LFS, uploads, backups, gitlab-pages |
/var/log/gitlab |
logs/ |
логи |
| (per runner) | runner-{00,01,02}/ |
runner config + token |
| Хост | Контейнер | Назначение |
|---|---|---|
| 22 | gitlab:22 | git@gitlab.4gain.pro SSH |
| 2222 | gitlab:22 | альтернативный SSH (если 22 занят на хосте) |
| 81 | gitlab:80 | gitlab + registry HTTP backend (за traefik) |
| 82 | gitlab_pages:8090 | gitlab-pages backend (за traefik) |
Ансибл-роль sm2c-cloud-gitlab (compose-стек по конвенции). Compose-файл живёт в legacy-расположении /mnt/compose/gitlab/data/gitlab/docker-compose.yml (нестандартное).
cd ansible/playbooks
ansible-playbook -c ssh service-gitlab-bootstrap.yml
Toggles:
sm2c_cloud_gitlab_skip_deploy: false — пропустить deploysm2c_cloud_gitlab_remove_stack: false — снести стек (с persistent сохраняется по умолчанию через skip_rm_persistent_data: true)Override переменных в inventory/group_vars/all.yml :: gitlab.* или host_vars/firefly.e1.4gain.pro.yml.
Полный runbook + ad-hoc команды + restore сценарии: backup-restore-gitlab.
Кратко:
backup-gitlab.timer каждое воскресенье 04:00 MSK запускает /usr/local/sbin/backup-gitlab.sh. Раскатывается ансибл-плейбуком service-gitlab-backup.yml./mnt/storage/firefly-backup/gitlab/:
<TS>_gitlab_backup.tar — output от gitlab-backup create (репо, БД, LFS, uploads, builds, artifacts, registry, pages, packages).<TS>_config.tar.gz — gitlab.rb + gitlab-secrets.json (без них restore невозможен).Запустить вручную:
ansible-playbook -c ssh service-gitlab-backup.yml -e sm2c_backup_gitlab_run_now=true
См. также реестр всех backup'ов forGain.
Полный runbook со всеми сценариями: backup-restore-gitlab.
Сценарии в runbook'е:
gitlab.rb (изменился конфиг).⚠ Backup tar GitLab версионно-зависимый — restore из 14.2.7 на 17.x не работает напрямую без последовательного апгрейда через major-versions (upgrade-path docs).
С версии 1.42 gitlab-pages обязательно нужны:
-api-secret-key=/var/opt/gitlab/gitlab-pages/.gitlab_pages_secret-gitlab-server=https://gitlab.4gain.proСтарая compose-команда (-listen-proxy + -pages-domain + -pages-root) этого не передавала — pages застревал в Restarting с фатальным GitLab API URL or API secret has not been provided.
Фикс (применён в роли):
command:
- -config
- /var/opt/gitlab/gitlab-pages/gitlab-pages-config # готовый omnibus-config
- -internal-gitlab-server
- http://gitlab # внутри docker network — HTTP (TLS делает traefik)
volumes:
- './volumes/data/gitlab-rails/etc:/var/opt/gitlab/gitlab-rails/etc:ro'
ports:
- "0.0.0.0:82:8090" # omnibus default listen-proxy=:8090
В compose-файле должна быть строка name: gitlab — иначе project name берётся из родительской директории и не сходится с уже running stack (docker compose down/up создаст параллельный).
/mnt/compose/gitlab/data/gitlab/docker-compose.yml исторически был symlink на /mnt/compose/gitlab/docker/docker-compose.yml. Symlink сейчас удалён, реальный compose-файл — в data/gitlab/. Это важно потому что ./volumes/... в compose резолвится относительно реальной директории compose-файла, а не симлинка.
При restore на новый сервер с другим gitlab-secrets.json runner'ы не смогут залогиниться (токены не дешифруются). Re-register: docker exec gitlab_runner_00 gitlab-runner register с new token из gitlab UI.
14.2.7 (2021), EOL давно. После обновления — пересоздать backup в новой версии./mnt/compose/gitlab/data/gitlab/ на стандартное /home/compose/pro-4gain-gitlab/docker/ (по конвенции compose-стеков).Changelog