# Встановлення і налаштування Flarum v2 (beta) Днями було [засновано](https://devzone.org.ua/topic/ukrayinska-spilnota-administratoriv-alternatyvnykh-merez) українську спільноту адміністраторів альтернативних мереж. У якості платформи для спілкування - обрано рушій [Flarum](https://flarum.org). Цей матеріал - адаптована версія інструкції для Debian/Linux, якщо комусь потрібно буде швидко розгорнути дану платформу, адже в [документації](https://docs.flarum.org/2.x/install) не вказані деякі, на мою думку, важливі моменти. ## Системні залежності ``` bash apt install composer\ php-fpm php-curl php-xml php-common php-sqlite3\ php-gd php-json php-mbstring php-tokenizer php-zip ``` ## Рушій > В рамках спільноти, також було створено спеціалізований [форк](https://github.com/YGGverse/flarum-framework/tree/yggverse), для роботи з локальними поштовими скриньками без DNS. Нижче описана збірка для звичайної (офіційної) версії. 1. `cd /var/www` 2. `composer create-project flarum/flarum:^2.0.0 --stability=beta` - встановлюємо через Composer 3. `cd flarum` - переходимо до теки проєкту 4. `composer update` - оновлюємо реєстр залежностей PHP 5. `php flarum install` - встановлюємо базу даних (тут створюється файл `config.php`) * при виконанні команди `php flarum install` і використання драйвера SQLite, важливо вказати `name.sqlite` (з розширенням) інакше інсталяція не відбудеться * назву хосту лишаємо як є (`localhost`) Так як форум спільноти працює на обидві мережі [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereza-z-detsentralizovanym-routynhom)/Mycelium, у файлі `config.php` я вказав: ``` config.php 'url' => null, ``` * є ще [такий рецепт](https://discuss.flarum.org/d/2244-tor) (`'url' => '//' . $_SERVER['HTTP_HOST']`), але у такому разі компіляція статики не можлива, щонайменше на версії 2 буде помилка JS, ну і якщо робити то якось так, щоб не було warning при скиданні кешу: `'url' => isset($_SERVER['HTTP_HOST']) ? '//' . $_SERVER['HTTP_HOST'] : null` * якщо встановити `null` то можливі проблеми з редіректами, наприклад, при виході з акаунту * якщо ставите форум для класичного Інтернет - просто вкажіть свій основний хост Далі вийшов з цієї теки та надав права веб-серверу, згідно інструкції: ``` bash chown -R www-data:www-data /var/www/flarum ``` * тут треба придумати щось з групами, бо від `root` менеджер `composer` пускати не рекомендовано (наприклад, для оновлень рушія чи встановлення нових пакунків) ## Nginx ``` /etc/nginx/default server { # для спільноти 443 порт не використовується, # натомість є два "дзеркала" IPv6 listen [xxx:xxxx:xxxx:xxxx::x1]:80; listen [xxx:xxxx:xxxx:xxxx::x2]:80; server_name xxx:xxxx:xxxx:xxxx::x1 xxx:xxxx:xxxx:xxxx::x2; access_log /var/log/nginx/flarum.access.log; root /var/www/flarum/public; index index.php index.html; include /var/www/flarum/.nginx.conf; location ~ \.php$ { fastcgi_pass unix:/run/php/php8.2-fpm.sock; include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } ``` * версію сокета PHP замініть актуальною (`php -v`) * шляхи `/var/www/flarum` я пишу з пам'яті, бо довго тягав локацію туди-сюди і зараз вона в мене розташована на окремому, примонтованому диску, тому перевірте відповідність у себе актуальну щоб не було конфузів * тут я ще думаю залочити локацію `/admin` по IP ## Локалізація Пакети локалізації постачаються українською спільнотою [Joomla-UA](https://github.com/flarum-lang/ukrainian), але схоже що тільки для першої версії, бо встановлення ніяк не позначилось на поточному інтерфейсі. Тому потрібно якось зайнятись цим питанням. ## Бекапи Я зберігаю дані в SQLite, тому тут все просто: ``` bash mkdir -p /path/to/flarum/daily crontab -e @daily /usr/bin/rsync -av --delete /path/to/flarum.sqlite /path/to/flarum/daily-dir ``` * аватарки та інші медіа ще не вияснив де зберігаються, доповню ## Виявлені проблеми ### Швидкість Рушій здивував своєю тормознутістю. Особливо в режимі дебаг. Можливо, це залежить від SSD та кількості PHP файлів Symfony, які потребують кешування препроцесору. Або ж in-memory драйвера сесій замість БД. Це питання я ще для себе вирішую. Якщо знаєте відповідь - поділіться в коментарях! ### Зовнішні запити Згодом, в консолі були помічені зовнішні запити до кешуючих серверів: ``` Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://cdn.jsdelivr.net/gh/s9e/hljs-loader@1.0.36/loader.min.js. (Reason: CORS request did not succeed). Status code: (null). ``` Для Веб - це "нормально", але для оверлейних мереж і спільноти, виправлено так: вимикаємо або вказуємо локальне дзеркало "CDN mirror address" для додатка `flarum-emoji` ### Тривалість сесій авторизації Форум викидає користувача через відносно короткий час (120 хвилин). Рішення проблеми: ``` php // File /extend.php use Flarum\Extend; use Flarum\Foundation\AbstractServiceProvider; use Illuminate\Contracts\Config\Repository as ConfigRepository; class MyServiceProvider extends AbstractServiceProvider { public function register () { $this->container->make(ConfigRepository::class)->set('session.lifetime', 43829); // In minutes. Default is 120 } } return [ // Register extenders here to customize your forum! (new Extend\ServiceProvider) ->register(MyServiceProvider::class), ]; ``` * за [посиланням](https://discuss.flarum.org/d/21562-login-session-timeout/15) є ще один приклад для старішої версії * UPD: згодом змінив `session.lifetime` на `session.gc_maxlifetime` * щоб не робити окремий файл-костиль, можна просто вказати ці опції в `/etc/php/{VERSION}/fpm/php.in` та оновити налаштування командою `systemctl restart php{VERSION}-fpm` ### Пошта Класична електронна пошта (e-mail) - ядро системи облікових записів для цього рушія. В принципі, можна вимкнути (точніше перемкнути пересилання листів до журналу) і вручну створювати користувачів, але вони не зможуть навіть скинути свій пароль без пересилання їм коду підтвердження. #### Sendmail Підійде у разі, якщо ви плануєте роботу з поштою але у вас з якихось причин немає повноцінного SMTP провайдера, наприклад Google. ##### Postfix / SMTP Нижче показано самий простий приклад, який передбачає опцію налаштування "sendmail" що вказується в адмінці. У цьому випадку, 25 порт є закритим на фаєрволі. ``` bash apt install postfix ``` Мій файл конфігурації `/etc/postfix/main.cf` саме для цього ресурсу виглядає так: ``` /etc/postfix/main.cf myhostname = localhost smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no append_dot_mydomain = no readme_directory = no smtpd_use_tls=no compatibility_level = 3.6 smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = ipv6 smtpd_etrn_restrictions=reject disable_vrfy_command = yes smtpd_helo_required = yes ``` * тут `myhostname` - ваш актуальний хост * `inet_protocols` можна вказати як "all" якщо планується взаємодія з Інтернет ##### Тестування Якщо бачите повідомлення: > Flarum currently does not send emails. This can be due to the selected driver, or errors in its configuration. то це не критично, в мене відправлення працює й з ним, головне, щоб не було помилок в поп-апах. #### Варіант без пошти В адмінці є варіант "log" тобто пошта буде надсилатись у файл-заглушку, з якого можна пересилати різні лінки верифікації та інші запити - руками або скриптом. Знаходиться цей журнал в `flarum/storage/logs/*.log` Вимкнути самі поля форм без патчу не вийде, в адмінці доступна лише опція вимкнення реєстрацій, таким чином, користувач бачитиме помилку при надсиланні відповідного запиту (так як це зараз). ## Розробка Так як форум спільноти має деякі не характерні фічі, що не мають сенсу для загального PR, з'явився певний досвід по розгортанню власної версії а також може стати в нагоді, якщо вам потрібно використовувати цей рушій для локальної розробки. Як і у випадку з основною документацією, тут є свої нюанси, про які в [офіційній версії](https://docs.flarum.org/contributing/#setting-up-a-local-codebase) не сказано. Якщо коротко то вам потрібен "скелет" форуму [flarum](https://github.com/flarum/flarum) та [framework](https://github.com/flarum/framework), якийсь в документації також називається `monorepo` і включає в себе різні модулі (для яких також є окремі read-only репозиторії). При чому `framework` у даному прикладі - є вашим об'єктом модифікації, ви також можете забрати його копію з офіційного апстріму. Збірка `dev` версії рушія виглядає наступним чином: 1. `cd /var/www` 2. `git clone https://github.com/flarum/framework.git` 3. `cd framework` 4. `git checkout yggverse` 5. `cd ..` 6. `git clone https://github.com/flarum/flarum.git` 7. `cd flarum` 8. `composer config repositories.0 path "/var/www/framework/*/*"` 9. `composer config minimum-stability dev` 10. `composer install` або `php flarum migrate` 11. `php flarum cache:clear` 12. `php flarum assets:publish` - згенерувати статику шрифтів ([1](https://discuss.flarum.org/d/37999-missing-font-assets-after-the-monorepo-compile), [2](https://discuss.flarum.org/d/27673-missing-fonts)) При оновленні компонентів фронт-енд, важливо (після `yarn install`) зкомпілювати оптимізовані файли дистрибутиву командою `yarn build` для подальшого встановлення в рамках компонента `flarum`. Але для цього вам треба додати такий [фікс](https://github.com/YGGverse/flarum-framework/commit/b02e3b3600d5c0ff1a613590e72d91e7b9d88111).