# Docker — Production Deployment Workflow

Эта страница описывает рекомендуемый процесс обновления и развёртывания Docker-проектов на production-сервере. Здесь показан безопасный порядок действий при обновлении кода, образов и контейнеров, а также базовые проверки после деплоя. Материал ориентирован на начинающих и помогает выполнять обновления **предсказуемо и без случайных простоев сервисов**.

---

# Что такое Deployment Workflow

Deployment Workflow — это **последовательность действий**, которую нужно выполнять при обновлении проекта.

Без чёткой процедуры часто возникают проблемы:

* контейнеры запускаются со старыми образами
* сервисы падают после обновления
* изменения не применяются
* ломается база данных
* проект уходит в простой

Поэтому важно использовать **одинаковый и проверенный порядок действий**.

---

# Типичная структура проекта

Пример директории проекта:

```text
/opt/flamy_projects/site1

docker-compose.yml
.env
Dockerfile
src/
```

Где:

| Файл               | Назначение               |
| ------------------ | ------------------------ |
| docker-compose.yml | конфигурация сервисов    |
| Dockerfile         | инструкция сборки образа |
| .env               | переменные окружения     |
| src                | исходный код приложения  |

---

# Стандартная процедура обновления проекта

## Шаг 1 — перейти в директорию проекта

```bash
cd /opt/flamy_projects/site1
```

Проверить файлы:

```bash
ls -la
```

Важно убедиться, что вы находитесь **в правильной директории проекта**.

---

# Шаг 2 — обновить код проекта

Если используется Git:

```bash
git pull
```

Команда скачивает последние изменения из репозитория.

### Когда это нужно

* обновление приложения
* исправления ошибок
* новые функции

---

# Шаг 3 — обновить Docker-образы

Если проект использует готовые образы из registry, нужно загрузить новые версии.

```bash
docker compose pull
```

Команда скачает новые версии образов, указанных в `docker-compose.yml`.

---

# Шаг 4 — пересобрать контейнеры (если требуется)

Если изменились:

* Dockerfile
* зависимости
* системные пакеты

нужно пересобрать образ.

```bash
docker compose up -d --build
```

Эта команда:

1. пересоберёт образы
2. обновит контейнеры
3. запустит сервисы

---

# Шаг 5 — проверить состояние контейнеров

```bash
docker compose ps
```

Пример результата:

```text
NAME           STATUS
site1_nginx    Up
site1_php      Up
site1_mysql    Up
```

Все сервисы должны иметь статус **Up**.

---

# Шаг 6 — проверить логи

После обновления важно убедиться, что сервисы работают корректно.

```bash
docker compose logs --tail=50
```

В логах не должно быть:

* ошибок запуска
* ошибок подключения к базе
* критических ошибок приложения

---

# Шаг 7 — проверить работу приложения

После деплоя рекомендуется проверить:

* доступность сайта
* работу API
* соединение с базой данных
* фоновые задачи (workers, cron)

---

# Быстрое обновление проекта

На практике часто используется короткая команда:

```bash
docker compose pull && docker compose up -d
```

Она:

1. скачивает новые образы
2. обновляет контейнеры

Это самый быстрый способ обновить сервис.

---

# Полное обновление проекта

Если нужно полностью пересобрать контейнеры:

```bash
docker compose build --no-cache
docker compose up -d
```

Это полезно, если:

* изменения не применяются
* образ собран неправильно
* нужно выполнить чистую сборку

---

# Полный перезапуск проекта

Иногда требуется полностью остановить и заново запустить сервисы.

```bash
docker compose down
docker compose up -d
```

Это может помочь при:

* сетевых проблемах
* зависших контейнерах
* некорректном состоянии сервисов

---

# Перезапуск одного сервиса

Если проблема только в одном сервисе:

```bash
docker compose restart nginx
```

Это быстрее и безопаснее, чем перезапуск всего проекта.

---

# Откат версии (Rollback)

Если после обновления возникли проблемы, можно откатиться к предыдущей версии.

Пример:

```bash
git checkout <previous_commit>
docker compose up -d --build
```

Это восстановит предыдущую рабочую версию приложения.

---

# Проверка после деплоя

После обновления рекомендуется выполнить несколько проверок.

---

## Проверить контейнеры

```bash
docker ps
```

Это покажет все работающие контейнеры.

---

## Проверить ресурсы

```bash
docker stats
```

Позволяет убедиться, что сервисы не перегружают сервер.

---

## Проверить сети

```bash
docker network ls
```

Если сервисы не взаимодействуют — возможно проблема в сети.

---

# Типичный production workflow

Чаще всего используется следующий порядок действий:

```bash
cd /opt/flamy_projects/site1

git pull
docker compose pull
docker compose up -d --build

docker compose ps
docker compose logs --tail=50
```

Этот процесс:

1. обновляет код
2. обновляет образы
3. пересобирает контейнеры
4. проверяет состояние сервисов

---

# Частые ошибки при деплое

## Пропуск шага pull

Если не выполнить `docker compose pull`, контейнеры могут запускаться со старыми образами.

---

## Запуск команд не из директории проекта

Docker Compose работает с файлом `docker-compose.yml`, поэтому важно находиться в нужной папке.

---

## Игнорирование логов

После деплоя всегда нужно проверять логи.

---

## Использование latest в production

Лучше указывать фиксированные версии образов:

```yaml
nginx:1.25
```

Это делает деплой более предсказуемым.

---

# Краткая памятка

```bash
cd /opt/flamy_projects/project_name

git pull

docker compose pull
docker compose up -d --build

docker compose ps
docker compose logs --tail=50

docker compose restart <service>
docker compose down && docker compose up -d
```

---

# Итог

Правильный workflow обновления Docker-проектов позволяет:

* безопасно обновлять сервисы
* быстро диагностировать проблемы
* минимизировать время простоя

Использование чёткой процедуры деплоя помогает поддерживать стабильную работу production-систем и упрощает администрирование Docker-инфраструктуры.