Initial commit

This commit is contained in:
2025-10-28 01:39:22 +03:00
commit 8d1473935a
23 changed files with 870 additions and 0 deletions

108
README.md Normal file
View File

@@ -0,0 +1,108 @@
# 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.