Установка и настройка Phabricator#

Документация: https://secure.phabricator.com/book/phabricator/

Phabricator закончился, но списывать его ещё рано. Сообществом развивается форк под названием Phorge. Различия между ним и оригинальным Phabricator будут минимальны. Я запускал Phabricator на стеке Nginx + PHP-FPM + MariaDB.

Установка#

cd /srv/example.org && \
git clone https://github.com/phacility/arcanist.git && \
git clone https://github.com/phacility/phabricator.git && \
cd phabricator/

Теперь надо создать роль в MariaDB. К примеру — phab:

echo "CREATE USER 'phab'@'localhost' IDENTIFIED BY 'secure-pass';" | mysql -u root

Подключим к Phabricator:

./bin/config set mysql.host localhost
./bin/config set mysql.port 3306
./bin/config set mysql.user phab
./bin/config set mysql.pass secure-pass

Создаём и заполняем БД (будет создано много БД и необходимо, чтобы роль phab имела доступ к ним):

./bin/storage upgrade --user phab --password secure-pass --force

Можно использовать --force, чтобы перезаписать БД, если с первого раза не вышло создать всё что надо.

Даём права на таблицы. Надо случайно не дать ему права на БД других пользователей, поэтому вариант ниже не очень. Лучше указать к каким конкретно базам требуется доступ.

GRANT ALL PRIVILEGES ON *.* TO 'phab'@'localhost';

Сразу установим сертификат:

certbot certonly --webroot --agree-tos -w /srv/example.org/phabricator/webroot -d example.org

Конфиг nginx:

server {
    listen 80;
    listen 443 ssl http2;

    server_name example.org www.example.org;

    root /srv/example.org/phabricator/webroot;

    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;

    location / {
            index index.php;
            rewrite ^/(.*)$ /index.php?__path__=/$1 last;
    }

    location /index.php {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

        fastcgi_index   index.php;

        # required if PHP was built with --enable-force-cgi-redirect
        fastcgi_param  REDIRECT_STATUS    200;

        # variables to make the $_SERVER populate in PHP
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;

        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

        fastcgi_param  REMOTE_ADDR        $remote_addr;
    }
}

Конфигурация#

Phabricator много хочет, поэтому с некоторыми настройками, вероятно, придётся поэкспериментировать. Все параметры задаются через ./bin/config.

Параметр phabricator.base-uri мне пригодился, чтобы избавиться от Mixed Content:

./bin/config set phabricator.base-uri https://example.org

Для того, чтобы использовалась локальная директория для хранения загружаемых файлов надо её создать и подключить:

mkdir file_storage
chown www-data:www-data file_storage/
./bin/config set storage.local-disk.path /srv/example.org/phabricator/file_storage

В итоге конфиг ./conf/local.local.json у меня выглядит так:

{
  "pygments.enabled": true,
  "storage.local-disk.path": "/srv/example.org/phabricator/file_storage",
  "phabricator.base-uri": "https://example.org/",
  "mysql.pass": "secure-pass",
  "mysql.user": "phab",
  "mysql.port": "3306",
  "mysql.host": "localhost"
}

В моей конфигурации появилось предупреждение о проблеме с SSL. Документация: https://secure.phabricator.com/book/phabricator/article/configuring_preamble/

Помог следующий код в ./support/preamble.php:

<?php
$_SERVER['HTTPS'] = true;
// Следующая строка была бессмысленна, так как я не передавал заголовков.
//preamble_trust_x_forwarded_for_header();
?>

Докрутка настроек#

Авторизация#

После установки будет возможно зарегистрировать администратора в веб-интерфейсе, но у него не будет пароля. Чтобы задать пароль надо выполнить:

./bin/auth recover юзернейм

Будет получена одноразовая ссылка для восстановления пароля.

Также в веб-интерфейсе необходимо задать «Провайдера Авторизации» «Username/Password», чтобы на сайт возможно было залогиниться.

После того как провайдер будет указан надо заблокировать возможность изменять эту настройку из веб-интерфейса:

./bin/auth lock

Почта#

Для работы почты создаём файл mailers.json (название не имеет значения) с содержимым:

[
  {
    "key": "local-exim-mailer",
    "type": "sendmail"
  }
]

И выполняем:

./bin/config set --stdin cluster.mailers < mailers.json

Конфигурирование служб#

В веб-интерфейсе может падать куча предупреждений о неправильной настройке сервера, ниже приведены тексты замечаний и способы их устранения. Читать следует по порядку.

Server Timezone Not Configured

vim /etc/php/7.4/fpm/php.ini

В конфиге ставим:

date.timezone = Europe/Moscow

PHP post_max_size Not Configured

Всё там же:

post_max_size = 1G

OPcache Not Configured for Production

Продолжаем:

opcache.validate_timestamps=0

Ребутаем PHP-FPM, чтобы перечитать php.ini:

service php7.4-fpm restart

Alternate File Domain Not Configured

./bin/config set security.alternate-file-domain https://phabricator.gch.icu

Missing Repository Local Path

mkdir -p /var/repo/
chown www-data:www-data /var/repo/

Install Pygments to Improve Syntax Highlighting

apt install python3-pygments
./bin/config set pygments.enabled true

PHP Extension «APCu» Not Installed

apt install php-apcu

Phabricator Daemons Are Not Running

./bin/phd start

Small MySQL «max_allowed_packet»

vim /etc/mysql/mariadb.conf.d/50-server.cnf

В конфиге:

max_allowed_packet     = 34M

MySQL May Run Slowly

Всё там же. Добавляем:

innodb_buffer_pool_size=1600M

The MySQL «local_infile» option is enabled. This option is unsafe

Продолжаем:

local_infile=0

MySQL STRICT_ALL_TABLES Mode Not Set

sql_mode=STRICT_ALL_TABLES

Теперь ребутаем:

/etc/init.d/mysql restart

Бэкапы#

В моей установке Phabricator создал 59 баз данных (!). Предусмотрен инструментарий для бэкапа всего что надо из БД:

./bin/storage dump --compress --output backup.sql.gz

Восстанавливать так:

gunzip -c backup.sql.gz | mysql

Предварительно надо создать пользователя, а после создания БД дать ему гранты.

Бэкапить файлы надо руками.

Документация: https://secure.phabricator.com/book/phabricator/article/configuring_backups/