Ručná inštalácia

Úplne manuálna inštalácia: od práve zakúpeného VPS až po funkčný dashboard, krok za krokom. Príprava servera, vytvorenie webu, databáza, config.php a SSL sú popísané tu. Príkazy pre jednotlivé bezpečnostné nástroje a cron nájdete v príručke FAQ, odkazy sú priebežne.

Hlavné pravidlo: pri zmene SSH alebo firewallu nezatvárajte aktuálne pripojenie, kým si nové neoveríte v samostatnom okne. Ak sa prístup predsa len stratí — takmer všetci hostingoví poskytovatelia ponúkajú núdzovú konzolu (VNC/Recovery) v ovládacom paneli.

01. Kúpili ste VPS s Ubuntu/Debian — kde začať

Po nákupe vám hoster pošle: IP adresu, meno používateľa (zvyčajne root) a heslo (alebo SSH kľúč). To na prihlásenie stačí. Postup (každý krok je sekcia nižšie):

  1. Pripojiť sa k serveru cez SSH;
  2. Aktualizovať systém, nastaviť názov hostiteľa a časové pásmo;
  3. Vytvoriť bežného používateľa s právami sudo (nepracovať pod root);
  4. Nastaviť prihlásenie cez SSH kľúč a vypnúť prihlásenie heslom;
  5. Zapnúť firewall a autoochranu;
  6. (voliteľné) nainštalovať ovládací panel HestiaCP — webový server, databáza a pošta „hneď po inštalácii“.

02. Prvé pripojenie cez SSH

SSH je zabezpečený terminál k serveru. Namiesto 203.0.113.10 zadajte vlastnú IP adresu.

203.0.113.10 je príklad, neexistujúca adresa (vyhradená pre dokumentáciu). Nezadávajte ju tak, ako je — nahraďte ju skutočnou IP adresou vášho servera z e-mailu od poskytovateľa hostingu. Inak sa pripojenie nepodarí.

Windows 10/11: otvorte PowerShell alebo „Terminál“ a použite zabudovaný ssh (prípadne klientov PuTTY / MobaXterm).
macOS / Linux: otvorte „Terminál“.

# Prihlásenie ako root (heslo prišlo od poskytovateľa hostingu): ssh root@203.0.113.10 # Ak poskytovateľ hostingu dal súbor s kľúčom namiesto hesla: ssh -i cesta/ku/kľúču root@203.0.113.10
Pri prvom pripojení sa SSH opýta na „authenticity of host“ — zadajte yes. Heslo sa počas zadávania nezobrazuje (to je normálne). Ak vám poskytovateľ hostingu dal dočasné heslo, zmeňte ho príkazom passwd.

03. Aktualizácia systému a základné nastavenie

V prvom rade aktualizujte všetky balíky a nastavte názov hostiteľa a časové pásmo.

# Aktualizácia systému: apt update && apt upgrade -y # Základné nástroje: apt install -y curl wget ufw fail2ban unattended-upgrades # Časové pásmo (príklad) a názov hostiteľa: timedatectl set-timezone Europe/Bratislava hostnamectl set-hostname myserver # Automatické bezpečnostné aktualizácie: dpkg-reconfigure -plow unattended-upgrades
Zoznam časových pásiem — timedatectl list-timezones. Ak sa na konci aktualizácie objaví modré okno „Daemons using outdated libraries“ — označte všetky služby (medzerník) a stlačte OK, je to bezpečné.

04. Vytvorenie používateľa s právami sudo

Neustále pracovať pod účtom root je nebezpečné. Vytvorte si bežného používateľa a udeľte mu práva sudo (spúšťanie príkazov ako správca podľa potreby). Nahraďte deploy ľubovoľným menom.

# Vytvoriť používateľa (nastaví heslo a spýta sa na údaje — možno preskočiť Enterom): adduser deploy # Pridať do skupiny sudo: usermod -aG sudo deploy # Overiť (pod root): su - deploy sudo whoami # malo by vypísať: root exit
Ďalej sa na server prihlasujte už pod týmto používateľom: ssh deploy@203.0.113.10, a príkazy správcu spúšťajte s predponou sudo.

05. SSH kľúče a vypnutie prihlásenia heslom

