182 lines
8.4 KiB
Markdown
182 lines
8.4 KiB
Markdown
# Галерея фото (PHP + MySQL)
|
||
|
||
Актуальная версия проекта — это MySQL-контур с двумя основными точками входа:
|
||
|
||
- `index.php` — публичная витрина (разделы, тематики, карточки фото, комментарии),
|
||
- `admin.php?token=...` — закрытая админка (управление разделами/тематиками/фото/пользователями/комментариями/настройками).
|
||
|
||
## Что умеет проект
|
||
|
||
- Иерархия каталога: разделы + тематики (2 уровня).
|
||
- Для фото поддерживаются версии `before` и `after`.
|
||
- Версия `after` на публичной части отдается с watermark (текст, яркость и угол настраиваются в админке).
|
||
- Комментарии доступны только по персональной viewer-ссылке.
|
||
- Для карточек каталога используются превью из `thumbs/`.
|
||
- Превью создаются/обновляются автоматически при загрузке, замене и повороте изображения.
|
||
|
||
## Инструкция для пользователей
|
||
|
||
### Если у вас нет специальной ссылки
|
||
|
||
- Откройте главную страницу галереи и выберите раздел или тематику в левом меню.
|
||
- Для просмотра фотографии нажмите на карточку в каталоге.
|
||
- Переключение по фото: стрелки `←` и `→` на клавиатуре (или кнопки на экране).
|
||
- Навигация по разделам/тематикам: `Shift + ↑/↓` или `Ctrl + ↑/↓`.
|
||
- Комментарии в этом режиме недоступны: блок комментариев открыт только для пользователей с персональной ссылкой.
|
||
|
||
### Если у вас есть специальная viewer-ссылка
|
||
|
||
- Откройте галерею только по персональной ссылке вида `/?viewer=...`.
|
||
- В режиме viewer доступны все обычные функции просмотра и дополнительно форма комментария.
|
||
- Напишите комментарий и нажмите «Отправить» (или `Shift + Enter`).
|
||
- Отправка происходит без перезагрузки страницы; после успешной отправки появится сообщение «Ваш комментарий отправлен.».
|
||
- Не передавайте свою viewer-ссылку другим: она дает право оставлять комментарии от вашего имени.
|
||
|
||
## Структура
|
||
|
||
```text
|
||
photo.andr33v.ru/
|
||
├─ index.php # публичная витрина
|
||
├─ admin.php # админка по токену
|
||
├─ style.css # базовые стили
|
||
├─ favicon.svg
|
||
├─ config.php.example # шаблон конфига БД и деплоя
|
||
├─ secrets.php.example # шаблон секретов админки
|
||
├─ lib/
|
||
│ ├─ db.php # PDO + загрузка config.php
|
||
│ ├─ db_gallery.php # доступ к данным галереи
|
||
│ ├─ thumbs.php # генерация/чтение/удаление превью
|
||
│ ├─ admin_http.php # JSON-ответы админки
|
||
│ ├─ admin_deploy.php # проверка обновлений и запуск деплоя
|
||
│ ├─ admin_get_actions.php # GET-экшены админки
|
||
│ ├─ admin_post_actions.php # POST-экшены админки
|
||
│ └─ admin_helpers.php # helper-функции админки
|
||
├─ migrations/
|
||
│ ├─ 001_init.sql
|
||
│ ├─ 002_site_settings.sql
|
||
│ ├─ 003_comment_users_plain_token.sql
|
||
│ └─ 004_topics.sql
|
||
├─ scripts/
|
||
│ ├─ migrate.php # запуск миграций
|
||
│ ├─ generate_thumbs.php # backfill превью
|
||
│ └─ deploy.sh # deploy на shared hosting
|
||
├─ photos/ # оригиналы (runtime)
|
||
├─ thumbs/ # превью (runtime)
|
||
└─ data/ # runtime (логи/служебные файлы)
|
||
```
|
||
|
||
## Требования
|
||
|
||
- PHP 8.2+
|
||
- MySQL 8+ (или совместимая MariaDB)
|
||
- PHP-расширения:
|
||
- `pdo_mysql` (обязательно),
|
||
- `gd` или `imagick` (для watermark/превью).
|
||
|
||
## Быстрый старт
|
||
|
||
1. Создай `config.php`:
|
||
|
||
```bash
|
||
cp config.php.example config.php
|
||
```
|
||
|
||
2. Заполни доступы к БД в `config.php`.
|
||
|
||
Для деплоя из админки в `config.php` можно задать:
|
||
|
||
- `deploy.remote_name` (обычно `origin`),
|
||
- `deploy.remote_url` (по умолчанию `git@github.com:wrkandreev/reframe.git`),
|
||
- `deploy.branch` (`main` или `dev`).
|
||
|
||
3. Создай `secrets.php`:
|
||
|
||
```bash
|
||
cp secrets.php.example secrets.php
|
||
```
|
||
|
||
4. Заполни минимум `admin_token` в `secrets.php`.
|
||
|
||
5. Прогон миграций:
|
||
|
||
```bash
|
||
php scripts/migrate.php
|
||
```
|
||
|
||
6. Локальный запуск:
|
||
|
||
```bash
|
||
php -S 127.0.0.1:8080
|
||
```
|
||
|
||
7. Открой:
|
||
|
||
- `http://127.0.0.1:8080` — публичная часть,
|
||
- `http://127.0.0.1:8080/admin.php?token=<SECRET>` — админка (токен из `secrets.php`).
|
||
|
||
## Настройка админки
|
||
|
||
Админка использует секреты из `secrets.php`.
|
||
|
||
Создай файл:
|
||
|
||
```bash
|
||
cp secrets.php.example secrets.php
|
||
```
|
||
|
||
Минимально заполни:
|
||
|
||
- `admin_token` — длинный случайный секрет.
|
||
|
||
Опционально можно ограничить доступ:
|
||
|
||
- `basic_auth_user` / `basic_auth_pass` — HTTP Basic слой поверх админки,
|
||
- `allowed_admin_ips` — белый список IP (строгое совпадение строк).
|
||
|
||
В админке доступны разделы:
|
||
|
||
- Разделы,
|
||
- Тематики,
|
||
- Фото,
|
||
- Пользователи,
|
||
- Комментарии,
|
||
- Настройки (welcome + watermark параметры).
|
||
|
||
## Превью и watermark
|
||
|
||
- Публичный каталог карточек грузит превью через `?action=thumb&file_id=...`.
|
||
- Превью создаются автоматически в `thumbs/`:
|
||
- при загрузке файлов,
|
||
- при замене файлов,
|
||
- после поворота.
|
||
- Для старых данных можно догенерировать превью:
|
||
|
||
```bash
|
||
php scripts/generate_thumbs.php
|
||
```
|
||
|
||
- Версия `after` в публичке отдается с watermark (`?action=image&file_id=...`).
|
||
|
||
## Деплой
|
||
|
||
Деплой запускается из админки (вкладка `Настройки`):
|
||
|
||
- кнопка `Проверить обновления` делает `git fetch` и сравнивает `HEAD` с `<remote>/<branch>`,
|
||
- если локальная ветка отстает и не расходится (`behind > 0`, `ahead = 0`) — показывается кнопка `Обновить проект`.
|
||
|
||
Скрипт `scripts/deploy.sh`:
|
||
|
||
1. настраивает remote из `REMOTE_NAME`/`REMOTE_URL` (если передан `REMOTE_URL`),
|
||
2. делает `git fetch <remote> <branch> --prune`,
|
||
3. переключает код на `<remote>/<branch>` через `git reset --hard`,
|
||
4. запускает миграции `php scripts/migrate.php`,
|
||
5. сохраняет runtime-папки (`photos`, `thumbs`, `data`).
|
||
|
||
Важно: деплой-скрипт перетирает рабочие изменения в репозитории на сервере.
|
||
|
||
## Примечания
|
||
|
||
- Проект принудительно редиректит на HTTPS и non-www через `.htaccess`.
|
||
- Для production рекомендуется включить IP whitelist и/или Basic Auth в `secrets.php`.
|
||
- Если `config.php` отсутствует, приложение корректно падает с ошибкой подключения к БД.
|