Initial commit
This commit is contained in:
108
README.md
Normal file
108
README.md
Normal 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.
|
||||
Reference in New Issue
Block a user