В этой статье я опишу пошаговую инструкцию как запустить Mojolicious-приложение + DBIx::Class на виртуальном хостинге, не имея root-прав. Нам придется скачивать нужные библиотеки со cpan и явно указывать к ним путь.

Важно: на хостинге должен быть Perl 5.10 или выше.

Хочу сразу упомянуть - на момент написания статьи я использовал Mojolicious-4.71. По ходу дела я размещу ссылки на скачивание архивов зависимостей. Прогресс не стоит на месте и разработчики фреймворка, как и разработчики ORM DBIx::Class продолжают сопровождать свои детища, поэтому в дальнейшем вполне могут появиться новые зависимости, но с ними Вам уже будет разобраться проще. =)

mojolicious

Для решения этой задачи, я частично пользовался статьей на хабре. Можете также с ней ознакомиться.

Итак, установите Mojolicious, если он не установлен и сгенерируйте новый проект:

mojo generate app App

Все содержимое созданной папки "app" заливаем на сервер. Скачать файлы mojolicious можно с официального сайта, можно со cpan, можно с github (кому как удобнее). Из архива берем папку lib и изменяем ее название на mojo. Отправляем на сервер в папку проекта.

Скачиваем DBIx::Class. "lib" переименовываем в "dbix" и отправляем на сервер.

И напоследок собранный мной архив с зависимостями. (еще раз повторюсь, если появятся новые - докачайте).

Переименуйте также папку "script" в "cgi-bin" и скрипт запуска, допустим, в app.pl с правами 755.

chmod 755 app.pl

Сам скрипт выглядит следующим образом:

#!/usr/local/bin/perl

use strict;
use warnings;

use lib ( '/полный_путь/mojo' );
use lib ( '/полный_путь/lib' );
use lib ( '/полный_путь/dbix' );
use lib ( '/полный_путь/module' );

use Mojo::Base 'Mojolicious';
use base qw/DBIx::Class::Schema/;

use File::Basename 'dirname';
use File::Spec::Functions qw(catdir splitdir);

# Source directory has precedence
my @base = (splitdir(dirname(__FILE__)), '..');
my $lib = join('/', @base, 'lib');
-e catdir(@base, 't') ? unshift(@INC, $lib) : push(@INC, $lib);

# "My eyes! The goggles do nothing!"
require Mojolicious::Commands;
Mojolicious::Commands->start_app('App');

В корневой директории приложения создадим .htaccess с содержимым:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /cgi-bin/app.pl/$1 [L]
RewriteRule ^$ /cgi-bin/app.pl [L]

Итак, структура должна выглядить следующим образом:

  • /cgi-bin/app.pl - скрипт запуска приложения
  • /dbix - директория с модулями DBIx::Class
  • /lib - директория с модулями приложения
  • /log - логи
  • /module - директория для зависимостей
  • /mojo - модули Mojolicious
  • /public - файлы сайта
  • /templates - шаблоны сайта
  • .htaccess

Всего доброго. Получилось или нет, пишите в комментах.