diff --git a/docs/4. Docker Compose - несколько сервисов, сеть, тома.md b/docs/4. Docker Compose - несколько сервисов, сеть, тома.md
index 885cc64..2590c46 100644
--- a/docs/4. Docker Compose - несколько сервисов, сеть, тома.md
+++ b/docs/4. Docker Compose - несколько сервисов, сеть, тома.md
@@ -14,11 +14,11 @@
| Путь | Содержимое |
| ------------------------------------------- | ---------------------------------------- |
-| `examples/multi-service/docke-compose.yaml` | Описание всех сервисов, сетей, томов |
-| `examples/multi-service/.env.example` | Пример переменных окружения для Compose |
-| `examples/multi-service/web/` | Nginx + статика через `COPY` |
-| `examples/multi-service/api/` | Flask + Postgres + загрузка файлов в том |
-| `examples/multi-service/proxy/` | Входной nginx: `/` → web, `/api/` → api |
+| `docker/examples/multi-service/compose.yaml` | Описание всех сервисов, сетей, томов |
+| `docker/examples/multi-service/.env.example` | Пример переменных окружения для Compose |
+| `docker/examples/multi-service/web/` | Nginx + статика через `COPY` |
+| `docker/examples/multi-service/api/` | Flask + Postgres + загрузка файлов в том |
+| `docker/examples/multi-service/proxy/` | Входной nginx: `/` → web, `/api/` → api |
Скопируйте переменные окружения:
@@ -27,44 +27,26 @@ cd docker/examples/multi-service
cp .env.example .env
```
-
+
Запуск:
```
docker compose up -d --build
```
-**Скриншот:** вывод `docker compose up` — этапы build, Creating..., Started.
+
-
+
-**Скриншот:** `docker compose ps` — все сервисы `running` (или `healthy` где настроено).
+
-
+Все сервисы подняты
-Откройте в браузере `http://127.0.0.1:8080` (если в `.env` не меняли `HTTP_PORT`).
+Откройте в браузере адрес с портом из `.env` (по умолчанию `http://127.0.0.1:8080`). Главная страница — статика из сервиса **web**: мини-дашборд с индикаторами **прокси**, **web**, **API** и **PostgreSQL** (данные приходят с эндпоинта `/api/status` через прокси), блок **заметок** (чтение и создание через `/api/notes`) и простая загрузка файлов в том **api_uploads**. Всё работает в одной вкладке, без `curl` — гайд остаётся про Docker и Compose, а проверка стека — через интерфейс.
-**Скриншот:** главная страница демо со ссылками на API.
+**Скриншот:** открытая главная страница с зелёными статусами и списком заметок.
-
-
-Проверка API через прокси:
-
-```
-curl -s http://127.0.0.1:8080/api/health | jq .
-curl -s http://127.0.0.1:8080/api/notes | jq .
-curl -s -X POST http://127.0.0.1:8080/api/notes \
- -H 'Content-Type: application/json' \
- -d '{"body":"Первая заметка из curl"}' | jq .
-
-echo demo > /tmp/upload-demo.txt
-curl -s -F "file=@/tmp/upload-demo.txt" http://127.0.0.1:8080/api/upload | jq .
-curl -s http://127.0.0.1:8080/api/uploads | jq .
-```
-
-**Скриншот:** терминал с ответами JSON.
-
-
+
---
diff --git a/docs/assets/image_1777885724388.jpg b/docs/assets/image_1777885724388.jpg
new file mode 100644
index 0000000..821f74e
Binary files /dev/null and b/docs/assets/image_1777885724388.jpg differ
diff --git a/docs/assets/image_1777885746375.jpg b/docs/assets/image_1777885746375.jpg
new file mode 100644
index 0000000..88590da
Binary files /dev/null and b/docs/assets/image_1777885746375.jpg differ
diff --git a/docs/assets/image_1777885786226.jpg b/docs/assets/image_1777885786226.jpg
new file mode 100644
index 0000000..9db04dd
Binary files /dev/null and b/docs/assets/image_1777885786226.jpg differ
diff --git a/docs/assets/image_1777885816731.jpg b/docs/assets/image_1777885816731.jpg
new file mode 100644
index 0000000..438afa5
Binary files /dev/null and b/docs/assets/image_1777885816731.jpg differ
diff --git a/docs/assets/image_1777885916959.jpg b/docs/assets/image_1777885916959.jpg
new file mode 100644
index 0000000..1ad72c7
Binary files /dev/null and b/docs/assets/image_1777885916959.jpg differ
diff --git a/examples/multi-service/api/app.py b/examples/multi-service/api/app.py
index 2575b9b..47b7c1e 100644
--- a/examples/multi-service/api/app.py
+++ b/examples/multi-service/api/app.py
@@ -53,6 +53,29 @@ def health():
return jsonify({"status": "error", "detail": str(exc)}), 503
+@app.route("/status")
+def stack_status():
+ """Сводка для дашборда на статике: API видит БД изнутри сети Compose."""
+ db_ok = False
+ err = None
+ try:
+ with get_conn() as conn:
+ with conn.cursor() as cur:
+ cur.execute("SELECT version() AS v;")
+ row = cur.fetchone()
+ db_ok = bool(row)
+ pg_version = (row.get("v") or "")[:48] if row else ""
+ except Exception as exc: # noqa: BLE001
+ err = str(exc)
+ pg_version = ""
+ return jsonify(
+ {
+ "api": {"ok": True, "service": "api"},
+ "database": {"ok": db_ok, "detail": pg_version or None, "error": err},
+ }
+ )
+
+
def _note_row(r):
d = dict(r)
if d.get("created_at") is not None:
diff --git a/examples/multi-service/web/html/index.html b/examples/multi-service/web/html/index.html
index 87e63bc..77a0ccc 100644
--- a/examples/multi-service/web/html/index.html
+++ b/examples/multi-service/web/html/index.html
@@ -3,15 +3,332 @@
webЭта страница попала в контейнер при сборке образа (COPY в Dockerfile).
API стека: /api/health, список заметок: /api/notes.
+Статика из контейнера web, данные через proxy → api → PostgreSQL.
Маленький файл уйдёт в именованный том api_uploads.