# server/ — PHP API личного кабинета (этап 8) Без фреймворка, синтаксис ≥ PHP 8.0. Контракт: `docs/INTERFACES.md`, раздел «Личный кабинет и синхронизация прогресса (этап 8)», ADR-0004. ## Структура - `api/` — эндпоинты: `register`, `login`, `logout`, `me`, `progress`, `health` (на хостинге — `/api/*.php`). - `lib/` — общий код: `db.php` (PDO + init-миграция), `http.php` (заголовки/JSON/лимит тела), `auth.php` (сессии), `ratelimit.php`. - `config.example.php` — пример конфига. Скопировать в `config.php` (не коммитится, см. корневой `.gitignore`), указать путь к БД **вне web root**. Env `GOLEARN_DB` имеет приоритет (нужно smoke-тесту). - `tests/smoke.sh` — смоук-тест по контракту. ## Локальный запуск smoke-теста Нужны PHP ≥ 8.0 с pdo_sqlite и curl: ```sh PHP=/path/to/php sh server/tests/smoke.sh ``` (по умолчанию используется `/tmp/php-run`; можно просто `sh server/tests/smoke.sh`, если `/tmp/php-run` существует, или задать `PHP=$(command -v php)`). Скрипт поднимает `php -S 127.0.0.1:8099 -t server/` с временной БД в /tmp (через `GOLEARN_DB`), гонит curl-сценарий из контракта (register/login/me/progress/413/429/logout) и удаляет временные файлы. Код выхода ненулевой при любом фейле. ## Деплой (кратко) `server/` → `/api` на хостинге, `config.php` — рядом, файл БД — вне web root, права на запись в каталог БД у PHP. Smoke на хостинге = зелёный `GET /api/health.php`. Подробности — `docs/deploy.md` (V.2).