Photo✾Folder


Проект позволяет отображать папки с фотографиями в более читабельном виде чем просто папки Вашего проводника. Помимо этого имеется возможность навигации по папкам и динамического создания миниатюр для фотографий в папках. Также поддержана увеличение фотографии с возможностью ее скачать. Интерфейс выполнен в очень простом для понимания вида, что облегчает работу с проектом

Миниатюры изображений создаются в соответствующих каталогах .tumbs, имена файлов миниатюр полностью соответствуют именам самих полноразмерных фотографий. Для создания миниатюр необходимо внизу страницы нажать на соответствующую кнопку. Следует заметить, что кнопка появляется лишь в том случае, когда системе не удалось найти хотя бы одной фотографии в папке

Предусмотрена возможность описывать каждую папку и задавать заголовки для фотографий. Это делается путём размещения специально-отформатированного файла index.json или index.yml в соответствующей папке фотографий. Более подробно о формате этих файлов см. ниже

Настройка сервера

Проект можно запустить в различных режимах - в режиме CGI, Prefork, Daemon, FastCGI и PSGI. На сегодняшний день написаны примеры для CGI и Prefork режимов. В ближайшее время будут выложены примеры для оставшихся режимов. Для Prefork и Daemon режимов желательно использовать TLS, или же использовать HTTP но за Proxy сервером с поддержкой TLS. В примерах указывать настройки для TLS мы не будем, так как это отдельная задача, но вы всегда сможете справиться с этой задачей поизучав соответствующие материалы в сети. Все примеры описаные здесь будут основываться на факте, что внешнее проксирование обеспечивает Proxy сервер с уже настроенным TLS окружением и заботится о TLS нет необходимости

CGI: Apache 2 (as virtual host)

Apache 2 configuration

<VirtualHost *:80>
    ServerName myphotos.localhost
    DocumentRoot /var/www/myphotos

    ScriptAlias /photofolder /var/www/myphotos/photofolder.cgi
    <Directory /var/www/myphotos>
        Options +Indexes +FollowSymLinks +ExecCGI
        DirectoryIndex /photofolder
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

photofolder.cgi

#!/usr/bin/perl -w

use PhotoFolder;
use Mojo::Server::CGI;

my $app = PhotoFolder->new(
      documentroot => $ENV{DOCUMENT_ROOT},
      uriprefix => "/",
   );

my $cgi = Mojo::Server::CGI->new( app => $app );

$cgi->run;

CGI: Apache 2 (as location)

Apache 2 configuration

Alias /myphotos /var/www/myphotos
ScriptAlias /photofolder /var/www/myphotos/photofolder.cgi
<Directory /var/www/myphotos>
    SetEnv PHOTOFOLDER_ROOT /var/www/myphotos
    SetEnv PHOTOFOLDER_BASE /myphotos
    Options +Indexes +FollowSymLinks +ExecCGI
    DirectoryIndex /photofolder
    AllowOverride All
    Require all granted
</Directory>

photofolder.cgi

#!/usr/bin/perl -w

use PhotoFolder;
use Mojo::Server::CGI;

my $app = PhotoFolder->new(
      documentroot => $ENV{PHOTOFOLDER_ROOT},
      uriprefix => $ENV{PHOTOFOLDER_BASE},
   );

my $cgi = Mojo::Server::CGI->new( app => $app );

$cgi->run;

CGI: Apache 2 (несколько папок - один обработчик)

Перед работой необходимо слинковать photofolder.cgi в папку назначения (PHOTOFOLDER_ROOT), например:

ln -s /usr/local/bin/photofolder.cgi /var/www/foo/photofolder.cgi
ln -s /usr/local/bin/photofolder.cgi /var/www/bar/photofolder.cgi

Apache 2 configuration

Alias /foo /var/www/foo
Alias /bar /var/www/bar

<Directory /var/www/foo>
    SetEnv PHOTOFOLDER_ROOT /var/www/foo
    SetEnv PHOTOFOLDER_BASE /foo
    Options Indexes FollowSymLinks ExecCGI
    DirectoryIndex photofolder.cgi
    AllowOverride All
    Require all granted
</Directory>
<Directory /var/www/bar>
    SetEnv PHOTOFOLDER_ROOT /var/www/bar
    SetEnv PHOTOFOLDER_BASE /bar
    Options Indexes FollowSymLinks ExecCGI
    DirectoryIndex photofolder.cgi
    AllowOverride All
    Require all granted
