Files
SERVER-API/README.md
2025-10-28 01:39:22 +03:00

108 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Nginx + PHP-FPM (API v1/v2) + PostgreSQL + Memcached
Проект разворачивает два API (v1 и v2) на отдельных контейнерах PHP-FPM, фронтирует их через Nginx и подключает PostgreSQL и Memcached. Конфигурация рассчитана на локальную разработку и может быть адаптирована для staging/production.
## Возможности
- Два независимых API: `/api/v1/` и `/api/v2/`.
- Nginx проксирует запросы к соответствующим пулам PHP-FPM.
- Проверки соединений с PostgreSQL и Memcached в каждом API.
- Разделённые логи для Nginx и каждого PHP-FPM.
- Переменные окружения вынесены в `.env` файлы (безопаснее, чем хранить пароли в compose).
## Требования
- Установленный Docker Desktop (Windows/macOS) или Docker Engine (Linux).
- Docker Compose v2 (входит в Docker Desktop).
## Быстрый запуск (локально)
1. Открой папку проекта: `c:\docker\nginxphp\server\project`.
2. Убедись, что созданы и заполнены файлы:
- `.env.v1` — переменные для API v1
- `.env.v2` — переменные для API v2
- `.env.db` — переменные для PostgreSQL
Пример значений уже положен в репозиторий (локальные пароли можно заменить).
3. Запусти:
```powershell
docker compose up -d --build
```
4. Проверь эндпоинты:
- `http://localhost/api/v1/`
- `http://localhost/api/v2/`
Оба вернут JSON со статусами PostgreSQL и Memcached, версией API и PHP.
## Структура
- `docker-compose.yml` — оркестрация контейнеров.
- `nginx/nginx.conf` — маршрутизация `/api/v1` и `/api/v2` к нужным upstream (PHP-FPM v1/v2).
- `api-v1/` — Dockerfile, конфиги PHP-FPM (`config`), код (`index.php`).
- `api-v2/` — Dockerfile, конфиги PHP-FPM (`config`), код (`index.php`).
- `database/init/01_init.sql` — создаёт БД `api_v1` и `api_v2`, выдаёт права `api_user`.
- `logs/nginx`, `logs/php-v1`, `logs/php-v2` — каталоги для логов.
- `.env.v1`, `.env.v2`, `.env.db` — переменные окружения для сервисов.
- `.gitignore` — исключает `.env*` и `logs/` из VCS.
## Развёртывание: подробная инструкция
### Локальная среда
- Заполни `.env.v1`, `.env.v2`, `.env.db` корректными значениями (БД, пользователи, пароли).
- Запусти: `docker compose up -d --build`.
- Просмотри логи при необходимости:
- `docker compose logs -f nginx`
- `docker compose logs -f php-fpm-v1`
- `docker compose logs -f php-fpm-v2`
- `docker compose logs -f postgres`
- Остановить и очистить:
```powershell
docker compose down -v
```
Команда удалит контейнеры и именованный том `postgres_data`.
### Staging/Production рекомендации
- Секреты: не хранить пароли в `.env` на диске. Используй Docker Swarm/Kubernetes secrets, HashiCorp Vault или инъекцию env через CI/CD.
- SSL/HTTP2: поставь обратный прокси с TLS (например, Nginx/Traefik) и включи HSTS/CSP/безопасные заголовки.
- Бэкапы: настроить регулярные бэкапы `postgres_data`.
- Доступы БД: разнести пользователей по API (отдельные `DB_USER`/пароли и права на свои базы).
- Обновления: регулярно обновлять базовые образы и пакеты в Dockerfile.
- Мониторинг: добавить healthchecks, метрики и алёрты.
## Что было исправлено и почему
- Nginx: убраны вложенные `location` и добавлены независимые блоки для `/api/v1` и `/api/v2`.
- `SCRIPT_FILENAME`: передаётся абсолютный путь `/var/www/html/index.php` (код не монтируется в Nginx).
- PHP-FPM: `clear_env = no`, чтобы PHP видел переменные из `.env`/compose.
- Dockerfile: удалены лишние пакеты; оставлены PHP 8.2 и нужные расширения. Исправлено отсутствие `php8.2-json` (встроено в ядро).
- Права: вместо `777` используются более строгие `755/775` и корректный владелец `www`.
- БД: добавлен скрипт инициализации, создающий `api_v1` и `api_v2`.
## Безопасность
- Секреты вынесены в `.env` файлы и исключены из VCS (`.gitignore`).
- Для продакшна — использовать secrets-менеджер вместо `.env`.
- Выключен `display_errors` в FPM; включать только на dev.
- Разграничение прав БД и ротация паролей.
## Диагностика проблем
- Ошибка FPM "failed to open error_log": убедись, что логи монтируются в `/var/log/php-fpm` (уже настроено в compose).
- Ошибка пакета `php8.2-json`: не устанавливается отдельно (часть ядра). Удалено из Dockerfile.
- Полный сброс окружения:
```powershell
docker compose down -v
docker compose up -d --build
```
## 📚 Документация
Подробная документация находится в каталоге `docs/`:
- Навигация и быстрый старт: `docs/README.md`
- Обзор и требования: `docs/overview.md`
- Запуск и деплой: `docs/deployment.md`
- Мониторинг (метрики и алёрты): `docs/monitoring.md`
- Примеры `.env`: `docs/env-examples.md`
- Публикация в Gitea: `docs/gitea.md`
- Диагностика: `docs/troubleshooting.md`
## 📚 Раздел: Secrets Management
Секреты вынесены из `docker-compose.yml` в отдельные env-файлы, игнорируемые системой контроля версий.
- Файлы: `.env.v1`, `.env.v2`, `.env.db` (локальные секреты).
- Пример содержимого и рекомендации см. в `docs/env-examples.md`.
### Почему так безопаснее
- Нет паролей в `docker-compose.yml` — меньше риск утечки в VCS.
- Разделение по сервисам — проще ротация и изоляция.
- В продакшене рекомендуем использовать Swarm/K8s Secrets, Vault, SSM Parameter Store.