Prihlásenie kľúčom je bezpečnejšie než heslom: heslo sa dá uhádnuť, kľúč prakticky nie. Najprv vytvoríme kľúč na svojom počítači, skopírujeme ho na server, overíme prihlásenie – a až potom vypneme heslo.

Krok 1. Vytvorte kľúč na svojom počítači (Windows PowerShell / macOS / Linux):

ssh-keygen -t ed25519 -C "my-laptop" # Enter na všetky otázky (kľúč sa uloží do ~/.ssh/id_ed25519)

Krok 2. Skopírujte verejný kľúč na server:

# macOS / Linux: ssh-copy-id deploy@203.0.113.10 # Windows (PowerShell): type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Krok 3. Overte prihlásenie kľúčom v novom okne – malo by vpustiť bez hesla:

ssh deploy@203.0.113.10
Nevykonávajte Variant B, kým prihlásenie kľúčom neoveríte a nefunguje (Kroky 1–3), a nezatvárajte pracovnú reláciu. Vypne prihlásenie heslom pre všetkých používateľov vrátane root. Bez funkčného kľúča úplne stratíte prístup k serveru — vrátiť ho pôjde len cez konzolu hostingu. Nemáte kľúč — zvoľte Variant A.

Krok 4. Sprísniť prístup cez SSH. Nastavenia ukladáme do samostatného súboru, hlavný konfig nemeníme. Vyberte variant podľa situácie:

Variant A — len zakázať root, heslo ponechať. Kľúč nie je nutný, o prístup neprídete:

echo 'PermitRootLogin no' | sudo tee /etc/ssh/sshd_config.d/00-hardening.conf >/dev/null sudo systemctl restart ssh

Variant B — plný hardening. Vypnúť prihlásenie heslom a root ponechať len cez kľúč. Vykonávajte len po overení, že prihlásenie kľúčom funguje:

sudo tee /etc/ssh/sshd_config.d/00-hardening.conf >/dev/null <<'EOF' PubkeyAuthentication yes PasswordAuthentication no PermitRootLogin prohibit-password KbdInteractiveAuthentication no EOF sudo systemctl restart ssh
V oboch variantoch je root cez heslo zakázaný. PermitRootLogin no zakazuje root úplne, prohibit-password — ponecháva prihlásenie len cez kľúč (na administráciu sa prihlasujte ako deploy a používajte sudo). Ak chcete zmeniť SSH port — pridajte riadok Port 2222, ale najprv otvorte nový port vo firewalle (nasledujúca sekcia) a overte prihlásenie, inak si zablokujete prístup.

06. Základný firewall a automatická ochrana

Zablokujte firewallom všetko nepotrebné a zapnite fail2ban (banuje hádanie hesiel cez SSH). Najprv povoľte SSH, inak po zapnutí UFW stratíte prístup.

# Povoliť SSH (alebo váš port, ak ste ho menili) a web: sudo ufw allow OpenSSH sudo ufw allow 80,443/tcp # Zapnúť firewall: sudo ufw enable sudo ufw status verbose # fail2ban — ochrana SSH pred hádaním hesiel (základný profil je aktívny hneď): sudo systemctl enable --now fail2ban sudo fail2ban-client status sshd
Toto je minimum. Prevádzkové nastavenia fail2ban, blok-list ipsum, rozšírený UFW a ostatné nástroje nájdete v skupine „Bezpečnostné nástroje“ príručky. Samotný panel Arcivéo Monitor prehľadne zobrazí stav toho všetkého.

07. Inštalácia panela HestiaCP (voliteľné)

HestiaCP — bezplatný panel na správu hostingu: nainštaluje a nastaví webový server (nginx + apache), PHP, databázu (MariaDB), poštu, DNS a SSL certifikáty, poskytuje webové rozhranie pre stránky. Praktický, ak nechcete všetko nastavovať ručne a plánujete hostovať stránky (vrátane samotného panela Arcivéo Monitor).

HestiaCP inštalujte na čistý server (čerstvá podporovaná Ubuntu/Debian, minimálne ~1–2 GB RAM), pred inštaláciou iných webových serverov a databáz — inak nastanú konflikty. Inštalácia trvá 10–20 minút a reštartuje server.
# Stiahnuť inštalátor a spustiť: wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh sudo bash hst-install.sh

