Muhammad Rafiq Amin Chat WhatsApp

Server produksi Live

Server ini menjalankan database dan aplikasi untuk produk di halaman Rilis. Saya merakit hardware-nya, memasang Proxmox VE 9, dan mengujinya seperti sistem produksi: memindai port dari luar, mematikan container, menghitung akibat satu disk mati. Aktif sejak ; project pertama di atasnya Crypt-Man.

Diagram: pengunjung masuk lewat Cloudflare Tunnel, admin lewat Tailscale, router cabang lewat satu tunnel WireGuard; di dalam Proxmox ada container web, redis, aplikasi, dan MySQL; MySQL hanya terhubung ke bridge internal vmbr1; penyimpanan dua ZFS mirror dengan snapshot dan backup harian. Cloudflare Tunnel situs dan aplikasi publik Tailscale SSH dan web UI, 2FA WireGuard router cabang Proxmox VE 9 host, firewall default-deny CT web nginx + cloudflared CT redis cache dan antrean CT app Crypt-Man vmbr1, bridge internal tanpa port fisik CT db · MySQL 8.4 hanya di 10.10.10.120 rpool 2× NVMe mirror · tank 2× HDD mirror · snapshot dan backup harian
Geser ke samping untuk melihat seluruh diagram.

Spesifikasi

HypervisorProxmox VE 9.2, kernel 7.0
CPU / RAMRyzen 9 9900X · 32 GB
Disk2× NVMe 2 TB (rpool) + 2× HDD 4 TB (tank), ZFS mirror
Containerweb, redis, app (Crypt-Man), db (LXC Debian)
DatabaseMySQL 8.4 LTS, hanya di bridge internal
Akses masukCloudflare Tunnel untuk publik; Tailscale untuk admin; satu tunnel WireGuard ke router cabang
Backupdump MySQL, vzdump, snapshot ZFS harian; salinan off-site terenkripsi GPG

Yang sudah diverifikasi

  1. Penyimpanan. Dua ZFS mirror, kedua partisi boot terisi: tetap boot walau satu NVMe mati.
  2. Isolasi. MySQL hanya di bridge internal; firewall per container dan host default-deny.
  3. Akses. Tanpa port web atau database ke internet; masuk lewat Cloudflare Tunnel, Tailscale dengan ACL, dan satu tunnel WireGuard. SSH hanya kunci, 2FA di web UI, fail2ban, pembaruan keamanan otomatis.
  4. Edge. Cloudflare Tunnel untuk aplikasi; Cloudflare Worker untuk halaman statis agar tetap hidup saat server mati.
  5. Backup. Dump MySQL, vzdump, snapshot ZFS harian, salinan off-site GPG; penjaga backup memeriksa struktur dump.
  6. Pemantauan. Dashboard sendiri membaca satu aliran JSON lewat SSH: daya CPU, keausan NVMe, umur scrub, status backup.

Tiga pelajaran yang saya bawa

  1. Uji dari luar, jangan asumsikan: bind-address saja tidak menutup semua port MySQL.
  2. Pasang mekanisme rollback sebelum mengubah firewall dari jarak jauh.
  3. Verifikasi arsitektur image sebelum menyalahkan hardware.

Mau tanya soal keputusan di server ini? Saya senang membahasnya.