Instalacja automatyczna

Metoda automatyczna: jeden skrypt z panelu klienta przygotowuje cały serwer (stos WWW Apache + PHP, bazę danych, narzędzia bezpieczeństwa, cron). Następnie — wdrożenie panelu, wystawienie certyfikatu SSL i wprowadzenie licencji. Działa na Ubuntu/Debian: na świeżym VPS konfiguruje wszystko od zera, a na już skonfigurowanym serwerze — wyłącznie addytywnie (profil „Skonfigurowany serwer”, krok 01). Wszystkie poniższe polecenia są uporządkowane, wystarczy przewijać od góry do dołu.

Wartości zastępcze w poleceniach zastąp własnymi: monitor.example.com — Pana/Pani domena; 203.0.113.10 — rzeczywisty adres IP serwera; /var/www/monitor — katalog główny panelu (gdzie znajdują się public/, assets/, config.php); hasło do bazy danych wymyśl własne.
Pełny zestaw („Pełna ochrona”) jest przeznaczony dla świeżego VPS. Na czystym Ubuntu/Debian konfiguruje system bezpieczeństwa od zera — Fail2ban (jail.local), root-crontab, reguły UFW, konfigurację Apache. Jeśli serwer jest już skonfigurowany (działający panel, strony, poczta, własne jaile) — wybierz profil „Skonfigurowany serwer”: wprowadza on tylko zmiany addytywne i nie narusza Pana/Pani zapory, Fail2ban, poczty, SSH ani sysctl. Po wykryciu panelu hostingowego skrypt sam przełącza się na ten tryb. Przed pierwszym uruchomieniem można włączyć przebieg próbny (opcja w panelu) — pokaże, co zostanie wykonane, nie zmieniając niczego. Na działającym serwerze na wszelki wypadek wykonaj migawkę (snapshot).

01. Polecenie automatycznej konfiguracji z panelu

Polecenie pobiera Pan/Pani we własnym panelu klienta my.arciveo.com → sekcja „Konfiguracja serwera” (dostępna po wykupieniu Arcivéo Monitor). Jest ono powiązane z Pana/Pani kontem i zawiera osobisty token.

Skrypt przygotowuje cały serwer: stos WWW (Apache + PHP), bazę danych, narzędzia do SSL, pełny zestaw środków ochrony oraz zadania cron (Lynis, SMART, debsums, Logwatch, codzienny raport, aktualizacja ipsum).

1) Wybierz poziom ochrony (w panelu, przed skopiowaniem polecenia):

  • Pełna ochrona (zalecana) — UFW (zapora), Fail2ban, CrowdSec + bouncer, ipsum (lista blokowanych IP), Suricata (IDS/IPS), Falco, ModSecurity + OWASP CRS (WAF), PSAD, mod_evasive (anty-DoS), AIDE (integralność plików), debsums, ClamAV + maldet (antywirus), Auditd, AppArmor, Monit, Lynis (audyt), Logwatch, automatyczne aktualizacje zabezpieczeń.
  • Odchudzona — dla VPS z małą ilością RAM: podstawowy zestaw bez ciężkich komponentów.
  • Skonfigurowany serwer (panel hostingowy) — dla już działającego serwera z panelem (HestiaCP itp.), witrynami i pocztą: tylko zmiany addytywne (doinstalowanie narzędzi, cron, reguły sudo), a zapora, Fail2ban, poczta, SSH i sysctl pozostają bez zmian. Na serwerze z panelem skrypt wybiera ten tryb samodzielnie.
Uruchomienie próbne. W panelu można zaznaczyć opcję „Uruchomienie próbne” — wtedy polecenie tylko pokaże, co skrypt zainstaluje i zmieni, i zakończy się, niczego nie naruszając. Przydatne na już skonfigurowanym serwerze: najpierw próbne uruchomienie, potem właściwe bez zaznaczonej opcji.

2) Wykonaj na serwerze jako root polecenie z panelu — wygląda ono tak:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN" | sudo bash
Polecenie proszę zachować w tajemnicy — jest powiązane z Pana/Pani kontem. Odnośnik ma ograniczony okres ważności; jeśli wygasł, proszę kliknąć w panelu „Pobierz nowy odnośnik”.
Po automatycznej konfiguracji serwerem WWW jest Apache + PHP-FPM, a narzędzia bezpieczeństwa oraz zadania cron są już zainstalowane i działają „od razu” — nie trzeba niczego dodatkowo konfigurować.

