← [Раздел](README.md) · [Главная](../README.md)

# Lab 01 — C4-диаграмма ShopLite

## Цель

Построить **C4 Level 1 (Context)** и **Level 2 (Container)** для учебного магазина ShopLite, оформить диаграммы в Mermaid в репозитории и связать их с кратким текстовым описанием.

## Предварительно

- [README практикума](README.md)
- Разделы 01–03 курса (C4, границы системы)

## Время

~90 минут

---

## Шаг 1 — Создать структуру

```bash
mkdir -p cloud-arch-labs/docs/c4
cd cloud-arch-labs
git init
```

Создайте `docs/c4/README.md` с оглавлением.

---

## Шаг 2 — Описать акторов и внешние системы

В `docs/c4/context-notes.md` таблица:

| Элемент | Тип | Описание |
|---------|-----|----------|
| Покупатель | Person | Ищет товар, оформляет заказ |
| Администратор | Person | Управляет каталогом |
| ShopLite | Software System | Наш продукт |
| pay.example.com | External | Платёжный провайдер (mock) |
| Email provider | External | Транзакционные письма |

---

## Шаг 3 — Context diagram (Mermaid)

Файл `docs/c4/01-context.mmd`:

```mermaid
C4Context
  title ShopLite — System Context
  Person(customer, "Покупатель")
  Person(admin, "Администратор")
  System(shop, "ShopLite", "Интернет-магазин")
  System_Ext(pay, "pay.example.com", "Платежи")
  System_Ext(email, "email.example.com", "Почта")
  Rel(customer, shop, "Покупает")
  Rel(admin, shop, "Управляет каталогом")
  Rel(shop, pay, "Списание оплаты", "HTTPS")
  Rel(shop, email, "Уведомления", "HTTPS")
```

Если viewer не рендерит C4 — дублируйте блоком `flowchart` в `01-context.md`.

---

## Шаг 4 — Выделить контейнеры

Минимум **5 контейнеров**:

| Контейнер | Технология | Ответственность |
|-----------|------------|-----------------|
| Web App | SPA / SSR | UI покупателя |
| API Gateway | nginx / Kong | Маршрутизация, TLS |
| Order API | Go/Node | Заказы |
| Catalog API | Go/Node | Товары |
| PostgreSQL | RDS-аналог | Данные |
| Redis | ElastiCache-аналог | Сессии, корзина |

---

## Шаг 5 — Container diagram

`docs/c4/02-containers.mmd` — покажите:

- Web → Gateway → API;
- Order API → PostgreSQL;
- Catalog API → PostgreSQL;
- Order API → pay.example.com;
- Gateway → Redis (сессии).

Подпишите **протоколы** (HTTPS, SQL, Redis protocol).

---

## Шаг 6 — Текстовое описание (ADR-lite)

`docs/c4/03-decisions.md` — три решения по форме:

```markdown
## DR-001: Отдельный Catalog API
Контекст: каталог меняется реже заказов.
Решение: два API, общая БД на первом этапе (осознанный компромисс).
Последствия: нужен contract test; позже — split БД.
```

---

## Шаг 7 — Peer review (самостоятельно)

Чеклист:

- [ ] Каждый контейнер имеет одну зону ответственности
- [ ] Нет «БД в браузере»
- [ ] Внешние системы не смешаны с внутренними
- [ ] Есть легенда или подписи на связях

Исправьте диаграмму по результатам.

---

## Шаг 8 — Коммит

```bash
git add docs/c4
git commit -m "lab01: C4 context and containers for ShopLite"
```

Запись в `LAB-JOURNAL.md`: что было сложнее — context или containers?

---

## Ожидаемый результат

Папка `docs/c4/` с Mermaid, заметками и ADR-lite; диаграмма читается без устных пояснений.

---

## Самопроверка

1. Чем Context отличается от Container diagram?
2. Сколько контейнеров минимум в задании?
3. Зачем фиксировать ADR-lite рядом с диаграммой?
4. Какой внешний платёжный домен используется в лабе?

---

## Дальше

→ [Lab 02 — NFR](lab-02-nfr-checklist.md)  
← [README практикума](README.md)
