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 @@ - Demo Web + Compose — заметки -

Сервис web

-

Эта страница попала в контейнер при сборке образа (COPY в Dockerfile).

-

API стека: /api/health, список заметок: /api/notes.

+
+

Мини-дашборд

+

Статика из контейнера web, данные через proxyapi → PostgreSQL.

+ +
+
+
Прокси
+
+
nginx → API
+
+
+
Web
+
+
статика
+
+
+
API
+
+
Flask
+
+
+
База
+
+
Postgres
+
+
+ +
+ +
+
+

Заметки

+ +
+ + + +
+ +
+

Файлы в томе API

+

Маленький файл уйдёт в именованный том api_uploads.

+
+ + +
+
+
+
+ +