02. Domena i DNS

Aby otwierać panel pod adresem takim jak monitor.example.com i uzyskać darmowy SSL, domena musi wskazywać na serwer. W panelu zarządzania DNS (u rejestratora lub hostingodawcy) utwórz rekord A:

Typ: A Nazwa: monitor (subdomena → monitor.example.com) lub @ (domena główna → example.com) Wartość: 203.0.113.10 ← IP Pana serwera TTL: 3600

Po kilku minutach (czasem do godziny) sprawdź, czy domena wskazuje na serwer:

dig +short monitor.example.com # powinien zwrócić Pana IP # lub, jeśli nie ma dig: getent hosts monitor.example.com
Certyfikat SSL (krok 06) jest wydawany wyłącznie dla domeny — dlatego DNS musi wskazywać na serwer przed wydaniem certyfikatu.

03. Wgraj pliki panelu

Autokonfiguracja utworzyła już katalog panelu /var/www/monitor i skonfigurowała witrynę Apache (DocumentRoot na katalog główny panelu, PHP-FPM, AllowOverride dla .htaccess). Nie trzeba osobno tworzyć katalogu ani vhosta — wystarczy wgrać pliki i ustawić uprawnienia.
Pliki panelu (archiwum dystrybucyjne) pobiera się po zakupie w panelu klienta my.arciveo.com„Pobrania”. Rozpakuj archiwum przed wgraniem na serwer.

Wgraj zawartość dystrybucji do /var/www/monitor (aby w środku znalazły się public/, assets/, config.php itd.) — przez SFTP/SCP (FileZilla / WinSCP) lub poleceniem scp z komputera lokalnego:

scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Aby w vhoście od razu zapisał się Pana domena (ServerName), przekazuje się ją do polecenia autokonfiguracji już w kroku 01: … | sudo bash -s -- monitor.example.com (lub podaje domenę w polu „Domena panelu” w panelu klienta). Jeśli domena nie została przekazana — panel odpowiada na dowolny host oraz po IP, a ServerName zapisze certbot przy wydawaniu SSL (krok 06); nie trzeba niczego przeinstalowywać.
Ustaw uprawnienia plików — to krok obowiązkowy. Jeśli wgrywano pliki jako root lub przez SFTP, należą one do root, a serwer WWW (www-data) nie będzie mógł ich odczytać — panel otworzy się pusty lub z błędem 403 (w logu: .htaccess unreadable / directory not executable). Poniższe polecenie to naprawia:
# Normalizujemy uprawnienia całego webroota: katalog utworzony przez root jest niedostępny # dla serwera WWW (www-data) — bez tego panel oddaje pustą stronę lub 403. cd /var/www/monitor # Katalogi robocze tworzymy PRZED chown — inaczej nowe katalogi pozostaną root:root # i przy chmod 750 serwer WWW (www-data) nie będzie mógł w nich zapisywać. sudo mkdir -p data/lynis data/logwatch tmp logs sudo chown -R www-data:www-data /var/www/monitor sudo find /var/www/monitor -type d -exec chmod 755 {} \; sudo find /var/www/monitor -type f -exec chmod 644 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 750 data tmp logs

Proszę otworzyć sobie wgrywanie plików przez SFTP. Po powyższym poleceniu wszystkie pliki należą do www-data, a FileZilla / WinSCP łączą się na własnym użytkowniku — wgrywanie zakończy się wtedy błędem SSH_FX_PERMISSION_DENIED (Permission denied). Proszę wybrać jeden z dwóch wariantów.

Wariant A — ACL tylko dla własnego użytkownika (zalecany). Prawo zapisu otrzymuje wyłącznie użytkownik; serwer WWW nadal nie może nadpisać kodu panelu:

sudo apt install -y acl # Prawo zapisu dla własnego użytkownika do całego katalogu panelu: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # Ta sama reguła domyślnie — dla plików i katalogów utworzonych później: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

Wariant B — przez grupę www-data. Prostszy, ale prawo zapisu do plików panelu dostaje również serwer WWW: przy podatności w PHP kod dałoby się podmienić. Kolejność poleceń ma znaczenie — config.php i katalogi robocze zamyka się na końcu:

