124 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
### Описание пайплайна развёртыванияя PostgreSQL-сервиса через Docker Compose
Данный пайплайн предназначен для **безопасного и гибкого развёртывания контейнеризованного PostgreSQL-сервиса** на удалённых хостах с использованием `docker compose` и mTLS-аутентификации. Поддерживает развёртывание на нескольких серверах в **`dev`-окружении** с предварительной настройкой контекста и параметризацией конфигурации.
---
#### Условия запуска
```yaml
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "push"
when: never
- when: always
```
- Пайплайн **не запускается автоматически при `push`** (например, при коммите в ветку)
- Может быть запущен **вручную** через интерфейс GitLab или API
- Это предотвращает случайные деплои и обеспечивает контроль над процессом
---
#### Основные переменные (с параметризацией)
Пайплайн использует **настраиваемые CI-переменные**, доступные при запуске:
| Переменная | Значение / Опции | Описание |
|-----------|------------------|--------|
| `ENV` | `"dev"` | Целевое окружение. Сейчас поддерживается только `dev`. |
| `HOST` | `$APN1_HOST`, `$APN2_HOST`, `$DBN1_HOST`, `$DBN2_HOST` | Выбор сервера для развёртывания. Определяет, на какой хост будет развернут контейнер. |
| `POSTGRESQL_HOSTNAME_NAME` | — | Имя контейнера/хоста PostgreSQL (например, `postgres-db`) |
| `POSTGRES_PORT` | — | Внешний порт, на котором будет доступен PostgreSQL (например, `5432`) |
| `PROXY_NETWORK` | `proxy` | Сеть Docker, к которой подключается контейнер (по умолчанию — `proxy`) |
| `POSTGRES_DB` | — | Имя основной базы данных |
| `POSTGRES_USER` | — | Имя пользователя по умолчанию |
| `POSTGRES_PASSWORD` | — | Пароль пользователя (передаётся безопасно, base64-кодированный) |
> Все переменные заполняются **вручную при запуске пайплайна**, что делает его гибким и пригодным для разных сценариев развёртывания.
---
#### Настройка mTLS-аутентификации
Перед запуском задачи выполняется блок `before_script`, в котором устанавливаются переменные для **безопасного подключения к Docker-демону**:
```yaml
.set_docker_context_vars:
case "$HOST" in
"$APN1_HOST") ... export CA_FILE, CERT_FILE, KEY_FILE ;;
...
esac
```
- Для каждого `HOST` автоматически подставляются соответствующие пути к сертификатам:
- `CA_FILE` — сертификат центра сертификации
- `CERT_FILE` — клиентский сертификат
- `KEY_FILE` — закрытый ключ
- Обеспечивается **взаимная аутентификация (mTLS)** при подключении к удалённому Docker-хосту
---
#### Внешний шаблон развёртывания
```yaml
include:
- project: 'devops/services/gitlab-flow/ci-flow'
ref: v1.0.1
file: 'deploy_docker-compose-context.yml'
```
- Пайплайн использует **централизованный шаблон развёртывания**, содержащий стандартные шаги:
- Вход в реестр
- Создание Docker-контекста
- Выполнение `docker compose up`
- Гарантирует **единообразие и безопасность** во всех проектах
---
#### Основная задача: `deploy_compose`
Расширяет шаблон `.deploy_from_registry` и переопределяет ключевые параметры:
| Параметр | Значение |
|--------|--------|
| `extends` | `.deploy_from_registry` |
| `environment` | `dev` |
| `REGISTRY` | `$SED_DOCKER_REGISTRY` (внутренний прокси-реестр) |
| `REGISTRY_USER` / `REGISTRY_PASSWORD` | `$SED_NEXUS_USER`, `$SED_NEXUS_PASS_BASE64` |
| `COMPOSE_FILES` | `-f ./docker-compose.yml` |
| `before_script` | Установка mTLS-сертификатов через `*set-docker-context-vars` |
| `tags` | `mmedo` — запуск только на специализированных раннерах с поддержкой mTLS |
---
#### при запуске происходит:
1. Выбор хоста и параметров PostgreSQL
2. Установка mTLS-сертификатов в зависимости от `HOST`
3. Вход в Docker-репозиторий nexus (`SED_DOCKER_REGISTRY`)
4. Создание защищённого Docker-контекста с подключением к удалённому хосту
5. `docker compose pull` — загрузка актуальных образов
6. `docker compose up -d --force-recreate` — пересоздание и запуск контейнера
---
### Как запустить
1. Перейдите в **CI/CD → Pipelines** в GitLab
2. Нажмите **"Run pipeline"**
3. Укажите:
- `HOST` — например, `dbn1.example.com`
- `POSTGRESQL_HOSTNAME_NAME` — имя контейнера
- `POSTGRES_PORT`, `POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD`
4. Запустите — приложение будет развёрнуто на выбранном сервере
---
> **Важно!!!!!!!!**: Убедитесь, что все переменные с паролями и сертификатами корректно настроены в проекте GitLab как **CI/CD Variables**, желательно с типом **File** или **Masked**.
---