| data | ||
| photos | ||
| scripts | ||
| thumbs | ||
| .gitignore | ||
| admin.php | ||
| app.js | ||
| deploy-config.php.example | ||
| deploy.php | ||
| index.php | ||
| README.md | ||
| style.css | ||
Галерея фотографий (PHP)
Локальный проект галереи, который:
- читает категории и фото из
photos/(туда можно загружать по FTP), - при каждом открытии страницы проверяет, появились ли новые/обновлённые фото,
- создаёт и обновляет превью в
thumbs/, - показывает категории и фото в веб-интерфейсе,
- открывает большую фотографию в лайтбоксе.
Структура
photo-gallery/
├─ index.php # основной скрипт: индексация + HTML
├─ style.css # стили (material-like, строгий)
├─ app.js # лайтбокс
├─ deploy.php # webhook-триггер деплоя
├─ admin.php # закрытая админка (папки + загрузка фото)
├─ deploy-config.php.example # пример конфига webhook
├─ photos/ # исходные фото по категориям (папкам)
├─ thumbs/ # автогенерируемые превью
└─ data/
└─ last_indexed.txt # timestamp последней индексации
Как работает индексация
- Скрипт читает
data/last_indexed.txt. - Сканирует
photos/<категория>/. - Для каждого изображения (
jpg/jpeg/png/webp/gif):- если файл новее
last_indexed, - или превью не существует,
- или превью старее оригинала,
тогда создаётся/обновляется превью (
.jpg) вthumbs/<категория>/.
- если файл новее
- Записывает новый timestamp в
last_indexed.txt.
Индексация выполняется на каждом обращении к index.php.
Требования
- PHP 8.2+ (8.3 тоже ок)
- Расширение GD или Imagick
- если есть Imagick — будет использоваться он,
- иначе используется GD.
Локальный запуск
Из папки photo-gallery:
php -S 127.0.0.1:8080
Открыть в браузере:
http://127.0.0.1:8080
Загрузка фото
Через FTP кладите файлы в:
photos/Свадьба/001.jpgphotos/Портреты/img_10.png- и т.д.
Папка верхнего уровня = категория.
Деплой (Timeweb shared hosting)
В проекте есть скрипт:
scripts/deploy.sh
Он:
- делает
git fetch, - жёстко переключает код на
origin/<branch>, - сохраняет runtime-папки (
photos,thumbs,data), - создаёт
data/last_indexed.txtпри первом запуске.
Запуск на хостинге:
cd ~/www/photo-gallery
bash scripts/deploy.sh
По умолчанию ветка main. Для другой ветки:
BRANCH=master bash scripts/deploy.sh
Админка загрузки (по токену)
Админка использует тот же token, что и deploy.php, из файла deploy-config.php.
Ссылка входа:
https://<домен>/admin.php?token=<твой_секрет>
В админке можно:
- создавать папки-категории,
- загружать фото в выбранную папку.
Ограничения загрузки:
- только изображения: JPG/PNG/WEBP/GIF,
- максимум 3 МБ на файл,
- MIME-тип и расширение проверяются на сервере.
Удалённый запуск деплоя по ссылке (webhook)
- На хостинге создай конфиг из примера:
cp deploy-config.php.example deploy-config.php
- Заполни в
deploy-config.phpминимум:
token(длинный секрет)- при желании
allowed_ips - при желании
basic_auth_user/basic_auth_pass
- Запуск деплоя:
https://<домен>/deploy.php?token=<твой_секрет>
Рекомендация: включить IP whitelist и Basic Auth.
Примечания
- Превью генерируются в формате JPEG с качеством ~82.
- При первом заходе на большую папку возможно небольшое ожидание (генерация превью).
- Для production обычно лучше вынести индексацию в cron/очередь, но для текущей задачи это intentionally on-request.