# Галерея фотографий (PHP) Локальный проект галереи, который: - читает категории и фото из `photos/` (туда можно загружать по FTP), - при каждом открытии страницы проверяет, появились ли новые/обновлённые фото, - создаёт и обновляет превью в `thumbs/`, - показывает категории и фото в веб-интерфейсе, - открывает большую фотографию в лайтбоксе или в новой вкладке. ## Структура ```text photo-gallery/ ├─ index.php # основной скрипт: индексация + HTML ├─ style.css # стили (material-like, строгий) ├─ app.js # лайтбокс ├─ photos/ # исходные фото по категориям (папкам) ├─ thumbs/ # автогенерируемые превью └─ data/ └─ last_indexed.txt # timestamp последней индексации ``` ## Как работает индексация 1. Скрипт читает `data/last_indexed.txt`. 2. Сканирует `photos/<категория>/`. 3. Для каждого изображения (`jpg/jpeg/png/webp/gif`): - если файл новее `last_indexed`, - или превью не существует, - или превью старее оригинала, тогда создаётся/обновляется превью (`.jpg`) в `thumbs/<категория>/`. 4. Записывает новый timestamp в `last_indexed.txt`. Индексация выполняется **на каждом обращении к `index.php`**. ## Требования - PHP 8.2+ (8.3 тоже ок) - Расширение GD **или** Imagick - если есть Imagick — будет использоваться он, - иначе используется GD. ## Локальный запуск Из папки `photo-gallery`: ```bash php -S 127.0.0.1:8080 ``` Открыть в браузере: - `http://127.0.0.1:8080` ## Загрузка фото Через FTP кладите файлы в: - `photos/Свадьба/001.jpg` - `photos/Портреты/img_10.png` - и т.д. Папка верхнего уровня = категория. ## Деплой (Timeweb shared hosting) В проекте есть скрипт: - `scripts/deploy.sh` Он: 1. делает `git fetch`, 2. жёстко переключает код на `origin/`, 3. сохраняет runtime-папки (`photos`, `thumbs`, `data`), 4. создаёт `data/last_indexed.txt` при первом запуске. Запуск на хостинге: ```bash cd ~/www/photo-gallery bash scripts/deploy.sh ``` По умолчанию ветка `main`. Для другой ветки: ```bash BRANCH=master bash scripts/deploy.sh ``` ## Примечания - Превью генерируются в формате JPEG с качеством ~82. - При первом заходе на большую папку возможно небольшое ожидание (генерация превью). - Для production обычно лучше вынести индексацию в cron/очередь, но для текущей задачи это intentionally on-request.