Inštalátor sa spýta na email a názov hostiteľa, potom nainštaluje celý stack. Po reštarte je panel dostupný na adrese https://YOUR_IP:8083 (login a heslo zobrazí inštalátor na konci).

HestiaCP sám spravuje UFW a fail2ban — netreba ich nastavovať zvlášť, prevezme ich. SSH kľúče a vypnutie hesla (predchádzajúca časť) aj tak urobte.

08. Systémové požiadavky a ionCube

Panel je PHP aplikácia na bežnom LAMP/LEMP zásobníku:

  • OS: Linux (odporúčame Ubuntu/Debian);
  • Webový server: nginx alebo Apache s PHP-FPM;
  • PHP 8.0+ s rozšíreniami: pdo_mysql, openssl, curl, json, mbstring;
  • ionCube Loader — rozšírenie PHP potrebné na chod panela;
  • DB: MySQL 5.7+ alebo MariaDB 10.3+;
  • HTTPS — povinné (prihlásenie a WebAuthn fungujú len cez https);
  • sudo pre používateľa webového servera (úzka množina — krok 13).
# Overiť verziu PHP a rozšírenia: php -v php -m | grep -iE 'pdo_mysql|openssl|curl|mbstring|ioncube'

Inštalácia ionCube Loader (ak ešte nie je nainštalovaný). Na hostingu s panelom (HestiaCP, cPanel) sa ionCube zapína zaškrtnutím v nastaveniach PHP. Manuálne na Ubuntu/Debian:

# Zistiť verziu PHP a adresár rozšírení: php -v EXTDIR=$(php -r 'echo ini_get("extension_dir");'); PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;') # Stiahnuť a rozbaliť loadery (64-bit): cd /tmp wget -q https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz tar xzf ioncube_loaders_lin_x86-64.tar.gz # Skopírovať loader pre vašu verziu PHP do adresára rozšírení: sudo cp ioncube/ioncube_loader_lin_${PHPVER}.so "$EXTDIR"/ # Pripojiť (CLI + PHP-FPM) a reštartovať: echo "zend_extension=ioncube_loader_lin_${PHPVER}.so" | sudo tee /etc/php/${PHPVER}/mods-available/ioncube.ini sudo phpenmod ioncube sudo systemctl restart php${PHPVER}-fpm # Kontrola — vo výstupe sa objaví riadok "with the ionCube PHP Loader": php -v
Verzia loadera sa musí zhodovať s verziou PHP (napríklad ioncube_loader_lin_8.1.so pre PHP 8.1). Ak používate viac verzií PHP — pripojte loader pre každú z nich.

09. Doména a DNS

Ak chcete panel otvárať na adrese ako monitor.example.com a získať bezplatný SSL — potrebujete doménu smerujúcu na váš server. V paneli správy DNS vytvorte A-záznam:

Typ: A Názov: monitor (poddoména → monitor.example.com) alebo @ (koreň domény → example.com) Hodnota: 203.0.113.10 ← IP vášho servera TTL: 3600

Po niekoľkých minútach overte, že doména smeruje na server:

dig +short monitor.example.com # mal by vrátiť vašu IP # alebo, ak dig nie je k dispozícii: getent hosts monitor.example.com
SSL certifikát Let's Encrypt sa vydáva len na doménu — DNS musí smerovať na server pred vydaním certifikátu.

10. Vytvorenie stránky a nahranie súborov panela

Apache: DocumentRoot — na koreň panela, NIE na public/. Štýly (CSS/JS), sw.js, manifest.json sú v assets/ vedľa public/ a načítavajú sa z koreňa stránky. Koreňový .htaccess je front controller. Ak pri Apache nastavíte DocumentRoot na public/, panel sa otvorí bez štýlov. Pri čistom nginx je to naopak: koreňom je public/ a assets/ sa poskytujú samostatným pravidlom (pozri blok nginx nižšie).
Súbory panela (archív distribúcie) sa po nákupe sťahujú v účte my.arciveo.com„Stiahnutia“. Pred nahraním archív rozbaľte.

1) Vytvorte adresár panela a nahrajte doň obsah distribúcie (aby vnútri boli public/, assets/, config.php atď.):

sudo mkdir -p /var/www/monitor # potom nahrajte súbory distribúcie do /var/www/monitor (FileZilla / WinSCP / scp)

