Jak zainstalować Flarum na VPS krok po kroku
Instrukcja instalacji Flarum z PHP, Composer i MariaDB na serwerze VPS. Dowiedz się, jak poprawnie skonfigurować katalog public, wdrożyć TLS oraz uniknąć błędów przy aktualizacji.
Instalacja Flarum na VPS z PHP i MariaDB
Instalacja Flarum na serwerze VPS pozwala uzyskać forum działające w oparciu o PHP i MariaDB, bez konieczności używania Docker, Ruby czy oddzielnego procesora zadań. To główny powód wyboru tego rozwiązania. Instalacja Discourse na VPS wiąże się z koniecznością uruchomienia stosu Docker zawierającego Ruby, PostgreSQL, Redis oraz procesy w tle, gdzie 2 GB pamięci RAM stanowi praktyczne minimum przed dodaniem kopii zapasowych lub serwera poczty. Discourse uzasadnia takie wymagania w przypadku dużych społeczności generujących tysiące postów dziennie. Dla forum liczącego kilkuset użytkowników jest to infrastruktura, za którą płaci się co miesiąc, nie wykorzystując jej potencjału. Flarum mieści się w stosie PHP, który prawdopodobnie już posiadasz, więc serwer VPS z 1 GB RAM, nginx i MariaDB może obsłużyć forum obok innych usług. Jeśli wybór oprogramowania nie jest jeszcze przesądzony, szersze porównanie oprogramowania forum do samodzielnego hostowania omawia pozostałe dostępne opcje.
Niniejszy przewodnik dotyczy instalacji Flarum w wersji 1.x, obecnie serii 1.8. Na sierpień 2026 roku Flarum 2.0 jest nadal w fazie release candidate, dlatego wersja 1.8 jest zalecana dla forum, z którego korzystają inni użytkownicy. W tym przypadku rozszerzenia mają większe znaczenie niż wersja rdzenia, a większość autorów rozszerzeń nie dokonała jeszcze migracji do wersji 2.0.
Wymagania serwerowe dla Flarum 1.8
Dokumentacja Flarum określa wymagania jako PHP 7.3 lub nowszy, MySQL 5.6+ lub MariaDB 10.0.5+ oraz nginx lub Apache z mod_rewrite. Ubuntu 24.04 dostarcza PHP 8.3 oraz MariaDB 10.11, więc pakiety dystrybucyjne spełniają oba wymagania bez konieczności korzystania z zewnętrznych repozytoriów. Wymagane rozszerzenia PHP dla Flarum to curl, dom, fileinfo, gd, json, mbstring, openssl, pdo_mysql, tokenizer oraz zip. Niezbędny jest również dostęp do powłoki, ponieważ Composer jest w tym przypadku wymagany: każde rozszerzenie Flarum jest pakietem Composer i nie ma możliwości dodania go bez uruchomienia narzędzia Composer.
Flarum jest standardową aplikacją PHP. Jeśli użytkownik posiada już skonfigurowany stos LAMP na Ubuntu 24.04, większość elementów opisanych w dwóch kolejnych sekcjach jest już zainstalowana i można przejść bezpośrednio do konfiguracji bazy danych.
Instalacja PHP oraz rozszerzeń wymaganych przez Flarum
sudo apt update
sudo apt install -y nginx mariadb-server composer
sudo apt install -y php8.3-fpm php8.3-cli php8.3-curl php8.3-gd php8.3-mbstring php8.3-mysql php8.3-xml php8.3-zip
php -m | grep -E 'curl|dom|gd|mbstring|pdo_mysql|zip'
composer --versionNazwy pakietów nie odpowiadają jeden do jednego liście wymagań Flarum. Rozszerzenie dom znajduje się wewnątrz php8.3-xml, natomiast fileinfo, json, openssl oraz tokenizer są wbudowane w PHP 8.3 na systemie Ubuntu, więc nie wymagają instalacji osobnych pakietów. Polecenie grep powinno wyświetlić sześć linii, a composer --version powinno wskazać wydanie 2.x. Brakujące rozszerzenie należy naprawić na tym etapie, ponieważ Composer odmówi instalacji Flarum bez niego, a komunikat o błędzie wskaże brakujący element:
Problem 1
- flarum/core[v1.8.0, ..., v1.8.17] require ext-gd * -> it is missing from your system.
Install or enable PHP's gd extension.Należy sprawdzić, czy wersja PHP używana w wierszu poleceń oraz wersja menedżera procesów FastCGI (PHP-FPM) są identyczne. Composer działa w oparciu o binaria wiersza poleceń, podczas gdy forum korzysta z FPM, dlatego php -v oraz sudo php-fpm8.3 -v muszą być zgodne. Rozbieżności pojawiają się na maszynach, w których zainstalowano kilka wersji PHP z zewnętrznych repozytoriów, co skutkuje tym, że rozszerzenie zainstalowane dla jednej wersji jest niewidoczne dla drugiej.
Utworzenie bazy danych i dedykowanego użytkownika bazy danych
sudo mariadb-secure-installation
sudo mariadbCREATE DATABASE flarum CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'flarum'@'localhost' IDENTIFIED BY 'use-a-long-random-password';
GRANT ALL PRIVILEGES ON flarum.* TO 'flarum'@'localhost';
FLUSH PRIVILEGES;
EXIT;Należy przypisać Flarum własnego użytkownika bazy danych zamiast root. Uprawnienia obejmują wyłącznie flarum.*, dzięki czemu błąd SQL injection w zewnętrznym rozszerzeniu nie pozwoli na odczyt pozostałych baz danych. Istotne jest również kodowanie znaków: utf8mb4 poprawnie obsługuje emoji oraz znaki spoza alfabetu łacińskiego, podczas gdy starsze kodowanie MySQL utf8 jest ograniczone do trzech bajtów i powoduje ucinanie treści w miejscu wystąpienia znaku czterobajtowego. Przed przejściem dalej należy zweryfikować poprawność działania użytkownika.
mariadb -u flarum -p flarum -e 'SELECT DATABASE();'Polecenie powinno zwrócić flarum. Komunikat ERROR 1045 (28000): Access denied for user 'flarum'@'localhost' oznacza, że hasło jest nieprawidłowe lub użytkownik został utworzony dla hosta innego niż localhost.
Instalacja Flarum na VPS przy użyciu Composer z przypięciem do wersji 1.8
Najpierw należy utworzyć użytkownika systemowego, który będzie właścicielem kodu. Uruchamianie Composer jako root pozostawia pliki z uprawnieniami root w vendor/ oraz storage/, przez co PHP nie może później zapisać własnej pamięci podręcznej, a forum odpowiada na każde żądanie błędem 500.
sudo useradd --system --home-dir /srv/flarum --shell /bin/bash flarum
sudo install -d -o flarum -g flarum -m 755 /srv/flarum
sudo -iu flarumOstatnie polecenie przenosi użytkownika do powłoki jako flarum, w katalogu /srv/flarum. Każde polecenie od tego miejsca do końca przewodnika jest wykonywane z tego poziomu, chyba że zaczyna się od sudo.
composer create-project flarum/flarum:^1.8.0 .Ograniczenie ^1.8.0 stanowi przypięcie wersji. Akceptuje ono wydania poprawkowe 1.8.x i odrzuca wersję 2.0, co jest pożądane, dopóki 2.0 znajduje się w fazie release candidate. Composer pobiera szkielet, rozwiązuje flarum/core oraz jego zależności, pozostawiając public/, storage/, vendor/, composer.json oraz skrypt linii poleceń flarum.
Na małym VPS ten krok jest miejscem, w którym proces często kończy się niepowodzeniem, przy czym dwie różne awarie wyglądają podobnie. PHP Fatal error: Allowed memory size of 134217728 bytes exhausted to wewnętrzny limit memory_limit języka PHP, a umieszczenie COMPOSER_MEMORY_LIMIT=-1 przed poleceniem usuwa to ograniczenie dla pojedynczego uruchomienia. Puste Killed w osobnej linii bez błędu PHP oznacza działanie mechanizmu OOM Killer jądra systemu, co można potwierdzić za pomocą dmesg | tail. Taki przypadek oznacza, że maszyna faktycznie wyczerpała pamięć RAM, więc należy dodać przestrzeń wymiany (swap): zwiększanie limitu PHP pogarsza sytuację, ponieważ PHP zażąda jeszcze większej ilości pamięci, zanim jądro przerwie proces.
Dlaczego tylko /public powinno być dostępne z zewnątrz
Katalog główny projektu zawiera config.php z hasłem do bazy danych zapisanym otwartym tekstem, vendor/ ze wszystkimi zależnościami oraz storage/ z logami i sesjami w pamięci podręcznej. Żaden z tych elementów nie powinien być dostępny w publicznym Internecie. Flarum przechowuje wszystkie pliki dostępne przez przeglądarkę w jednym podkatalogu, public/, który zawiera index.php, folder assets/ i niewiele więcej. Skierowanie katalogu głównego serwera WWW na /srv/flarum/public sprawia, że reszta drzewa katalogów jest nieosiągalna przez HTTP z samej konstrukcji, a nie z powodu reguły, o której trzeba pamiętać.
Skierowanie katalogu głównego na /srv/flarum powoduje realne zagrożenie. Żądanie /config.php nie zwraca nic użytecznego, ponieważ PHP wykonuje plik, który zwraca jedynie tablicę. Jednak /storage/logs/flarum.log przekazuje niepowołanym osobom ślady stosu (stack traces) i błędy bazy danych, a /composer.lock informuje o dokładnej wersji każdego używanego pakietu, co stanowi gotową listę znanych podatności do wykorzystania.
Nadanie PHP-FPM własnej puli
Flarum wymaga uprawnień do zapisu w trzech ścieżkach: w katalogu głównym projektu, aby instalator mógł utworzyć config.php; w storage/, dla logów i pamięci podręcznej; oraz w assets/, dla przesyłanych awatarów i logotypów. Pliki należą do użytkownika flarum, więc poprawnym rozwiązaniem jest utworzenie puli PHP-FPM działającej jako flarum. Proces nginx działa nadal jako www-data i posiada wyłącznie uprawnienia do odczytu.
Utwórz plik /etc/php/8.3/fpm/pool.d/flarum.conf:
[flarum]
user = flarum
group = flarum
listen = /run/php/php8.3-fpm-flarum.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 30s
php_admin_value[memory_limit] = 256M
php_admin_value[upload_max_filesize] = 16M
php_admin_value[post_max_size] = 17Msudo systemctl restart php8.3-fpm
ls -l /run/php/php8.3-fpm-flarum.sockGniazdo powinno być zdefiniowane jako srw-rw---- 1 www-data www-data. Proces nadrzędny działa jako root i tworzy gniazdo, dzięki czemu może przekazać jego własność użytkownikowi www-data, podczas gdy procesy robocze działają jako flarum. Jeśli gniazdo nie istnieje, sudo journalctl -u php8.3-fpm -n 30 wyświetli komunikat o odrzuceniu połączenia przez FPM. pm = ondemand uruchamia procesy robocze tylko w momencie nadejścia żądania, dzięki czemu nieaktywne forum niemal nie zużywa pamięci RAM pomiędzy wizytami użytkowników.
Blok serwera nginx
Flarum zawiera w katalogu głównym projektu fragment konfiguracji nginx o nazwie .nginx.conf. Zawiera on reguły przepisywania adresów (rewrite), nagłówki pamięci podręcznej oraz ustawienia kompresji. Należy go dołączyć (include) zamiast kopiować, dzięki czemu aktualizacja Flarum wprowadzająca zmiany w tym fragmencie zostanie automatycznie uwzględniona na serwerze bez konieczności ręcznej edycji.
server {
listen 80;
listen [::]:80;
server_name forum.example.com;
root /srv/flarum/public;
index index.php;
client_max_body_size 16M;
include /srv/flarum/.nginx.conf;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm-flarum.sock;
}
}Zapisz to jako /etc/nginx/sites-available/flarum, a następnie aktywuj konfigurację.
sudo ln -s /etc/nginx/sites-available/flarum /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxnginx -t powinien odpowiadać na syntax is ok oraz test is successful. Wiersz include jest często pomijany, co prowadzi do bardzo konkretnego objawu: strona główna ładuje się poprawnie, natomiast każdy odnośnik do dyskusji zwraca błąd 404 z nginx. Flarum obsługuje adresy URL typu /d/1-hello-world wewnątrz PHP. Ścieżka ta nie jest fizycznym plikiem na dysku, więc bez reguły try_files $uri $uri/ /index.php?$query_string zawartej we fragmencie, nginx szuka katalogu o nazwie d. Gdy go nie znajduje, zwraca błąd 404, zanim żądanie trafi do PHP. Apache realizuje to samo routowanie za pomocą pliku .htaccess znajdującego się już w public/, który działa tylko wtedy, gdy pasujący blok <Directory> ma ustawioną dyrektywę AllowOverride All.
Dodaj TLS przed uruchomieniem instalatora
Certyfikat należy uzyskać teraz, a nie później. Flarum zapisuje swój bazowy adres URL w config.php podczas instalacji, pobierając go bezpośrednio z paska adresu przeglądarki. Instalacja przez http:// sprawi, że każdy zasób generowany przez Flarum będzie zaczynał się od http://. Po późniejszym dodaniu TLS (transport layer security) przeglądarka zablokuje te żądania jako tzw. mixed content, co spowoduje, że forum wczyta się jako niesformatowany tekst bez obsługi JavaScript. Najpierw wykonaj konfigurację certbot dla Let's Encrypt na nginx, upewnij się, że https://forum.example.com wyświetla stronę, a następnie wróć do tego punktu.
Jeśli instalacja została już przeprowadzona przez zwykłe HTTP, naprawa wymaga jednej linii. Edytuj /srv/flarum/config.php tak, aby klucz url zawierał wartość 'url' => 'https://forum.example.com',, a następnie uruchom php flarum cache:clear jako użytkownik flarum.
Uruchomienie instalatora i zabezpieczenie config.php
Otwórz https://forum.example.com w przeglądarce. Instalator internetowy Flarum wymaga podania nazwy bazy danych, utworzonego użytkownika bazy i hasła, tytułu forum oraz danych konta administratora. Instalator zapisuje plik config.php i tworzy tabele. Po zakończeniu operacji należy ograniczyć uprawnienia do pliku zawierającego hasło do bazy danych.
sudo chmod 640 /srv/flarum/config.phpPlik pozostaje możliwy do odczytu i zapisu dla flarum, czyli użytkownika, na którym działa FPM, oraz staje się niedostępny dla pozostałych kont w systemie. Następnie należy zweryfikować instalację z poziomu powłoki.
php flarum infoPolecenie to wyświetla wersję rdzenia, wersję PHP, włączone rozszerzenia, sterownik poczty oraz używane ścieżki. Jest to pierwsze polecenie, które należy wykonać w przypadku nieprawidłowego działania systemu i o które zapyta każda osoba udzielająca pomocy.
Dlaczego e-maile rejestracyjne i resetowania hasła nie docierają bez komunikatu o błędzie
Ta sekcja decyduje o tym, czy forum przetrwa pierwszy tydzień. Pierwsze dwie wiadomości e-mail, jakie wysyła nowe forum, to potwierdzenie rejestracji oraz resetowanie hasła. Obie są wysyłane w momencie, gdy użytkownik ocenia wiarygodność społeczności. Obie mogą zawieść bez żadnego powiadomienia. Osoba, która nie otrzymała wiadomości, nie ma jak zgłosić problemu, a w panelu administracyjnym nie pojawiają się żadne czerwone alerty.
Flarum obsługuje cztery sterowniki poczty, konfigurowane w sekcji Administration, a następnie Email: smtp, mail, mailgun oraz log. Należy wybrać smtp i wskazać usługę pocztową, która faktycznie dostarczy wiadomość. Sterownik mail przekazuje wiadomość do lokalnego pliku binarnego sendmail, który nie istnieje na świeżym serwerze Ubuntu VPS, więc wiadomość znika bez śladu, a błąd nie jest zgłaszany. Sterownik log zapisuje treść wiadomości w storage/logs/ i nie wysyła jej wcale, ponieważ służy wyłącznie do celów programistycznych.
Po zapisaniu ustawień należy użyć przycisku Send Test Mail na tej samej stronie. Ten przycisk to jedyne narzędzie weryfikacji, dlatego należy z niego skorzystać przed zaproszeniem kogokolwiek. Jeśli wiadomość nie dotrze, należy sprawdzić logi.
tail -n 50 /srv/flarum/storage/logs/flarum.logOdmowa połączenia, odrzucone logowanie oraz błąd negocjacji TLS są tam rejestrowane wraz z adresem hosta i portem, z którymi próbowano się połączyć. Wiersz zawierający Connection could not be established with host smtp.example.com oznacza, że port jest zablokowany lub nieprawidłowy. Najczęstszą przyczyną jest domyślne blokowanie ruchu wychodzącego na porcie 25 przez dostawcę serwera. Port 587 z ustawionym szyfrowaniem tls to kombinacja działająca z niemal każdą usługą pocztową.
Gdy poczta nie działa, użytkownik próbujący się zarejestrować zobaczy ogólny komunikat o błędzie Flarum, Oops! Something went wrong. Please reload the page and try again., ponieważ żądanie kończy się niepowodzeniem podczas wysyłania potwierdzenia. W obu przypadkach użytkownik nie może uzyskać dostępu i nie poinformuje o tym administratora.
Dostarczenie wiadomości to problem odrębny od samego wysłania. Poczta wysyłana z adresu VPS bez opublikowanych rekordów SPF lub DKIM dla domeny trafia do folderu spam lub jest odrzucana bez żadnego komunikatu zwrotnego. W efekcie logi wykazują poprawne wysłanie, a odbiorca nadal nic nie otrzymuje. Niezawodne wysyłanie poczty z aplikacji hostowanych samodzielnie zawiera informacje o tym, jakie rekordy DNS opublikować oraz z jakich usług przekaźnikowych warto korzystać.
Rozszerzenia to pakiety Composer, więc aktualizacje wykonuje się poleceniem
W Flarum rozszerzenie jest pakietem Composer. Nie ma przycisku przesyłania ani pliku zip do umieszczenia w folderze. Jest to świadoma decyzja projektowa: wersje są sprawdzane pod kątem zgodności, dokładny zestaw jest zapisany w composer.lock, a rozszerzenie zależne od biblioteki PHP otrzymuje tę bibliotekę zainstalowaną w poprawny sposób. Ceną za to jest fakt, że dodanie rozszerzenia wymaga wykonania trzech poleceń jako użytkownik flarum.
composer require 'fof/upload:*'
php flarum migrate
php flarum cache:clearNastępnie należy włączyć je w panelu administracyjnym w sekcji Extensions. Każde polecenie wykonuje odrębne zadanie. composer require umieszcza kod na dysku. php flarum migrate uruchamia wszelkie migracje bazy danych zawarte w rozszerzeniu, co pozwala na tworzenie własnych tabel. php flarum cache:clear przebudowuje skompilowane pakiety JavaScript i CSS, które ładuje przeglądarka. Pominięcie ostatniego kroku prowadzi do typowego problemu: rozszerzenie jest widoczne na liście, przełącznik jest włączony, a w przeglądarce nic się nie zmienia, niezależnie od liczby odświeżeń strony.
Usuwanie rozszerzenia przebiega w odwrotnej kolejności. Najpierw należy wyłączyć je w panelu administracyjnym, a następnie usunąć pakiet. Flarum celowo pozostawia tabele rozszerzenia w bazie danych, dzięki czemu ponowne włączenie go w przyszłości nie powoduje utraty danych. Aby usunąć również tabele, należy wycofać migracje przed usunięciem kodu.
php flarum migrate:reset --extension fof-upload
composer remove fof/upload
php flarum cache:clearIdentyfikator rozszerzenia w tym poleceniu to nazwa pakietu, w której ukośnik zastąpiono myślnikiem. Jeśli wolisz klikać zamiast wpisywać polecenia, composer require 'flarum/extension-manager:*' dodaje oficjalną stronę administracyjną, która stanowi nakładkę na Composer. Wykonuje ona te same operacje co użytkownik WWW, wymaga takiej samej ilości pamięci i tych samych uprawnień do zapisu, a także kończy się niepowodzeniem w tych samych sytuacjach, dlatego wiersz poleceń pozostaje najbardziej niezawodną metodą w przypadku wystąpienia problemów.
Dlaczego composer update odmawia aktualizacji Flarum
Aktualizacja Flarum oraz wszystkich rozszerzeń sprowadza się do jednego polecenia Composer, po którym następują dwa polecenia Flarum. Wcześniej należy wykonać kopię zapasową bazy danych.
composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies
php flarum migrate
php flarum cache:clearNależy przeanalizować dane wyjściowe zamiast zakładać, że operacja przebiegła pomyślnie, ponieważ najistotniejszy przypadek występuje wtedy, gdy Composer odmawia wykonania jakichkolwiek działań:
Your requirements could not be resolved to an installable set of packages.Ten komunikat oznacza, że jedno z zainstalowanych rozszerzeń deklaruje ograniczenie flarum/core, które wyklucza wersję, do której planowana jest migracja. Composer nie naruszy tego ograniczenia, więc utrzymuje całą instalację w starszej wersji, zamiast tworzyć konfigurację, która według autora rozszerzenia nie będzie działać. Należy zidentyfikować pakiet odpowiedzialny za ten stan.
composer why-not flarum/core 1.8.17Dane wyjściowe zawierają listę wszystkich pakietów blokujących daną wersję oraz deklarowane przez nie ograniczenia. W takiej sytuacji można poczekać, aż autor opublikuje kompatybilne wydanie, lub usunąć rozszerzenie i zrezygnować z jego funkcjonalności. Jest to koszt modelu pracy Composer, który warto zrozumieć przed zainstalowaniem piętnastu rozszerzeń na forum, z którego korzystają inni użytkownicy. Należy preferować rozszerzenia, dla których niedawno opublikowano nową wersję, oraz ograniczyć ich liczbę do poziomu umożliwiającego łatwe zarządzanie.
Co należy archiwizować
Należy wykonać kopię zapasową bazy danych oraz katalogu projektu. Wszystkie pozostałe elementy można odtworzyć.
mariadb-dump -u flarum -p --single-transaction flarum > flarum-$(date +%F).sql
sudo tar czf flarum-files.tgz -C /srv flarumW starszych systemach mariadb-dump nosi nazwę mysqldump; w Ubuntu 24.04 działają obie nazwy. Baza danych przechowuje wszystkie wpisy, użytkowników oraz ustawienia. Katalog projektu zawiera config.php, composer.json (który stanowi faktyczny rejestr używanych rozszerzeń) oraz assets/ z przesłanymi awatarami i logotypami. Można pominąć vendor/, ponieważ composer install odtwarza go na podstawie composer.lock, a storage/ generuje się samoczynnie. Należy skopiować oba pliki poza serwer, ponieważ kopia zapasowa przechowywana na tej samej maszynie, którą chroni, nie jest kopią zapasową. Przywracanie polega na instalacji świeżej instancji Flarum w tej samej wersji, composer install, umieszczeniu zapisanych plików w odpowiednich miejscach oraz zaimportowaniu pliku SQL.
FAQ
Can Flarum run on a 1 GB VPS?
Yes, for a small community. Flarum in normal operation is PHP-FPM answering requests plus MariaDB, and with pm = ondemand the PHP workers only exist while someone is reading. The peak is the install itself: composer create-project resolves the whole dependency graph in memory and is the step most likely to be stopped by the out-of-memory killer. Add a swap file before you install, or run Composer once on a larger machine and copy the tree across.
Why do discussion links return 404 when the front page works?
Your nginx server block is missing include /srv/flarum/.nginx.conf;. Flarum handles URLs such as /d/1-hello-world inside PHP, and that path is not a file on disk. Without the snippet's try_files $uri $uri/ /index.php?$query_string rule, nginx searches for a directory called d, fails, and returns 404 itself without ever calling PHP. On Apache the same routing comes from public/.htaccess, which is ignored unless the <Directory> block sets AllowOverride All.
Why did my forum lose all its styling after I enabled HTTPS?
Flarum stores its base URL in config.php, captured from whatever address you used when running the installer. If you installed over plain HTTP, Flarum keeps generating http:// asset URLs, and the browser blocks them as mixed content on an HTTPS page, which leaves unstyled text. Edit the url key in /srv/flarum/config.php to the https:// address and run php flarum cache:clear as the user that owns the files.
Why does nobody receive the signup confirmation email?
Check the mail driver first. The mail driver needs a local sendmail binary that a fresh Ubuntu VPS does not have, and the log driver writes to storage/logs/ and sends nothing. Switch to smtp, use port 587 with encryption set to tls because most providers block outbound port 25, and press Send Test Mail. If the log shows a successful send and the mail still never arrives, the problem is deliverability rather than configuration, so publish SPF and DKIM records for your sending domain.
Should I install Flarum 1.8 or 2.0?
Install 1.8. As of August 2026 Flarum 2.0 is a release candidate, and more importantly many extensions still declare a flarum/core constraint that stops at 1.x. Installing 2.0 today means running a forum whose extensions cannot be updated together, which is the exact failure composer why-not exists to diagnose. Pin with flarum/flarum:^1.8.0 and revisit once the extensions you depend on have published 2.0 releases.