SysAdmin наръчник
Практически курс · 68 теми

Linux & Hosting SysAdmin наръчник

От „сайтът не работи“ до мониторинг с Grafana. Мисли по слоеве, измервай, не гадай. Всички команди могат да се копират с едно кликване.

1SysAdmin mindset

„Сайтът ми не работи.“ Не започваш с:

systemctl restart nginx

Първо мислиш по слоеве и проверяваш слой по слой:

DNS
 ↓
IP
 ↓
Routing
 ↓
Firewall
 ↓
Port 80/443
 ↓
Nginx/Apache
 ↓
PHP-FPM/Application
 ↓
Database
 ↓
Disk/RAM/CPU
 ↓
Logs

Пример

DNS наред ли е?

dig example.com

HTTP работи ли?

curl -I https://example.com

Има ли процес на 443?

ss -lntp | grep ':443'

Nginx жив ли е?

systemctl status nginx

Конфигурацията правилна ли е?

nginx -t

Какво казват логовете?

journalctl -u nginx -n 100
💡 Това е SysAdmin mindsetНе гадай. Провери.

2Как се четат Linux командите

Да вземем:

ls -lah
ЧастЗначение
lsкомандата
-lопция (подробен списък)
-aопция (и скритите файлове)
-hопция (human-readable размери)

Следователно ls -lah е комбинация от няколко опции. Много команди имат:

command --help
man command

Например:

man ls
ls --help
⚠️ Практическо правилоАко не знаеш какво прави -r или --delete, не го използвай на production сляпо.

3Работа с файлове и директории

Къде се намирам?

pwd
/root

Какво има тук?

ls
ls -lah
drwxr-xr-x  5 root root 4.0K Oct  4 10:20 .
drwxr-xr-x 20 root root 4.0K Oct  4 09:00 ..
-rw-r--r--  1 root root  12K Oct  4 10:15 config.txt

Смяна на директория

cd /var/log     # към директория
cd ..           # назад
cd ~            # home
cd -            # последната директория

Създаване

mkdir test       # директория
touch test.txt   # файл

Копиране

cp test.txt backup.txt
cp -r site site_backup    # директория

Преместване / преименуване

mv file.txt /tmp/
mv old.txt new.txt

Изтриване

rm file.txt
rm -r directory
rm -rf directory    # МНОГО ОПАСНО
⚠️ ВниманиеНикога не пускай rm -rf без да си сигурен какъв е пътят. Преди това:
pwd
ls -lah

4💾 Disk space — df

Една от най-важните команди в hosting.

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       100G   91G  9G   92% /

Колони: Size, Used, Avail, Use%, Mounted on.

Какво означава -h?

h = human-readable. Без него (df) виждаш 102400000. С df -h получаваш 100G, 91G, 9G — много по-удобно.

5🧬 Inodes — df -i

Много важно за hosting.

df -i
Filesystem      Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1      6553600 6550000   3600  100% /

Може да имаш 200 GB диск, 50 GB използвани, 150 GB свободни — и въпреки това да не можеш да създадеш файл. Защо? Защото inodes са свършили.

Какво е inode?

Грубо казано: inode е структура, която описва файл. Всеки файл използва inode. Ако имаш 10 милиона малки файла, inodes могат да свършат, въпреки че файловете заемат малко място.

Често причинители

6📦 du — кой изяжда диска?