sudo usermod -aG www-data deploy # Zapis dla grupy + setgid (bit 2): pliki wgrane przez SFTP pozostają # w grupie www-data — inaczej panel nie będzie mógł ich nadpisać. sudo find /var/www/monitor -type d -exec chmod 2775 {} \; sudo find /var/www/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 2750 /var/www/monitor/data /var/www/monitor/tmp /var/www/monitor/logs
Po wariancie B proszę połączyć się ponownie w FileZilli (Serwer → Rozłącz, następnie zalogować się na nowo) — nowa grupa działa dopiero przy nowym logowaniu, wcześniej uprawnień nadal nie będzie. Sprawdzenie: id deploy — na liście grup musi pojawić się www-data; ls -ld /var/www/monitor — uprawnienia drwxrwsr-x, litera s zamiast x oznacza, że setgid jest ustawiony.

04. Baza danych

Proszę utworzyć bazę i użytkownika, a następnie zaimportować schemat. Blok z bazą danych wkleja się do terminala w całości (sudo mysql loguje root przez gniazdo unix — hasło root nie jest potrzebne). monitor_db i monitor_user to nazwy przykładowe, można ustawić własne; proszę zapamiętać nazwę bazy, użytkownika i hasło — trzeba je będzie wpisać w config.php w następnym kroku:

# 1. Baza danych. Hasło ustawia się RAZ w DBPASS i jest podstawiane we wszystkich liniach. # Blok wkleja się do terminala W CAŁOŚCI; sudo mysql loguje root przez gniazdo unix # (hasło root nie jest potrzebne). NIE używaj interaktywnego `sudo mysql -u root -p` # z wklejaniem — przy wklejaniu linie SQL trafią do zapytania o hasło i przepadną. DBPASS='CHOOSE_A_PASSWORD' # ← zmień tylko tę linię sudo mysql <<SQL CREATE DATABASE IF NOT EXISTS monitor_db CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS 'monitor_user'@'localhost' IDENTIFIED BY '$DBPASS'; GRANT ALL ON monitor_db.* TO 'monitor_user'@'localhost'; FLUSH PRIVILEGES; SQL # Sprawdzenie (powinno pokazać monitor_db): mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;" # To samo hasło wpisz w config.php → DB_PASS.
Schematu nie trzeba importować — panel sam tworzy tabele i konto admin przy pierwszym wejściu w przeglądarce (z database/db.sql), jeśli baza jest pusta.
sudo dla serwera WWW automatyczna konfiguracja już ustawiła — moduły od razu widzą dane systemowe. Osobno konfigurować sudo trzeba tylko wtedy, gdy PHP działa pod niestandardowym użytkownikiem (nie www-data).

05. Konfiguracja config.php

config.php w katalogu głównym panelu (/var/www/monitor/config.php) to jedyny plik, który trzeba edytować ręcznie. Wszystkie ustawienia panelu są w nim zapisane jako stałe define(). Proszę otworzyć go w edytorze:

sudo nano /var/www/monitor/config.php

Proszę wstawić własne wartości w podświetlonych miejscach; resztę zostawić bez zmian:

// --- Baza danych (z kroku 04) --- define('DB_HOST', 'localhost'); // zostawić define('DB_NAME', 'db_name'); // co utworzono w kroku 04 define('DB_USER', 'user'); // co utworzono w kroku 04 define('DB_PASS', 'db_password'); // co ustawiono w kroku 04 define('DB_CHARSET', 'utf8mb4'); // zostawić // --- Aplikacja --- define('APP_URL', 'https://monitor.example.com'); // adres panelu, bez ukośnika na końcu define('TIMEZONE', 'Europe/Warsaw'); // Pana/Pani strefa czasowa // --- Czas sesji --- define('SESSION_LIFETIME', 28800); // bezczynność do ponownego logowania, s (28800 = 8 h)