2) Nastavte webový server. Apache: DocumentRoot — na koreň panela (NIE na /public); AllowOverride All je povinný. Cesta k soketu PHP-FPM sa určí automaticky. Blok sa vkladá do terminálu celý:

PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-detekcia soketu PHP-FPM sudo tee /etc/apache2/sites-available/monitor.conf > /dev/null <<'EOF' <VirtualHost *:80> ServerName monitor.example.com DocumentRoot /var/www/monitor <Directory /var/www/monitor> AllowOverride All Require all granted </Directory> <FilesMatch \.php$> SetHandler "proxy:unix:__PHPSOCK__|fcgi://localhost" </FilesMatch> </VirtualHost> EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/apache2/sites-available/monitor.conf sudo a2dissite 000-default.conf sudo a2ensite monitor.conf sudo apache2ctl configtest sudo systemctl reload apache2

nginx: nginx nemá .htaccess, preto koreňom berieme public/ a assets/, sw.js, manifest.json (o úroveň vyššie) poskytujeme samostatným pravidlom:

PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-detekcia soketu PHP-FPM sudo tee /etc/nginx/sites-available/monitor.conf > /dev/null <<'EOF' server { listen 80; server_name monitor.example.com; root /var/www/monitor/public; index index.php; # assets, service worker a manifest sú o úroveň vyššie ako public/ location ~ ^/(assets/|sw\.js|manifest\.json) { root /var/www/monitor; } location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:__PHPSOCK__; } } EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/nginx/sites-available/monitor.conf sudo ln -s /etc/nginx/sites-available/monitor.conf /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx

Nahranie súborov — SFTP/SCP (FileZilla, WinSCP) alebo scp:

# Príklad cez scp z lokálneho počítača: scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Nastavte práva na súbory — je to povinný krok. Ak ste súbory nahrávali pod root alebo cez SFTP, patria používateľovi root a webový server (www-data) ich nedokáže prečítať — panel sa otvorí prázdny alebo s chybou 403 (v logu: .htaccess unreadable / directory not executable). Príkaz nižšie to opraví:
# Normalizujeme práva celého webrootu: adresár vytvorený pod root je pre # webový server (www-data) neprístupný — bez toho panel vracia prázdnu stránku alebo 403. # Apache beží pod www-data; ak máte iného webového používateľa, nahraďte ho. cd /var/www/monitor # Pracovné priečinky vytvárame PRED chown — inak nové adresáre zostanú root:root # a pri chmod 750 do nich webový server (www-data) nebude môcť zapisovať. 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

3) Sprístupnite si nahrávanie súborov cez SFTP. Po príkaze vyššie patria všetky súbory používateľovi www-data, kým FileZilla / WinSCP sa pripájajú pod vaším vlastným používateľom — nahrávanie potom zlyhá s SSH_FX_PERMISSION_DENIED (Permission denied). Prihlásiť sa kvôli nahrávaniu ako root nie je možné — prihlásenie root bolo vypnuté v kroku 05. Vyberte jednu z dvoch variantov.

Variant A — ACL len pre vášho používateľa (odporúčané). Právo zápisu získate iba vy; webový server stále nemôže prepísať kód panela:

sudo apt install -y acl # Právo zápisu pre vášho používateľa na celý adresár panela: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # To isté pravidlo ako predvolené — pre súbory a priečinky vytvorené neskôr: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

Variant B — cez skupinu www-data. Jednoduchší, ale právo zápisu k súborom panela získa aj webový server: pri zraniteľnosti v PHP by sa kód dal vymeniť. Na poradí príkazov záleží — config.php a pracovné priečinky sa uzatvárajú ako posledné:

sudo usermod -aG www-data deploy # Zápis pre skupinu + setgid (bit 2): súbory nahrané cez SFTP zostávajú # v skupine www-data — inak ich panel nedokáže prepísať. 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 variante B sa vo FileZille pripojte nanovo (Server → Odpojiť, potom sa znova prihláste) — nová skupina sa prejaví až pri novom prihlásení, dovtedy oprávnenia stále mať nebudete. Kontrola: id deploy — v zozname skupín sa musí objaviť www-data; ls -ld /var/www/monitor — práva drwxrwsr-x, písmeno s namiesto x znamená, že setgid je nastavený.

