Прежняя git-история утрачена при переносе проекта на машину владельца (снапшот без .git). Хэши коммитов в docs/reports/* относятся к утраченной истории. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
6.3 KiB
6.3 KiB
Деплой на shared-хостинг (чек-лист, V.2)
Дата: 2026-08-06. Выполняет ВЛАДЕЛЕЦ руками (V.1: агент прод не трогает). Проходить целиком, частичные варианты запрещены (gotcha-partial-build).
Артефакты деплоя (ВСЕ, их ТРИ)
- Статика сайта:
apps/web/dist/→ web root хостинга (например,public_html/). Сборка:npm ci && npm run buildвapps/web(Node 20+, локально) либо взять готовый dist из превью-версии. - API: содержимое
server/раскладывается по web root ЧАСТЯМИ (не целиком!):server/api/→public_html/api/,server/lib/→public_html/lib/. Эндпоинты оказываются доступны как/api/*.php. Пути жёсткие: PHP-файлы ищут lib как../lib/(smoke-тест локально поднимает docroot = server/, поэтому на проде web root = dist + содержимое server/). - Конфиг + БД: скопировать
server/config.example.php→public_html/config.php(именно в КОРЕНЬ web root — db.php ищет его как__DIR__.'/../config.php'от lib/), выставитьdb_path— путь ВНЕ web root (например,/home/<user>/go-learn.sqlite). Сам файл БД создастся сам при первом обращении (права на каталог — записываемые для PHP). Также выставитьbase_url(полный URL сайта — идёт в письма восстановления пароля) иmail_from(отправитель писем).
Итоговая структура на хостинге
public_html/
├── index.html, learn.html, play.html, … ← из dist (артефакт 1)
├── _astro/, assets/ ← из dist
├── .htaccess ← из dist + блок запрета ниже
├── api/ ← server/api/ (артефакт 2)
│ ├── health.php, register.php, login.php, logout.php, me.php,
│ ├── progress.php, captcha.php
│ └── password-reset/ (request.php, confirm.php)
├── lib/ ← server/lib/
│ └── auth.php, db.php, http.php, ratelimit.php
└── config.php ← созданный вручную (артефакт 3)
В корневой .htaccess (из dist) дописать блок из server/.htaccess:
<IfModule mod_authz_core.c>
<FilesMatch "(^config\.php$|\.sqlite(-wal|-shm)?$)">
Require all denied
</FilesMatch>
</IfModule>
Порядок (каждый шаг — отдельное действие)
- Проверки хостинга: PHP ≥ 8.0, модули pdo_sqlite, sqlite3
(phpinfo в панели или
php -v/php -mпо SSH, если есть). Нет pdo_sqlite — стоп, вопрос хостеру. - Залить dist (артефакт 1).
- Залить server/ (артефакт 2) и создать config.php (артефакт 3).
- Smoke: открыть
/api/health.php→ ожидается{"status":"ok"}. Не 200/не JSON — смотреть логи PHP в панели, НЕ править код на глазах. - Smoke вручную: регистрация на странице /register.html (с капчей) → вход → «Синхронизировать прогресс» → статус «Прогресс отправлен». 4.1. Проверка почты (этап 8.1): «Забыли пароль?» на /account.html → письмо со ссылкой приходит и ссылка ведёт на /password-reset.html?token=…. Не приходит — смотреть настройки SPF/DKIM в панели хостинга; до решения восстановление считать нерабочим (риск в PROJECT_STATE).
- Проверить, что БД-файл появился по пути из config.php и НЕ доступен по HTTP (попытка открыть его URL → 403/404).
- HTTPS — включать ТОЛЬКО панелью хостинга (в .htaccess редиректа нет намеренно, gotcha-https-redirect-proxy). После включения — повторить шаги 3–4 по HTTPS.
Канонические пути (V.5) — заполнить при первом деплое
- Web root:
____________ - URL сайта:
____________ - Путь БД (вне web root):
____________ - Дата первого деплоя:
____________
Откат
Откат = перезаливка предыдущего dist и (при изменении server/) предыдущего server/. Схема БД этапа 8 аддитивна (init-only), обратной миграции нет; перед любым изменением схемы в будущем — дамп БД ДО деплоя (V.3).
Бэкап и restore (V.7, минимум)
- Бэкап = копия файла SQLite (из панели файлового менеджера/SSH) + config.php. Периодичность — после заметного роста числа пользователей (ручная, SoT расписания — этот файл).
- Restore: остановить запись (выключить сайт в панели) → вернуть файл БД
на путь из config.php → smoke шаг 3–4. Проверка restore выполняется на
первом же бэкапе: распаковать копию под другим именем и открыть
sqlite3 <файл> "SELECT count(*) FROM users;"(или через панель).
Чего НЕ делать
- Не класть config.php и БД в web root.
- Не включать HTTPS-редирект в .htaccess (только панель).
- Не править PHP/БД на проде напрямую: правка → локальный smoke.sh → перезаливка.