</Directory>

photofolder.cgi

#!/usr/bin/perl -w

use PhotoFolder;
use Mojo::Server::CGI;

my $app = PhotoFolder->new(
      documentroot => $ENV{PHOTOFOLDER_ROOT},
      uriprefix => $ENV{PHOTOFOLDER_BASE},
   );

my $cgi = Mojo::Server::CGI->new( app => $app );

$cgi->run;

Prefork

Это более "продвинутый" способ запустить проект, результатом его выполнения является самостоятельный демон, который слушает TCP порт и отвечает на запросы как полноценный WEB сервер. Все вопросы связанные с настройкой демона можно разрешить на сайте проекта Mojo::Server::Prefork. Приведенный примиер демонстрирует простоту работы с Prefork режимом, но полноценный скрипт располагается в системных каталогах под именем photofolder.pl

#!/usr/bin/perl -w

use PhotoFolder;
use Mojo::Server::Prefork;

use constant {
   PID_FILE       => "/tmp/photofolder.pid",
   MAX_CLIENTS    => 100, # See Mojo::Server::Prefork
   MAX_REQUESTS   => 100, # See Mojo::Server::Prefork
   ACCEPTS        => 0, # See Mojo::Server::Prefork
   SPARE          => 2, # See Mojo::Server::Prefork
   WORKERS        => 4, # See Mojo::Server::Prefork
   LISTEN         => ['http://*:8082'], # See Mojo::Server::Prefork
   DOCUMENTROOT   => "/var/www/myphotos", # Photo location
};

my $app = PhotoFolder->new(
      documentroot   => DOCUMENTROOT,
   );
$ENV{MOJO_MODE} ||= 'production';

my $prefork = Mojo::Server::Prefork->new( app => $app );
   $prefork->pid_file(PID_FILE);
   $prefork->max_clients(MAX_CLIENTS);
   $prefork->max_requests(MAX_REQUESTS);
   $prefork->accepts(ACCEPTS);
   $prefork->spare(SPARE);
   $prefork->workers(WORKERS);
   $prefork->listen(LISTEN);
my $pid = $prefork->check_pid();
die "Already running $pid" if $pid;

# Daemonize
$prefork->daemonize();

print "Running\n";
$prefork->run;

Следует отметить, что данный скрипт - самостоятельная программа. Можно написать systemd service скрипт (пример появится в ближайшее время) который сможет обеспечить LSB обёрткой скрипт и запускать его с помощью стандартных системных команд вида system photofolder start

Создание фотоальбома

Создать фотоальбом очень просто! Создайте папку с фотографиями и скопируйте ваши фотографии с вложенными папками в целевую папку, далее обновите страницу проекта в браузере. После этого нажмите на кнопку создания миниатюр, если система предложит это сделать. Всё, фотоальбом создан! Для описания папок и фотографи фотоальбома используйте индексные файлы

Создание индексов

Для более полного описания папок следует использовать один из индексных файлов - index.json или index.yml. Для этого создайте выбранный файл в каталоге с фотографиями и отредактируйте его в кодировке utf-8. Следует также заметить, что если создан файл index.json, то файл index.yml бедет проигнорирован, так что создавать сразу два файла не имеет никакого смысла, определитесь с форматом и пользуйтесь только им. Мы рекомендуем формат YAML, он содержит меньше символов разметки

index.json

{
  "title": "Заголовок папки, титул",
  "description": "Полное описание папки, кавычки нужны для наглядности. Текст может быть длинным",
  "date": "Thu 09 Dec 2021 18:15:02 MSK",
  "location": "Страна, Город, место, локация, всё что угодно описывающее место, хоть координаты",
  "manifest": {
    "file1.jpg": "Заголовок первого файла",
    "file1.jpg": "Заголовок второго файла",
    "subdir1": "Заголовок поддиректории"
  }
}

index.yml

---
title: Заголовок папки, титул
description: "Полное описание папки, кавычки нужны для наглядности. Текст может быть длинным"
date: Thu 09 Dec 2021 18:15:02 MSK - это для примера, формат даты любой, хоть просто ткущий год
location: Страна, Город, место, локация, всё что угодно описывающее место, хоть координаты
manifest:
  file1.jpg: Заголовок первого файла
  file2.jpg: Заголовок второго файла
  subdir1: Заголовок поддиректории