11. Databáza

Vytvorte databázu a používateľa, potom naimportujte schému. Blok sa do terminálu vkladá celý. monitor_db a monitor_user sú príkladové názvy, môžete zadať vlastné; zapamätajte si názov databázy, používateľa a heslo — zapíšete ich do config.php v ďalšom kroku:

# 1. Databáza. Heslo sa zadáva RAZ v DBPASS a dosadí sa do všetkých riadkov. # Blok sa do terminálu vkladá CELÝ; sudo mysql prihlási root cez unix-socket # (heslo root netreba). NEPOUŽÍVAJTE interaktívny `sudo mysql -u root -p` # s kopírovaním — pri vložení SQL riadky pôjdu do výzvy na heslo a stratia sa. DBPASS='CHOOSE_A_PASSWORD' # ← zmeňte len tento riadok 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 # Kontrola (má zobraziť monitor_db): mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;" # To isté heslo zapíšte do config.php → DB_PASS.
Schému nie je nutné importovať — panel si tabuľky a účet admin vytvorí sám pri prvom otvorení v prehliadači (z database/db.sql), ak je databáza prázdna. Ručný import schémy je potrebný len vtedy, ak automatická inicializácia nezabrala.
Ak ste použili inštalátor v prehliadači public/start_db.phpzmažte ho hneď po inštalácii: umožňuje bez prihlásenia znovu vytvoriť databázu. Kým súbor leží v koreni panela alebo v public/, panel zobrazuje červené upozornenie.

12. Nastavenie config.php

config.php v koreňovom priečinku panela (/var/www/monitor/config.php) je jediný súbor, ktorý treba upraviť ručne. Všetky nastavenia panela sú v ňom zadané konštantami define(). Otvorte ho v editore:

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

Do zvýraznených miest doplňte svoje hodnoty; zvyšok nechajte tak, ako je:

// --- Databáza (z kroku 11) --- define('DB_HOST', 'localhost'); // nechať define('DB_NAME', 'db_name'); // čo ste vytvorili v kroku 11 define('DB_USER', 'user'); // čo ste vytvorili v kroku 11 define('DB_PASS', 'db_password'); // čo ste zadali v kroku 11 define('DB_CHARSET', 'utf8mb4'); // nechať // --- Aplikácia --- define('APP_URL', 'https://monitor.example.com'); // adresa panela, bez lomky na konci define('TIMEZONE', 'Europe/Bratislava'); // vaše časové pásmo // --- Trvanie relácie --- define('SESSION_LIFETIME', 28800); // nečinnosť do opätovného prihlásenia, s (28800 = 8 h)

Čo meniť:

  • DB_NAME, DB_USER, DB_PASS — presne tie isté meno databázy, používateľ a heslo, ktoré ste zadali pri vytváraní databázy v kroku 11 (ak ste nechali príklady — monitor_db / monitor_user). DB_HOST a DB_CHARSET nemeňte.
  • APP_URL — úplná adresa panela s https://, bez lomky na konci a bez www. Musí sa zhodovať s doménou, na ktorú aktivujete licenciu (krok 16), inak bude kľúč odmietnutý.
  • TIMEZONE — vaše časové pásmo (zoznam — timedatectl list-timezones). Ovplyvňuje len to, ako panel zobrazuje dátumy; čas spúšťania cron úloh neovplyvňuje (tam platí pásmo systému).
  • SESSION_LIFETIME — po koľkých sekundách nečinnosti panel vyžiada opätovné prihlásenie (predvolene 8 hodín). Napr. 3600 = 1 hodina, 86400 = deň.
  • Blok logovania chýb (display_errors, log_errors, error_log) — nechajte predvolený.

Uložte súbor (Ctrl+O, Enter, potom Ctrl+X) a reštartujte PHP-FPM — inak sa kvôli OPcache zmeny neprejavia:

sudo systemctl restart php*-fpm
config.php je tajný súbor (obsahuje heslo k databáze). Leží v koreňovom priečinku panela, ktorý je zároveň webovým koreňom, no je chránený: práva 640 (nastavené v kroku 10) a výslovný zákaz v koreňovom .htaccess. Nezverejňujte ho vo verejných repozitároch a neposielajte podpore so skutočným heslom.
Podrobný rozbor všetkých parametrov nájdete v FAQ: „Súbor config.php — všetky nastavenia panela“.

