Motor de căutare a locurilor de muncă din România
Infrastructura hardware și software a platformei peviitor.ro — acoperind topologia rețelei, configurația serverelor, arhitectura de deployment, backup și securitate.
🏙️ Topologia Infrastructurii
Platforma rulează pe trei Raspberry Pi în rețeaua locală RCS&RDS, cu frontend-ul găzduit pe GitHub Pages:
+------------------------------------------------------------------+
| RCS&RDS (ISP) |
| IP Dinamic 86.122.35.88 |
| Fibra Optica (1 Gbps) |
+--------------------------------+---------------------------------+
|
+-------v--------+
| ONT (ONU) |
| Fibra -> Ethernet |
+-------+--------+
|
+-------v--------+
| Router WiFi 6 |
| 192.168.1.1 |
| NAT, Port Fwd |
+-------+--------+
|
+-------v--------+
| Switch Gigabit |
| 1 Gbps |
+-------+--------+
|
+--------------------+--------------------+
| | |
+-------v--------+ +-------v--------+ +------v--------+
| RPi 5 (16GB) | | RPi 5 (4GB) | | RPi 4 |
| SOLR Server | | API Server | | TEST Server |
| Productie | | Productie | | test.peviitor.ro|
| 192.168.1.134 | | 192.168.1.135 | | 192.168.1.130 |
| | | | | |
| Docker: | | Docker: | | Docker: |
| solr:10-slim | | peviitor-api | | peviitor-api |
| :8983 | | orase-api | | (Apache PHP) |
| | | nginx-proxy-mgr| | peviitor-solr |
| | | :80/443/81 | | :8983 |
| | | | | OpenResty |
| | | | | :80/443 |
+----------------+ +----------------+ +---------------+
+-------------------------+
| GitHub Pages |
| Frontend (React) |
| peviitor.ro |
+-------------------------+
+-------------------------+
| GitHub Actions |
| Scrapers (cron) |
| Python/Node/JMeter |
+-------------------------+
+-------------------------+
| CloudFlare |
| CDN, DNS, SSL, DDoS |
+-------------------------+
Flux trafic
Utilizator (Browser)
|
| HTTPS (peviitor.ro)
v
CloudFlare (CDN, SSL, cache)
|
| DNS: zimbor.go.ro
v
RCS&RDS (fibra optica 1 Gbps)
|
v
ONT (fibra → Ethernet)
|
v
Router WiFi 6 (NAT, port forwarding :80/:443)
|
v
Switch Gigabit (1 Gbps)
|
v
RPi API (Nginx Proxy Manager)
|
| :8080 (PHP BFF)
v
RPi SOLR (HTTP LAN :8983)
|
v
Index SOLR (job / company)
🖥️ Server API — Raspberry Pi 5 (4GB)
Hardware
| Model | Raspberry Pi 5 Model B Rev 1.0 |
| SoC | Broadcom BCM2712 (Cortex-A76, 4 nuclee) |
| RAM | 4 GB LPDDR4X |
| Stocare | MicroSD 59.4 GB (25 GB folosiți) |
| GPU | VideoCore VII |
| Rețea | Ethernet 1000 Mbps (eth0: 192.168.1.135/24) |
| Temperatură | ~49.9 °C |
Software
| OS | Debian 12 (Bookworm) |
| Kernel | Linux 6.12.87+rpt-rpi-2712 (aarch64) |
| Hostname | api |
| Window Manager | labwc (Wayland) |
| VNC | wayvnc (rpi-connect) |
| Docker | Engine + Compose |
Containere Docker
| Nume | Imagine | Porturi | Rol |
|---|---|---|---|
| peviitor-api | php:8.3-apache | 8080 → 80 | API BFF principal |
| orase-api | php:8.3-apache | 8081 → 80 | API orase.peviitor.ro |
| npm-app | jc21/nginx-proxy-manager | 80, 81, 443 | Reverse proxy, SSL |
Runtime-uri
| Node.js | v20.20.2 |
| Python | 3.11.2 |
| GCC | 12 |
Servicii systemd
docker, netdata, ssh, solr-monitor (Discord), avahi-daemon, cron
🔍 Server SOLR — Raspberry Pi 5 (16GB)
Hardware
| Model | Raspberry Pi 5 Model B Rev 1.1 |
| CPU | ARM Cortex-A76, 4 nuclee @ 2.4 GHz |
| Cache | L1d 256 KiB, L1i 256 KiB, L2 2 MiB, L3 2 MiB |
| RAM | 16 GB LPDDR4X (15 GiB usable) |
| Swap | 16 GiB swapfile + 2 GiB zram (zstd) |
| Stocare | microSD 64 GB (33 GB folosiți) |
| Rețea | Ethernet 1000 Mbps (eth0: 192.168.1.134/24) |
Software
| OS | Debian 13 (Trixie) v13.5 |
| Kernel | 6.18.29+rpt-rpi-2712 (aarch64) |
| Hostname | solr-pi |
| Docker | CE 29.5.2 + Compose 5.1.4 |
| Python | 3.13.5 |
| Node.js | v24.16.0 |
| GCC | 14.2.0 |
Container Docker
| Nume | Imagine | Porturi | Rol |
|---|---|---|---|
| solr-container | solr:10-slim | 0.0.0.0:8983 → 8983 | Apache SOLR search engine |
Imagini stocate: solr:latest (1.25 GB), solr:9-slim (531 MB), solr:10-slim (675 MB), alpine, jq
🔌 Server TEST — Raspberry Pi 4
| Model | Raspberry Pi 4 (ARM Cortex-A72, 4 nuclee) |
| RAM | 1.8 GB usable |
| Stocare | microSD 58 GB (~46 GB liberi) |
| IP Local | 192.168.1.130/24 |
| OS | Debian 13 (Trixie), kernel 6.12 (aarch64) |
| Reverse Proxy | OpenResty (nginx + LuaJIT) — port 80/443 |
| TLS | Let's Encrypt (ECDSA P-384, TLS 1.3, AES-256-GCM) |
| Docker | peviitor-api (Apache PHP 8.2, port 8081), peviitor-solr (Solr 10.0.0, port 8983) |
| Frontend | React SPA (search-engine, build mode qa) servit de Apache |
| API | PHP BFF v0/v1 + Swagger UI |
| SOLR | Core-uri job + company (subset ~5k joburi) |
| Rol | Mediu de test (test.peviitor.ro, testsolr.peviitor.ro) |
🌐 Rețea
Topologie rețea locală
| Dispozitiv | IP | Rol |
|---|---|---|
| ONT (ONU) | — | Convertor fibra optică → Ethernet |
| Router WiFi 6 | 192.168.1.1 | NAT, port forwarding, Wi-Fi |
| Switch Gigabit | — | Conectare RPi-uri (4 porturi 1 Gbps) |
| RPi 5 SOLR | 192.168.1.134 | SOLR producție (16GB) |
| RPi 5 API | 192.168.1.135 | API producție (4GB) |
| RPi 4 TEST | 192.168.1.130 | Mediu test (test.peviitor.ro) |
Acces extern
| Serviciu | URL | Metodă |
|---|---|---|
| Frontend | peviitor.ro | GitHub Pages + CloudFlare |
| API BFF | api.peviitor.ro | DDNS + Nginx Proxy Manager |
| SOLR | solr.peviitor.ro | Prin API (indirect) |
| Test | test.peviitor.ro | RPi 4 — OpenResty |
DDNS
| Furnizor | go.ro |
| Hostname | zimbor.go.ro |
| IP actual | 86.122.35.88 |
| ISP | RCS&RDS (IP dinamic) |
| Viteză | 1 Gbps |
| Port forwarding | :80 → 192.168.1.135:80, :443 → 192.168.1.135:443 |
☁️ DNS & CloudFlare
Domeniul peviitor.ro
| Domeniu | peviitor.ro |
| Registrar | Claus Web SRL |
| Nameservere | maria.ns.cloudflare.com, razvan.ns.cloudflare.com |
| SSL | Full (strict) — certificat CloudFlare |
| CDN | Proxy activ (orange cloud) pentru domeniile marcate |
Înregistrări DNS principale
A Records (frontend GitHub Pages)
| Nume | IP |
|---|---|
| peviitor.ro | 185.199.108.153 |
| peviitor.ro | 185.199.109.153 |
| peviitor.ro | 185.199.110.153 |
| peviitor.ro | 185.199.111.153 |
CNAME → GitHub Pages
| Nume | Target |
|---|---|
| sad.peviitor.ro | peviitor-ro.github.io |
| romania.peviitor.ro | peviitor-ro.github.io |
| v01.peviitor.ro | peviitor-ro.github.io |
| www.peviitor.ro | peviitor-ro.github.io |
CNAME → DDNS zimbor.go.ro (infrastructură locală)
| Nume | Proxy |
|---|---|
| api.peviitor.ro | Da |
| netdata.peviitor.ro | Da |
| orase.peviitor.ro | Nu |
| solr.peviitor.ro | Nu |
| test.peviitor.ro | Nu |
| testsolr.peviitor.ro | Nu |
| pi5.peviitor.ro | Da |
| sebi.peviitor.ro | Da |
Vezi documentul complet pentru lista exhaustivă (MX, TXT, etc.)
🚀 Arhitectura de Deployment
Componente și unde rulează
| Componentă | Unde rulează | URL |
|---|---|---|
| Frontend (React) | GitHub Pages | peviitor.ro |
| API BFF (PHP) | RPi API — Docker | api.peviitor.ro |
| API Orașe (PHP) | RPi API — Docker | orase.peviitor.ro |
| SOLR Search | RPi SOLR — Docker | solr.peviitor.ro |
| Validator | Netlify | admin.peviitor.ro |
| Scrapers | GitHub Actions | — |
Nginx Proxy Manager
Rulează pe RPi API (porturile 80/81/443), face SSL termination cu Let's Encrypt și direcționează traficul după domeniu:
api.peviitor.ro | → | peviitor-api:80 |
orase.peviitor.ro | → | orase-api:80 |
solr.peviitor.ro | → | 192.168.1.134:8983 (Basic Auth) |
test.peviitor.ro | → | RPi 4 TEST |
Pipeline CI/CD
Developer commit → GitHub → GitHub Actions
|
+-----------+-----------+
| | |
v v v
Lint Test Build
| | |
+-----------+-----------+
|
+-----------+-----------+
| | |
v v v
Frontend API SOLR config
(gh-pages) (Docker) (manual)
📈 Servicii și Monitorizare
Netdata
Monitorizare RPi API (CPU, RAM, disk, rețea, temperatură) — Port 19999 (LAN)
v2.10.0Sentry
Error monitoring frontend + API
CloudFlare Analytics
Trafic, cache, securitate
Microsoft Clarity
Comportament utilizatori (frontend)
solr-monitor
Discord webhook pentru status SOLR
DiscordRaspberry Pi Connect
Acces remote prin browser (wayvnc)
v2.11.0💻 Backup și Disaster Recovery
Strategie backup
| Componentă | Frecvență | Metodă | Retenție |
|---|---|---|---|
| Index SOLR | Zilnic (02:00) | Script shell + snapshot | 7 zile |
| Configurație Docker | Manual (la modificare) | Git commit | Permanent |
| API source code | Continuu | GitHub | Permanent |
| Frontend source code | Continuu | GitHub | Permanent |
| Nginx Proxy Manager | Manual | Export UI | — |
Procedură restore SOLR
docker stop solr-container # Restaurare snapshot din backup docker start solr-container curl -u user:pass "http://localhost:8983/solr/job/select?q=*:*&rows=1"
Riscuri
| Risc | Impact | Mitigare |
|---|---|---|
| Defecțiune microSD | Pierdere date | Backup zilnic; înlocuire rapidă |
| IP dinamic RCS&RDS | Indisponibilitate externă | DDNS cu TTL scăzut |
| Single point of failure | API sau SOLR indisponibil | Scripturi de restore rapide |
| Fără replică SOLR | Pierdere index | Rebuild din scrapers + backup |
| Incendiu/furt | Pierdere totală hardware | Backup în cloud (GitHub) |
🔒 Securitate
SOLR Basic Auth
security.json activat pe container
CORS restricționat
API acceptă doar domenii cunoscute
CloudFlare WAF
Protecție DDoS și OWASP Top 10
SSL/TLS
Let's Encrypt + CloudFlare Full (strict)
SSH
Autentificare prin cheie — doar în LAN
Firewall
iptables pe toate RPi-urile
GitHub Security
Secret Scanning, CodeQL, Dependabot
Network Segmentation
SOLR în LAN, API prin NPM, Frontend pe CDN
📚 Specificații SOLR
Container
| Imagine | solr:10-slim |
| Port | 8983 (TCP) |
| Autentificare | Basic Auth (security.json) |
Core-uri
| Core | Unique Key | Doc. |
|---|---|---|
job | url | ~40,000+ |
company | id (cif) | ~1,000+ |
🗃️ Inventar Hardware
| Dispozitiv | RAM | Stocare | IP | OS | Rol |
|---|---|---|---|---|---|
| RPi 5 API | 4 GB | microSD 59.4 GB | 192.168.1.135 | Debian 12 | API BFF + NPM |
| RPi 5 SOLR | 16 GB + 16 GB swap + 2 GB zram | microSD 64 GB | 192.168.1.134 | Debian 13 | Apache SOLR 10.x |
| RPi 4 TEST | 1.8 GB | microSD 58 GB | 192.168.1.130 | Debian 13 | test.peviitor.ro |
Rețea
| ISP | RCS&RDS — fibra optică, 1 Gbps |
| IP Public | 86.122.35.88 (dinamic) |
| DDNS | zimbor.go.ro |
| Conexiune | 1000 Mbps (toate RPi-urile, Ethernet) |
🏢️ Medii
| Mediu | Frontend | API | SOLR | Date |
|---|---|---|---|---|
| Producție | peviitor.ro | api.peviitor.ro | solr.peviitor.ro | Full (~40k joburi) |
| Test | test.peviitor.ro | test.peviitor.ro/swagger-ui | testsolr.peviitor.ro | Subset (~5k joburi) |
| Local | localhost:3000 | localhost/api | Docker local | Minimal (seed) |
📖 Glosar
| Termen | Definiție |
|---|---|
| BFF | Backend for Frontend — API care servește specific clientului frontend |
| DDNS | Dynamic DNS — serviciu care actualizează DNS-ul pentru IP-uri dinamice |
| NPM | Nginx Proxy Manager — reverse proxy cu UI web |
| RPi | Raspberry Pi — computer single-board |
| zram | RAM comprimat folosit ca swap |
| WAF | Web Application Firewall |
| CORS | Cross-Origin Resource Sharing |
| CodeQL | Motor de analiză semantică GitHub pentru vulnerabilități |
| Dependabot | Bot GitHub care automatizează update-uri de dependințe |