du -sh /home/*
2.4G    /home/user1
85G     /home/user2
12G     /home/user3

Тук вече виждаш кой user изяжда диска.

Какво значи -sh?

Кои директории са най-големи?

du -xhd1 /home | sort -hr
90G     /home
60G     /home/customer1
20G     /home/customer2
8G      /home/customer3

Целият root filesystem

du -xhd1 / | sort -hr | head -20
100G    /
70G     /var
20G     /home
5G      /usr
2G      /opt

Вече знаеш къде да копаеш.

7🔎 Намиране на големи файлове

Файлове над 1 GB:

find /home -xdev -type f -size +1G -ls

Друг вариант — най-големите 20:

find /home -xdev -type f -printf '%s %p\n' | sort -nr | head -20
8934212345 /home/user/public_html/backup.sql
4212345678 /home/user/logs/debug.log
2123456789 /home/user/backup.tar.gz

Защо това е важно? Стъпка по стъпка

df -h                      # / е 95%
du -xhd1 / | sort -hr      # /var = 70G
du -xhd1 /var | sort -hr   # /var/lib = 50G, /var/log = 15G
du -xhd1 /var/log | sort -hr

И така постепенно намираш виновника.

8🔍 find

Една от най-важните SysAdmin команди.

По име

find /home -name "config.php"
find /var/log -type f -name "*.log"

По тип

find /home -type f    # само файлове
find /home -type d    # само директории

По размер

find /home -type f -size +100M
find /home -type f -size +1G

По време

find /home -type f -mtime +30      # по-стари от 30 дни
find /var/log -type f -mmin -60    # променени през последните 60 минути

9🚫 2>/dev/null

Ще го срещаш постоянно. Linux има три стандартни потока:

№Поток
0stdin
1stdout
2stderr
find / -name "*.log"

може да даде:

find: '/proc/...': Permission denied
find: '/root/...': Permission denied

Това са грешки към stderr. Можеш да ги скриеш:

find / -name "*.log" 2>/dev/null

2> означава „пренасочи stderr“, а /dev/null — „изхвърли го“.

10🔀 Redirection

ЦелтаКоманда
stdout към файл (презаписва)ls -lah > output.txt
Добавяне към файлls -lah >> output.txt
Само errors във файлcommand 2> errors.txt
Скриване на errorscommand 2>/dev/null
stdout и stderr във файлcommand > output.txt 2>&1
Изхвърляне на всичкоcommand > /dev/null 2>&1

11📄 cat, less, head, tail

Целият файл

cat file.txt

Голям файл

less file.txt

В less: /ERROR търсене · n следващо съвпадение · q изход.

Начало и край

head -20 file.txt     # първите 20 реда
tail -50 file.txt     # последните 50

Live log

tail -f /var/log/nginx/error.log
🏆 Златно при debuggingСледи лога на живо, докато възпроизвеждаш проблема.

12🔎 grep

grep "ERROR" app.log          # търсене
grep -i "error" app.log       # case-insensitive
grep -n "timeout" app.log     # с номера на редовете
grep -r "listen" /etc/nginx/  # рекурсивно
grep -v "200" access.log      # всичко БЕЗ даден текст

13🔗 Pipes |

Едно от най-важните неща в Linux.

command1 | command2

Резултатът от първата команда става вход за втората. Например:

ps aux | grep nginx
journalctl -u nginx | grep -i error
df -h | grep '/dev'

Така комбинираш малки инструменти.

14🔢 wc

wc = word count.

wc -l access.log    # редове
wc -w file.txt      # думи
wc -c file.txt      # bytes
125438 access.log

Значи: 125438 реда.

15🔤 sort

sort names.txt
sort -n numbers.txt     # числово
sort -r names.txt       # обратно
sort -nr numbers.txt    # числово обратно

16🔢 uniq

Ако имаме:

apple
apple
banana
banana
banana
orange

uniq дава apple banana orange, а uniq -c дава:

2 apple
3 banana
1 orange
Важноuniq брои само съседни еднакви редове. Затова често: sort | uniq -c

17✂️ cut

cut -d: -f1 /etc/passwd

18⭐ Класическа команда за top IP адреси

При access log:

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20

Да я разбием:

  1. awk '{print $1}' — взима първото поле (обикновено IP).
  2. sort — ги групира.
  3. uniq -c — ги брои.
  4. sort -nr — най-голямото число първо.
  5. head -20 — първите 20.
15000 203.0.113.10
9200  198.51.100.20
7100  192.0.2.50

19🧮 awk

Супер мощен за logs.

awk '{print $1}' access.log
awk '{print $1, $7, $9}' access.log

Зависи от конкретния log format.

Само 500 errors

awk '$9 >= 500 {print $0}' access.log

20📝 sed

sed -n '1,20p' file.txt        # диапазон от редове
sed -n '/ERROR/p' app.log      # търсене
sed 's/old/new/g' file.txt     # замяна (показва резултата)
sed -i 's/old/new/g' file.txt  # директна промяна на файла
⚠️ -i променя файлаНа production: първо backup → после промяна.

21⚙️ Процеси

ps aux                              # всички процеси
ps aux --sort=-%cpu | head -15      # най-много CPU
ps aux --sort=-%mem | head -15      # най-много RAM
top                                 # live информация
htop                                # ако е инсталиран
pgrep -a nginx                      # намери процес
pidof nginx

22🧠 RAM

free -h
              total        used        free
Mem:           32Gi        20Gi        2Gi
Swap:           4Gi         1Gi        3Gi
Не гледай само freeLinux използва RAM за cache. По-важни са: available, swap usage, memory pressure.

23🔥 CPU и Load

uptime
load average: 2.10, 1.80, 1.50

Това са средно натоварване за 1 минута, 5 минути, 15 минути. За CPU cores:

nproc

Ако имаш 8 cores и load 2 — всичко е наред. Load 20 е съвсем друга история.

24🌐 ip addr

ip addr
ip -br addr
1: lo:
    inet 127.0.0.1/8
2: eth0:
    inet 203.0.113.10/32
3: eth1:
    inet 10.10.3.20/16

lo

Loopback 127.0.0.1 — самият сървър към себе си.

eth0

Обикновено external/public interface. Може да има няколко IP адреса (.10, .11, .12).

eth1

Може да е private/internal мрежа: 10.x.x.x, 172.16.x.x, 192.168.x.x

Какво значи /32?

203.0.113.10/32 означава маска 255.255.255.255 — адресът е host route. В cloud/hosting среда това е напълно възможна конфигурация при routed networking.

Не мисли автоматично „/32 = няма network“. Гледаш routing table.

25🛣️ ip route

ip route
default via 203.0.113.1 dev eth0 src 203.0.113.10 metric 100
10.10.0.0/16 dev eth1 src 10.10.3.20 metric 101
ЧастЗначение
default via 203.0.113.1 dev eth0Ако нямаш по-специфичен маршрут, прати traffic през този gateway.
10.10.0.0/16 dev eth1Трафикът към 10.10.x.x отива през eth1 (private network).
src 203.0.113.10Предпочитан source IP.
metric 100При конкуриращи се маршрути помага за избора. По-ниска стойност = по-предпочитана.

26⭐ ip route get

Една от най-полезните networking команди:

ip route get 8.8.8.8
8.8.8.8 via 203.0.113.1 dev eth0 src 203.0.113.10

Вече знаеш кои gateway, interface и source IP ще бъдат използвани.

27🔌 ss

Основната команда за портове.

ss -tulnp
ФлагЗначение
-tTCP
-uUDP
-llistening
-nnumeric (без DNS resolution)
-pprocess

Тоест: покажи TCP/UDP listening портове, без DNS resolution, и кой процес ги използва.

ss -lntp                  # само TCP listening
ss -lntp | grep ':443'    # HTTPS
ss -lntp | grep ':80'     # HTTP
ss -lntp | grep ':22'     # SSH

28📡 ping

ping -c 4 1.1.1.1

Проверява ICMP connectivity.

Но…Ако ping не работи, това НЕ означава автоматично, че HTTP не работи. Firewall може да блокира ICMP. Затова curl често е по-полезен за web troubleshooting.

29🌍 curl

curl -I https://example.com        # headers
curl -v https://example.com        # verbose
curl -sS -o /dev/null -w '%{http_code}\n' https://example.com   # само status code
200

30DNS с dig

dig example.com
dig +short example.com       # само IP
dig @1.1.1.1 example.com     # друг DNS server

Последното е много полезно, ако подозираш DNS propagation/resolver проблем.

31🔐 SSH

ssh user@server
ssh -p 2222 user@server        # друг порт
ssh -v user@server             # debug
scp file.txt user@server:/tmp/ # файл към сървър

32🚚 rsync

rsync -avh ./site/ user@server:/var/www/site/

Много полезен за deployment и backups.

⚠️ Вниманиеrsync --delete може да изтрие destination файлове. Преди production deployment разбери точно какво ще се синхронизира.

33🧩 systemctl

systemctl status nginx      # провери service
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx
systemctl enable nginx      # autostart
systemctl disable nginx
systemctl --failed          # failed services

34📰 journalctl

journalctl -u nginx -n 100                  # последните 100 реда
journalctl -u nginx -f                      # live
journalctl -u nginx --since "1 hour ago"    # последния час
journalctl -p err..alert -b                 # errors от текущия boot

35🔐 Permissions

ls -l
-rwxr-xr--

Имаме owner, group, others и стойности: r = 4, w = 2, x = 1.

ЧислоПраваИзползване
644rw-r--r--Обикновен файл
755rwxr-xr-xДиректории и executable scripts
600rw-------Private/secret файлове
700rwx------Private directory/script

36chmod

chmod 644 file.txt
chmod 755 script.sh

37chown

chown user:group file.txt
chown -R user:group /var/www/site    # рекурсивно
⚠️ Много внимание с -RЕдна грешна команда върху /var, / или /home може да направи сериозен проблем.

38SELinux

getenforce
sestatus
ls -Z /var/www                    # context
ausearch -m AVC -ts recent        # SELinux denials

Режимът може да бъде Enforcing.

ВажноНе прави автоматично setenforce 0 само защото нещо не работи. Първо разбери какво точно блокира SELinux.

39📦 Package management

Debian / Ubuntu

apt update
apt install nginx
apt upgrade

RHEL / Rocky / Alma

dnf install nginx
dnf update
dnf search nginx

Първо виж OS:

cat /etc/os-release

40📦 tar

tar -czf backup.tar.gz /etc/nginx/   # създаване
tar -tzf backup.tar.gz               # проверка
tar -xzf backup.tar.gz               # разархивиране

41⏰ Cron

crontab -l    # покажи
crontab -e    # редакция

Пример:

0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Всеки ден в 02:00 изпълни backup script-а.

┌──────── минута (0-59)
│ ┌────── час (0-23)
│ │ ┌──── ден от месеца (1-31)
│ │ │ ┌── месец (1-12)
│ │ │ │ ┌ ден от седмицата (0-7)
│ │ │ │ │
0 2 * * *  команда

42🔍 lsof

lsof -i :443                       # кой държи порт 443?
lsof /var/log/nginx/error.log      # кой държи файл?
lsof +L1                           # deleted but still open files
Класически случай df -h → 100%, а du → не показва къде е мястото. Тогава lsof +L1 може да покаже:
nginx  1234 root  5w REG ... /var/log/big.log (deleted)
Процесът още държи файла отворен.

43🌐 Nginx

nginx -t                              # проверка на конфигурацията
systemctl status nginx
ss -lntp | grep ':443'                # порт
tail -f /var/log/nginx/error.log      # error log
tail -f /var/log/nginx/access.log     # access log

44🌐 Apache

systemctl status httpd      # RHEL-like
systemctl status apache2    # Debian/Ubuntu
apachectl configtest        # config test

45🐘 PHP-FPM

systemctl status php-fpm
systemctl status php8.2-fpm      # зависи от версията
ps aux | grep '[p]hp-fpm'        # процеси
ss -lx | grep php                # sockets

46🚨 502 Bad Gateway

Много често:

Nginx
   ↓
PHP-FPM

Nginx казва „502 Bad Gateway“. Проверяваш:

systemctl status php-fpm
ss -lx | grep php
tail -n 100 /var/log/nginx/error.log
journalctl -u php-fpm -n 100

Възможни причини

47🚨 504 Gateway Timeout

Proxy/gateway чака upstream, но не получава отговор навреме.

Nginx → PHP → Application → MySQL

Може да е:

tail -f /var/log/nginx/error.log

и после application/database logs.

48🗄️ MySQL / MariaDB

systemctl status mysql     # или mariadb
mysql -u root -p

Вътре в MySQL:

SHOW DATABASES;
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';

49🐳 Docker

docker ps                        # работещи container-и
docker ps -a                     # всички
docker images                    # images
docker logs container            # logs
docker logs -f container         # live logs
docker logs --tail 200 container # последните 200
docker inspect container
docker exec -it container sh     # влизане вътре
docker stats                     # resource usage
docker restart container

50🐳 Docker troubleshooting

Ако container не работи:

docker ps -a
docker logs --tail 200 container
docker inspect container
docker stats

В inspect гледаш: Exit code · Mounts · Environment · Network · Ports · Restart policy. А docker stats е за CPU/RAM.

51🐳 Docker Compose

docker compose ps               # services
docker compose logs             # logs
docker compose logs -f app      # конкретен service
docker compose up -d            # стартиране
docker compose restart app      # restart
docker compose down             # спиране

52📊 Grafana

Grafana е предимно visualization + dashboards + alerts. Може да показва данни от Prometheus, Loki, Elasticsearch/OpenSearch, InfluxDB.

                 ┌──────────────┐
                 │    Grafana   │
                 └──────┬───────┘
                        │
             ┌──────────┴──────────┐
             │                     │
        Prometheus                Loki
             │                     │
       Metrics                  Logs
             │                     │
       Node Exporter          Log Agent
             │                     │
           Linux Server

53📈 Prometheus

Prometheus събира metrics: CPU, RAM, Disk, Network, HTTP requests, Latency, Load, Container metrics. Node Exporter обикновено предоставя Linux host metrics.

Linux Server
      ↓
Node Exporter
      ↓
Prometheus
      ↓
Grafana

54📜 Loki

Loki е ориентиран към logs: Nginx, Application, Docker и System logs.

Server
 ↓
Log Agent
 ↓
Loki
 ↓
Grafana

Така можеш да имаш в един dashboard CPU, RAM, Disk, HTTP latency — и едновременно Nginx errors, Application errors, Docker logs.

55🔥 Firewall

# firewalld
firewall-cmd --state
firewall-cmd --list-all
firewall-cmd --list-ports

# nftables
nft list ruleset

# UFW
ufw status verbose
Много важноАко си remote по SSH: не пипай firewall на сляпо. Можеш да си заключиш собствения достъп.

56👤 Users

whoami        # кой съм аз?
id username   # информация за user
who           # кой е login-нат
w             # по-подробно
last          # последни login-и

57🖥️ Server information

hostname
hostnamectl           # подробности
uname -a              # kernel
cat /etc/os-release   # OS
lscpu                 # CPU
lsblk                 # disk
free -h               # RAM
nproc                 # CPU cores

58🐚 Bash scripting

Най-прост script:

#!/usr/bin/env bash

echo "Hello"

Пример с loop:

#!/usr/bin/env bash

for f in /var/log/*.log; do
    echo "Processing: $f"
done

Проверка дали Nginx работи:

if systemctl is-active --quiet nginx; then
    echo "nginx is running"
else
    echo "nginx is DOWN"
fi

Това вече е началото на automation.

59$? — exit code

След команда:

echo $?

Ако получиш 0, обикновено означава success. Например:

systemctl is-active nginx
echo $?

60🚨 Incident: Disk Full

Клиентите започват да получават errors.

df -h
df -i
du -xhd1 / | sort -hr | head -20

# ако /var е голям:
du -xhd1 /var | sort -hr

# ако /var/log:
du -xhd1 /var/log | sort -hr

find /var/log -type f -size +1G -ls

# ако df и du не съвпадат:
lsof +L1

61🚨 Incident: Website Down

  1. dig +short example.com
  2. ip route get 1.1.1.1
  3. curl -Iv https://example.com
  4. ss -lntp | grep ':443'
  5. systemctl status nginx
  6. nginx -t
  7. journalctl -u nginx -n 100
  8. tail -n 100 /var/log/nginx/error.log
Това е много по-добре от systemctl restart nginx и да се надяваш.

62🚨 Incident: Server е бавен

uptime
free -h
top
ps aux --sort=-%cpu | head -15
ps aux --sort=-%mem | head -15
df -h
df -i

При нужда:

iostat
vmstat

63🚨 Incident: SSH не работи

От твоя компютър:

ping server
ssh -v user@server

На server-а, ако имаш console:

ss -lntp | grep ':22'
systemctl status sshd
journalctl -u sshd -n 100

После firewall. Мислиш:

DNS
 ↓
Network
 ↓
Port 22
 ↓
sshd
 ↓
Firewall
 ↓
Authentication

64🚨 Incident: много заявки от един IP

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20

След това:

grep '^203.0.113.10 ' access.log | tail -100

Гледаш: какви URL-и? колко заявки? какви status codes? Crawler? Customer? Attack? Monitoring?

Не блокирай автоматичноПърво разбери какво става.

65🧠 Най-важните „опасни“ команди

Тези винаги ги проверявай два пъти:

rm -rf
chmod -R
chown -R
rsync --delete
kill -9
systemctl restart
firewall-cmd ...
nft ...

…и всякакви команди със * или /.

66🛠️ Правило за production

Преди промяна:

  1. Провери къде си:
    pwd
  2. Виж файла:
    ls -lah
  3. Направи backup:
    cp config.conf config.conf.bak
  4. Провери конфигурацията:
    nginx -t
  5. После reload:
    systemctl reload nginx
  6. Провери резултата:
    systemctl status nginx
  7. Гледай logs:
    journalctl -u nginx -n 50

67🧭 Универсална troubleshooting схема

                    ПРОБЛЕМ
                       │
                       ▼
                 Какво точно?
                       │
             ┌─────────┴─────────┐
             ▼                   ▼
          Network             Local
             │                   │
          DNS?                Process?
          Route?              Service?
          Firewall?           Disk?
          Port?               RAM?
             │                CPU?
             ▼                   │
          Service               Logs
             │
             ▼
        Application
             │
             ▼
          Database

И почти винаги:

1. Observe

Наблюдавай

2. Measure

Измери

3. Isolate

Изолирай

4. Change

Промени

5. Verify

Провери
Не: Problem → restart everything 😄

68📚 Какво да учиш след Linux basics

За да станеш сериозен SysAdmin/Hosting Admin:

Ниво 1 — Linux

  • filesystem
  • permissions
  • processes
  • systemd
  • logs
  • packages
  • Bash

Ниво 2 — Networking

  • TCP/IP
  • DNS
  • routing
  • ports
  • firewalls
  • HTTP/HTTPS
  • TLS
  • NAT

Ниво 3 — Hosting

  • Nginx
  • Apache
  • PHP-FPM
  • MySQL/MariaDB
  • Redis
  • DNS
  • SSL

Ниво 4 — Automation

  • Bash
  • Git
  • Ansible
  • cron
  • CI/CD

Ниво 5 — Containers

  • Docker
  • Docker Compose
  • Docker networking
  • Volumes
  • Registries

Ниво 6 — Monitoring

  • Prometheus
  • Grafana
  • Node Exporter
  • Loki
  • Alerting

Ниво 7 — Infrastructure

  • Cloud
  • OpenStack
  • AWS
  • Azure
  • Terraform
  • Kubernetes
Kubernetes бих го оставил за по-късно. Ако Linux, networking и Docker не са ти стабилни, Kubernetes само ще изглежда като магия.

🏆Най-важният Cheat Sheet

Disk

df -h
df -i
du -sh /home/*
du -xhd1 / | sort -hr

Големи файлове

find /home -xdev -type f -size +1G -ls
find /home -xdev -type f -printf '%s %p\n' | sort -nr | head -20

Processes

ps aux
top
free -h
uptime

Network

ip -br addr
ip route
ip route get 8.8.8.8

Ports

ss -lntp
ss -tulnp
lsof -i :443

DNS

dig example.com
dig +short example.com

HTTP

curl -I https://example.com
curl -v https://example.com

Services

systemctl status nginx
systemctl --failed

Logs

journalctl -u nginx -n 100
journalctl -u nginx -f

Permissions

ls -l
chmod
chown

Docker

docker ps
docker ps -a
docker logs
docker inspect
docker stats

Docker Compose

docker compose ps
docker compose logs
docker compose up -d

Deleted files

lsof +L1

🧠Най-важното нещо

Не гадай. Провери.

🌐 Сайтът не работи?

dig · curl · ss · systemctl · nginx -t · journalctl

💾 Дискът е пълен?

df -h · df -i · du · find · lsof +L1

🐢 Сървърът е бавен?

uptime · free · top · ps · df · iostat

🐳 Container-ът не работи?

docker ps -a · docker logs · docker inspect · docker stats

И постепенно ще започнеш да гледаш на сървъра не като на 1000 различни команди, а като на една система:

                 INTERNET
                    │
                  DNS
                    │
                    ▼
               IP / ROUTE
                    │
                 FIREWALL
                    │
                    ▼
                PORT 80/443
                    │
                    ▼
              NGINX / APACHE
                    │
                    ▼
              PHP / APP
                    │
                    ▼
              MYSQL / REDIS
                    │
                    ▼
              FILESYSTEM
                    │
        ┌───────────┼───────────┐
        ▼           ▼           ▼
       CPU         RAM         DISK
        │           │           │
        └───────────┼───────────┘
                    ▼
                  LOGS
                    │
                    ▼
             MONITORING
       Prometheus / Grafana / Loki