Co zmienić:

  • DB_NAME, DB_USER, DB_PASS — dokładnie te same nazwa bazy, użytkownik i hasło, które ustawiono podczas tworzenia bazy w kroku 04 (jeśli pozostawiono przykłady — monitor_db / monitor_user). DB_HOST i DB_CHARSET proszę pozostawić.
  • APP_URL — pełny adres panelu z https://, bez ukośnika na końcu i bez www. Musi być zgodny z domeną, na której aktywuje się licencję (krok 07), inaczej klucz zostanie odrzucony.
  • TIMEZONE — Pana/Pani strefa czasowa (lista — timedatectl list-timezones). Wpływa tylko na to, jak panel wyświetla daty; na czas uruchamiania zadań cron nie wpływa (tam obowiązuje strefa systemowa).
  • SESSION_LIFETIME — po ilu sekundach bezczynności panel poprosi o ponowne logowanie (domyślnie 8 godzin). Np. 3600 = 1 godzina, 86400 = doba.
  • Blok logowania błędów (display_errors, log_errors, error_log) — proszę zostawić domyślnie.

Proszę zapisać plik (Ctrl+O, Enter, następnie Ctrl+X) i zrestartować PHP-FPM — inaczej z powodu OPcache zmiany nie zostaną zastosowane:

sudo systemctl restart php*-fpm
config.php to plik tajny (zawiera hasło bazy danych). Znajduje się w katalogu głównym panelu, który jest zarazem katalogiem głównym witryny, ale jest zabezpieczony: prawa 640 (ustawione w kroku 03) i jawny zakaz w głównym .htaccess. Proszę nie publikować go w publicznych repozytoriach ani nie przesyłać do wsparcia z prawdziwym hasłem.
Szczegółowe omówienie wszystkich parametrów — w FAQ: „Plik config.php — wszystkie ustawienia panelu”.

06. Wystaw certyfikat SSL (HTTPS)

Panel działa wyłącznie po HTTPS. Sesja logowania korzysta z zabezpieczonego pliku cookie, a WebAuthn (2FA) zgodnie ze standardem działa tylko po HTTPS. Po http:// nie uda się Panu zalogować.

certbot oraz wtyczka dla Apache są już zainstalowane przez autokonfigurację. DNS domeny powinien już wskazywać na serwer (krok 02). Wystawienie jedną komendą:

sudo certbot --apache -d monitor.example.com
O co zapyta certbot:
  1. Enter email address — Pana e-mail (tam przyjdą powiadomienia o wygaśnięciu certyfikatu).
  2. Terms of Service … (Y)es/(N)oY.
  3. Share email with the EFF … (Y)es/(N)o — według uznania.
Dalej certbot sam wystawi certyfikat, wpisze <VirtualHost *:443>, skonfiguruje przekierowanie http→https i automatyczne odnawianie. Na końcu — Successfully enabled HTTPS.
Jeśli wystawienie się nie powiedzie — proszę sprawdzić, czy dig +short monitor.example.com zwraca IP serwera i czy porty 80/443 są otwarte (sudo ufw allow 80,443/tcp).

Po wystawieniu: https://monitor.example.com otwiera się z kłódką, a http:// przekierowuje na https://.

07. Logowanie i konfiguracja początkowa

Proszę otworzyć https://monitor.example.com, zalogować się jako admin / useradmin i przejść przez listę kontrolną:

  1. Zmienić hasło admin — sekcja „Użytkownicy” w menu.
  2. Włączyć WebAuthn (2FA) — „Klucze WebAuthn” → zarejestrować klucz/passkey (wymaga HTTPS). Proszę od razu zarejestrować dwa: w razie utraty jedynego klucza logowanie za jego pomocą będzie niemożliwe. Więcej.
  3. Ograniczyć dostęp według IP — „Ustawienia” → „Ograniczenie dostępu według IP” (proszę wpisać swój IP przed włączeniem, inaczej zablokuje Pan sobie dostęp).
  4. Wprowadzić licencję — kod aktywacyjny ARCIVEO-… z panelu klienta proszę aktywować na swoją domenę i wkleić klucz w „Ustawienia” → „Licencja”. Więcej.
  5. Skonfigurować powiadomienia — Telegram i/lub Email w „Ustawieniach”. Więcej.
  6. Usunąć instalator public/start_db.php, jeśli pozostał: pozwala on bez autoryzacji odtworzyć bazę. Dopóki plik znajduje się w katalogu głównym panelu lub w public/, panel ostrzega o nim czerwonym banerem.
Gotowe. Narzędzia bezpieczeństwa już działają — pulpit od razu pokaże ich status i Ocenę bezpieczeństwa. Informacje o każdym narzędziu znajdują się w FAQ.
Arcivéo - Security Monitor © 2026