---
# System prepended metadata

title: Динамические окружения

---

# Динамические окружения

## Описание 
1. В отдельном репозитории хранится чарт деплоя приложения, содержащий в качестве subchart'ов чарты деплоя ресурсов (например PostgreSQL).
```bash
$ tree
...
├── Chart.yaml
├── charts
│   ├── postgresql.tgz
...
└── values.yaml
```

2. `values.yml` содержит значения по умолчанию для subchart'ов, деплой по умолчанию выключен.


`values.yaml`
```yaml
replicaCount: 1
appVersion: 0.0.1-dev

image:
  repository: my-repository
imagePullSecrets: mysecrets

postgresql:
  enabled: false
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true
```

3. В репозитории приложения хранятся `values`, описывающие общие настройки приложения для любого из окружений и `values` для приложения и subchart'ов конкретного окружения (пароль к базе, флаг необходимости деплоя subchart'а)

`values/dev.yaml`
```yaml
env:
  LOGGER_LEVEL: debug
```

`values/dynamic.yaml`
```yaml
env:
  HOST: postgresql
  SCHEMA: public
  PORT: "5432"

postgresql:
  auth:
    username: super_user
    database: my_super_db
  enabled: true
```
4. В Hashicorp Vault хранятся секреты, например пароли к БД. Монтирование происходит на этапе деплоя чарта.

`secrets.yaml`
```yaml
env:
  PASSWORD: Sup3r!Pa55word

postgresql:
  auth:
    password: Sup3r!Pa55word
```

5. Namespace для деплоя соответствует имени ветки репозитория, domain для ingress так же содержит имя ветки.

6. В `.gitlab-ci.yml` для окружения выставлены значения переменных `on_stop`, `auto_stop_in` и `action`

```yaml
deploy:
  stage: deploy
  script:
    - |
      helm -n ${CI_COMMIT_REF_SLUG} \
      upgrade --install ${CI_PROJECT_NAME} app-chart \
      --set appVersion=${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHORT_SHA} \
      --wait --atomic \
      --values=values/dev.yaml \
      --values=values/dynamic.yaml \
      --values=secrets.yaml \
      --set ingress.custom.domain=${CI_COMMIT_REF_SLUG}.myapp.mydomain.com
  when: manual
  environment:
    name: ${CI_COMMIT_REF_SLUG}
    on_stop: remove
    auto_stop_in: 1 day

remove:
  stage: remove
  script:
    - helm -n ${CI_COMMIT_REF_SLUG} uninstall ${CI_PROJECT_NAME}
  when: manual
  environment:
    name: ${CI_COMMIT_REF_SLUG}
    action: stop
```
## Схема

![](https://i.imgur.com/2FL3ooI.png)