13. Nastavenie sudo pre webový server

PHP beží pod používateľom webového servera, ktorý nemá práva na systémové príkazy. Prístup sa udeľuje úzko: cielené sudo na konkrétne nástroje a čítanie logov cez skupiny (bez sudo). Prelomenie webovej vrstvy nedá root.

V príkladoch je www-data štandardný používateľ Apache. Ak máte iného (v niektorých paneloch beží PHP pod samostatným používateľom) — nahraďte ho všade. Zistíte to príkazom: ps -o user= -C php-fpm | sort -u.

1. Vytvorte /etc/sudoers.d/monitor príkazom sudo visudo -f /etc/sudoers.d/monitor a vložte (riadky nepoužívaných modulov odstráňte):

# UFW — stav a pravidlá (stránka „Firewall“) www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw status, /usr/sbin/ufw status verbose, /usr/sbin/ufw status numbered www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw allow [0-9]*, /usr/sbin/ufw deny [0-9]*, /usr/sbin/ufw --force delete [0-9]* # Fail2ban — stav, ban a unban (banned vráti bany všetkých jailov jedným príkazom; # ban/unban potrebujú tlačidlá panela) www-data ALL=(ALL) NOPASSWD: /usr/bin/fail2ban-client status, /usr/bin/fail2ban-client status *, /usr/bin/fail2ban-client banned, /usr/bin/fail2ban-client set * banip *, /usr/bin/fail2ban-client set * unbanip * # Bezpečnostné aktualizácie (karta „Aktualizácie“). Len na čítanie, ale práve od roota: # apt cache (~70 MB) je dostupný len rootovi, non-root ho pri každom volaní prestavuje # (4.2 s CPU oproti 0.01 s). Bez wildcard — presne tento jeden príkaz, nič neinštaluje. www-data ALL=(ALL) NOPASSWD: /usr/bin/apt list --upgradable # IPset (mapa útokov, dashboard) www-data ALL=(ALL) NOPASSWD: /usr/sbin/ipset list -t ipsum # CrowdSec www-data ALL=(ALL) NOPASSWD: /usr/bin/cscli decisions list *, /usr/bin/cscli alerts list *, /usr/bin/cscli bouncers list *, /usr/bin/cscli scenarios list * # Auditd — vyhľadávanie udalostí + čítanie posledných riadkov denníka (presná cesta) www-data ALL=(ALL) NOPASSWD: /usr/sbin/ausearch -m * www-data ALL=(ALL) NOPASSWD: /usr/bin/tail -n 300 /var/log/audit/audit.log # Monit / ModSecurity / AppArmor / PSAD www-data ALL=(ALL) NOPASSWD: /usr/bin/monit status www-data ALL=(ALL) NOPASSWD: /usr/sbin/apache2ctl -M www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-modsec www-data ALL=(ALL) NOPASSWD: /usr/sbin/aa-status www-data ALL=(ALL) NOPASSWD: /usr/sbin/psad --Status # Otvorené porty (denníky jadra/SSH/Falco sa čítajú BEZ sudo — cez skupinu # systemd-journal, pozri bod 2; sudo pre journalctl NIE je potrebné a je nebezpečné) www-data ALL=(ALL) NOPASSWD: /usr/bin/ss -tuln, /usr/sbin/ss -tuln, /bin/ss -tuln # PostgreSQL (len ak ho používate) — pevný read-only skript, # vytvorte podľa FAQ „PostgreSQL sa nezobrazuje“; bez neho riadok odstráňte www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
sudo chmod 440 /etc/sudoers.d/monitor sudo visudo -c # malo by byť "parsed OK"

