114 lines
7.2 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.

Вот подробное и структурированное **описание пайплайна развертывания с использованием Docker и удалённого хоста**, которое можно использовать как документацию или комментарий в `.gitlab-ci.yml`:
---
### **Описание пайплайна: Развертывание приложения через Docker Compose с аутентификацией в приватном реестре**
Этот пайплайн предназначен для **безопасного развертывания приложения на удалённом Docker-хосте** с использованием `docker context` и `docker compose`. Он поддерживает защищённое подключение к Docker-демону по TLS и аутентификацию в приватном Docker-реестре (например, Nexus).
---
### **Назначение**
- Автоматическое развертывание сервисов, описанных в `docker-compose.yml`, на удалённом хосте.
- Поддержка развёртывания в разные окружения (например, `test`, `staging`).
- Работа с защищённым Docker-демоном (через TLS-сертификаты).
- Аутентификация в приватном реестре с использованием base64-закодированного пароля.
---
### **Ключевые компоненты**
#### Аутентификация в Docker-реестре
Используется безопасный способ входа через `--password-stdin`:
```yaml
.docker_login_stdin_base64: &docker-login-stdin-base64
- echo $REGISTRY_PASSWORD | base64 -d | docker login -u $REGISTRY_USER $REGISTRY --password-stdin
```
> Пароль передаётся в виде **base64-закодированной строки**, чтобы избежать проблем с спецсимволами и повысить безопасность в логах.
#### Удалённое подключение к Docker (Docker Context)
Создаётся отдельный контекст для безопасного подключения к удалённому хосту:
```yaml
.docker_context_create: &docker-context-create
- docker context create ${CI_PROJECT_NAME}-${ENV} --docker "host=tcp://${HOST},ca=${CA_FILE},cert=${CERT_FILE},key=${KEY_FILE}"
```
> Используются TLS-сертификаты (`ca`, `cert`, `key`) для аутентификации на Docker-хосте.
#### Развертывание через Docker Compose
```yaml
.docker_context_deploy: &docker-context-deploy
- DOCKER_CONTEXT=... docker compose -f docker-compose.yml pull
- DOCKER_CONTEXT=... docker compose -f docker-compose.yml up -d --force-recreate
```
> Обновляет образы и перезапускает контейнеры с принудительным пересозданием.
---
### **Этапы выполнения (`deploy`)**
1. **Вывод переменных окружения** (`env | sort`) — для отладки и аудита.
2. **Логин в Docker-реестр**с расшифровкой пароля из base64.
3. **Создание Docker-контекста** — подключение к удалённому хосту по TLS.
4. **Развертывание сервисов**:
- Скачивание актуальных образов (`pull`).
- Запуск сервисов в фоне с пересозданием (`up -d --force-recreate`).
---
### **Переменные окружения**
| Переменная | Обязательная | Описание |
|-----------|-------------|---------|
| `ENV` | Да | Имя окружения (например, `test`, `staging`) |
| `HOST` | Да | Адрес удалённого Docker-хоста (например, `example.com:2376`) |
| `CA_FILE` | Да | Содержимое файла `ca.pem` (TLS) |
| `CERT_FILE` | Да | Содержимое `cert.pem` |
| `KEY_FILE` | Да | Содержимое `key.pem` |
| `REGISTRY_USER` | Да | Пользователь реестра (например, `nexus`) |
| `REGISTRY_PASSWORD` | Да | **Base64-закодированный** пароль для доступа к реестру |
| `REGISTRY` | Да | URL Docker-реестра (например, `nexus.example.com:5000`) |
| `COMPOSE_FILES` | Нет (по умолч. `-f docker-compose.yml`) | Дополнительные файлы Compose (например, `-f docker-compose.prod.yml`) |
| `DOCKER_IMAGE` | Да | Образ, в котором запускается пайплайн (с установленным Docker CLI) |
> Рекомендуется хранить `CA_FILE`, `CERT_FILE`, `KEY_FILE` и `REGISTRY_PASSWORD` как **CI/CD Variables** в GitLab (с флагом "Masked", если возможно).
---
### **Теги и образ**
- **Образ**: `${DOCKER_IMAGE}` — должен содержать `docker` CLI и поддерживать `docker context` и `docker compose`.
- **Окружение**: Указывается как `environment: name: ${ENV}` — отображается в GitLab CI.
- **Стадия**: `deploy` — выполняется на этапе развертывания.
---
### **Безопасность**
- Пароль реестра **не передаётся напрямую**, а декодируется из base64.
- Подключение к Docker-хосту — **по TLS**, с использованием сертификатов.
- Все чувствительные данные передаются через защищённые CI-переменные.
---
### **Пример использования**
1. Убедитесь, что в CI/CD Variables заданы:
- `NEXUS_PASS_BASE64` — base64-код пароля.
- `CA_FILE`, `CERT_FILE`, `KEY_FILE` — содержимое сертификатов.
2. Запустите пайплайн вручную.
3. Выберите окружение (например, `test`) и убедитесь, что переменные `HOST` и `ENV` корректны.
---
### **Примечания**
- Убедитесь, что удалённый Docker-демон разрешает подключения по TCP с вашего CI-раннера.
- Файлы сертификатов должны быть **полностью вставлены** в переменные (включая `-----BEGIN CERTIFICATE-----` и т.д.).
- Для разных окружений можно создавать отдельные джобы с переопределением `ENV`, `HOST` и т.д.
---
**Назначение:** Быстрое и безопасное развертывание приложений в тестовых/стейджинг окружениях с использованием Docker и приватного реестра.
**Рекомендуется использовать с GitLab CI, Docker 20.10+, и настроенным TLS на Docker-хосте.**
---