2. Prístup k logom a denníku systemd. Moduly čítajú /var/log/fail2ban.log, auth.log, ufw.log, apache2/*, aide priamo (na Debian/Ubuntu sú tieto logy v skupine adm). Udalosti jadra, SSH a Falco sa berú z journald príkazom journalctl bez sudo, cez skupinu systemd-journal. Pridajte webového používateľa do oboch skupín a reštartujte PHP-FPM:

sudo usermod -aG adm,systemd-journal www-data sudo systemctl restart php*-fpm # povinné, inak sa skupiny neuplatnia

3. Ak ClamAV alebo Suricata zapisujú logy mimo skupiny adm (býva root:root) — udeľte prístup cez ACL:

sudo apt install acl sudo setfacl -R -m u:www-data:rX /var/log/clamav /var/log/suricata 2>/dev/null sudo setfacl -d -m u:www-data:rX /var/log/clamav /var/log/suricata 2>/dev/null

4. Obal ModSecurity. Audit log WAF (/var/log/apache2/modsec_audit.log) patrí rootovi s právami 640, webový používateľ ho priamo čítať nemôže. Stránka ModSecurity berie režim enginu, udalosti a zoznam aktívnych pravidiel cez pevný read-only skript — práve ten je povolený v sudoers riadkom vyššie:

sudo tee /usr/local/bin/monitor-modsec >/dev/null <<'EOF' #!/bin/sh echo "ENGINE=$(grep -hE '^SecRuleEngine[[:space:]]+' /etc/modsecurity/*.conf 2>/dev/null | tail -1 | awk '{print $2}')" echo "---LOG---" tail -n 3000 /var/log/apache2/modsec_audit.log 2>/dev/null echo "---RULES---" for f in /etc/modsecurity/crs/rules/*.conf /usr/share/modsecurity-crs/rules/*.conf /etc/modsecurity/custom-rules.conf; do [ -f "$f" ] && { echo "===FILE:$(basename "$f")==="; cat "$f"; } done EOF sudo chown root:root /usr/local/bin/monitor-modsec sudo chmod 755 /usr/local/bin/monitor-modsec
Bez súboru /etc/modsecurity/modsecurity.conf samotný WAF nefunguje: balík vloží len modsecurity.conf-recommended a engine pravidiel zostáva vypnutý — ako ho zapnúť, pozri FAQ → „Inštalácia ModSecurity“.
Používateľ vo všetkých riadkoch sudoers sa musí zhodovať s používateľom FPM poolu: na bežnom Apache/Debian je to www-data, v HestiaCP beží pool stránky pod vlastníkom stránky (napríklad admin) — overte grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.

5. Ak je pred Apache Nginx (HestiaCP, ISPmanager a ďalšie panely — tam Nginx proxuje PHP do Apache a statiku vydáva sám). Služobné adresáre sú uzavreté súbormi .htaccess, ale Nginx ich nečíta: každý statický súbor (.json, .txt, .log, .dat) vydá priamo, mimo Apache. Von uniknú cache panela a dáta — napríklad tmp/modsec_cache.json s udalosťami WAF a IP adresami útočníkov. Pridajte zákaz do konfigurácie stránky Nginx:

location ^~ /data/ { deny all; } location ^~ /tmp/ { deny all; } location ^~ /logs/ { deny all; } location ^~ /includes/ { deny all; } location ^~ /cron/ { deny all; } location ^~ /database/ { deny all; } location = /config.php { deny all; }
Prefix ^~ je povinný: vyberie sa skôr než regulárne pravidlo pre statiku vnútri location /, inak zákaz nezaberie.
V HestiaCP to vložte ako samostatný súbor /home/<user>/conf/web/<domain>/nginx.ssl.conf_deny (a nginx.conf_deny pre HTTP) — konfigurácia stránky pripája nginx.ssl.conf_* a pri prestavbe takéto súbory neprepíše. Použite: sudo nginx -t && sudo systemctl reload nginx.
Overenie: curl -s -o /dev/null -w '%{http_code}\n' https://monitor.example.com/tmp/modsec_cache.json — malo by byť 403. Ak Apache beží bez Nginx (počúva 80/443 sám), netreba nič pridávať — .htaccess stačí.
Cesty k binárkam overte cez which (napríklad which ufw cscli ausearch ss). Sudoers upravujte len cez visudo. Zoznam všetkých databáz MySQL sa zapne samostatným GRANT (FAQ → „Viditeľná je len jedna DB“).

14. Obmedzenie prístupu podľa IP

Obmedzte prístup k monitoru podľa IP adresy — aj keď sa URL stane známou, prihlasovacia stránka sa neotvorí. Dá sa to na úrovni webového servera (príklad pre nginx nižšie) alebo priamo v paneli („Nastavenia“ → „Obmedzenie prístupu podľa IP“). Ak máte Apache, použite obmedzenie v paneli.

Ak je web nginx už nastavený podľa kroku 10, nepridávajte druhý location / — vpíšte riadky allow/deny do už existujúceho bloku. Dva rovnaké location / v jednom server { } sú chybou konfigurácie, nginx sa nereštartuje.
# V konfigurácii nginx (vnútri server { }): # ACME cestu Let's Encrypt necháme otvorenú mimo IP obmedzenia — # aby vydanie a automatické obnovenie SSL (krok 15) nezáviselo od IP filtra. location ^~ /.well-known/acme-challenge/ { allow all; } location / { allow 203.0.113.10; # ← vpíšte svoju IP allow 10.0.0.0/8; # lokálna sieť (ak treba) deny all; try_files $uri $uri/ /index.php?$query_string; } # Reštartovať nginx: sudo nginx -t && sudo systemctl reload nginx

15. Vydanie SSL (HTTPS)

Dashboard funguje len cez HTTPS. Prihlasovacia relácia používa zabezpečené cookie a WebAuthn (2FA) funguje iba cez HTTPS. Cez http:// sa prihlásiť nedá.

Certifikát je zadarmo (Let's Encrypt). DNS domény už musí smerovať na server. Príkaz závisí od webového servera:

# Apache: sudo certbot --apache -d monitor.example.com # nginx — LEN ak máte naozaj nginx. Na Apache NESPÚŠŤAJTE: # apt stiahne nginx a obsadí port 80, konflikt s Apache. # sudo apt install python3-certbot-nginx # sudo certbot --nginx -d monitor.example.com # certbot sám zapíše HTTPS do konfigurácie a nastaví automatické obnovenie
Na čo sa certbot spýta: e-mail → súhlas s Terms (Y) → odovzdanie e-mailu do EFF (podľa vášho uváženia). Potom sám vydá certifikát, zapíše <VirtualHost *:443>, nastaví presmerovanie http→https a automatické obnovenie.
DNS musí smerovať na server PRED spustením certbot (overenie vlastníctva cez port 80). Kontrola: dig +short monitor.example.com → IP servera. Porty 80/443 sú otvorené: sudo ufw allow 80,443/tcp.

Po vydaní: https://monitor.example.com sa otvára so zámkom, http:// presmeruje na https:// (APP_URL v config.php je už nastavený v kroku 12).

16. Prihlásenie a prvotné nastavenie

Otvorte https://monitor.example.com, prihláste sa cez admin / useradmin a prejdite kontrolný zoznam:

  1. Zmeňte heslo admin — sekcia „Používatelia“ v menu.
  2. Zapnite WebAuthn (2FA) — „Kľúče WebAuthn“ → zaregistrujte kľúč/passkey (vyžaduje HTTPS). Zaregistrujte hneď dva: pri strate jediného kľúča ním nebude možné sa prihlásiť. Viac.
  3. Obmedzte prístup podľa IP — „Nastavenia“ → „Obmedzenie prístupu podľa IP“ (pred zapnutím zadajte svoju IP adresu, inak si zablokujete prístup).
  4. Zadajte licenciu — kód ARCIVEO-… z účtu aktivujte na svoju doménu a vložte kľúč do „Nastavenia“ → „Licencia“. Viac.
  5. Nastavte upozornenia — Telegram a/alebo Email v „Nastaveniach“. Viac.
  6. Odstráňte inštalátor public/start_db.php, ak ostal (krok 11).

17. Bezpečnostné nástroje (voliteľné)

Panel už funguje. Nástroje sa inštalujú podľa potreby — nainštalujete, čo potrebujete, a panel hneď zobrazí stav. Príkazy na inštaláciu každého z nich nájdete v príručke (samostatné sekcie k nástrojom):

18. Cron a údržba

Nastavuje sa raz, tiež voliteľne, no odporúča sa. Podrobné príkazy nájdete v príručke:

  1. Úlohy cron (správy, aktualizácia zoznamov, kontroly);
  2. Zálohovanie;
  3. Aktualizácia a prenos panela;
  4. Obnovenie prístupu — pre prípad straty kľúča/hesla.
Niečo nefunguje alebo zobrazuje „žiadne údaje“? Pozrite si skupinu „Diagnostika“ v príručke.
Arcivéo - Security Monitor © 2026