Arsitektur Sistem

Topologi Jaringan

Server ujian mendukung dua topologi deployment. Pilih sesuai infrastruktur yang tersedia:

Opsi 1: Direct ke Internet (Full HTTPS)

Server ujian langsung berhadapan dengan internet. Membutuhkan IP Public dan sertifikat SSL.

Topologi Direct ke Server Ujian

Kapan menggunakan:

  • Server punya IP Public sendiri
  • Domain mengarah langsung ke IP server
  • SSL certificate tersedia (bisa wildcard)

Opsi 2: Via HTTP Proxy (Reverse Proxy)

Server ujian di belakang reverse proxy. Tidak perlu IP Public atau SSL — cukup IP Private dan port 80.

Topologi via HTTP Proxy

Kapan menggunakan:

  • Server berada di jaringan internal/kampus
  • Sudah ada reverse proxy yang menangani SSL termination
  • Tidak punya IP Public untuk server ujian

Tips: Gunakan Config Wizard untuk generate konfigurasi sesuai topologi yang dipilih. Wizard otomatis menyesuaikan parameter SSL dan security berdasarkan pilihan topologi.

Lihat juga: Kebutuhan Server — SSL Certificate, Keamanan — Toggle Security

Akses Lumbung Soal Nasional

Jika institusi menggunakan layanan Lumbung Soal Nasional, domain server ujian harus dapat diakses dari internet — bukan hanya dari jaringan lokal. Aplikasi Lumbung akan push data soal ke server ujian melalui API (/api/...) via HTTPS.

Topologi Direct dengan akses Lumbung

Penting:

  • Domain server ujian harus selalu bisa diakses dari luar selama proses pengiriman soal
  • Saat pelaksanaan ujian, akses dari internet bisa ditutup jika dikhawatirkan mengganggu — cukup akses dari lingkungan lokal saja
  • Pastikan firewall/NAT mengizinkan koneksi masuk ke port 443 dari IP Lumbung

Overview Komponen

PC Ujian dan Pengawas
    │
    ▼
┌─────────┐     ┌──────────┐     ┌───────────┐
│  Nginx  │────▶│ PHP-FPM  │────▶│ MariaDB   │
│ (443/80)│     │ (socket) │     │ (3306)    │
└─────────┘     └──────────┘     └───────────┘
    │                │
    │                ▼
    │           ┌───────────┐
    │           │ Memcached │
    │           │ (11211)   │
    │           └───────────┘
    │
    ▼
┌─────────┐     ┌───────────┐
│ Fail2ban│     │  UFW      │
│ (jails) │     │ (firewall)│
└─────────┘     └───────────┘

Komponen

Nginx (Web Server)

  • Versi >= 1.30 (dari repo nginx.org, bukan Debian default)
  • Mode HTTPS (default): Listen port 80 (redirect ke HTTPS) dan 443 (SSL), HTTP/2 enabled
  • Mode HTTP-only: Listen port 80 saja, tanpa SSL termination — untuk server di belakang reverse proxy
  • Reverse proxy ke PHP-FPM via Unix socket
  • Rate limiting per IP (tiered)
  • Slowloris protection (timeout 10s)
  • Security headers (HSTS, X-Frame-Options, X-Content-Type-Options)
  • Gzip compression

PHP 8.3-FPM

  • Dynamic process manager (tiered berdasarkan jumlah client)
  • PHP runtime extension aktif (zend_extension)
  • Pool khusus ujian dengan Unix socket (/run/php/php8.3-fpm-ujian.sock)
  • Disabled dangerous functions (exec, system, proc_open, dll)
  • open_basedir restriction
  • Timezone: Asia/Jakarta

MariaDB

  • Bind ke localhost only (127.0.0.1)
  • InnoDB tuning (buffer pool, flush method, file-per-table)
  • Slow query logging (threshold 2s)
  • Query cache enabled

Memcached

  • Session storage (menggantikan file-based sessions)
  • Cache layer untuk aplikasi
  • Bind ke localhost only
  • Max item size: 4MB

Fail2ban

4 jails aktif:

  • sshd: 5 retry, ban 1 jam
  • nginx-http-auth: 5 retry, ban 1 jam
  • nginx-botsearch: 10 retry, ban 24 jam
  • nginx-req-limit: 5 retry, ban 2 jam

UFW Firewall

  • Default deny incoming, allow outgoing
  • Port terbuka: SSH (default 22, custom via --ssh-port), 80 (HTTP), 443 (HTTPS — hanya jika mode SSL), 53/udp (DNS)
  • Port 3000 dibuka jika monitoring stack diinstall (Grafana)

DNSMasq

  • Local DNS resolver
  • Mapping domain ke semua IP server (untuk akses dari LAN)

Daftar Paket

Semua paket diinstall otomatis oleh examtool install. Tidak perlu install manual.

Web & Runtime

Paket Keterangan
nginx Web server (dari nginx.org, >= 1.30)
php8.3-fpm PHP FastCGI process manager
php8.3-cli PHP command line
php8.3-mysql Koneksi ke MariaDB
php8.3-xml Parsing XML
php8.3-curl HTTP client
php8.3-gd Image processing
php8.3-mbstring Multibyte string
php8.3-zip Kompresi ZIP
php8.3-intl Internationalization
php8.3-bcmath Arbitrary precision math
php8.3-readline Interactive CLI
php8.3-memcached Koneksi ke Memcached
php8.3-common Shared PHP libraries

Database & Cache

Paket Keterangan
mariadb-server Database server
mariadb-client Database client tools
memcached In-memory cache
libmemcached-tools Memcached utilities

Security

Paket Keterangan
fail2ban Intrusion prevention (auto-ban IP)
ufw Uncomplicated Firewall
openssl SSL/TLS toolkit

Analytics

Paket Keterangan
r-base R language (RASCH analysis)
python3 Python runtime
python3-pip Python package manager
python3-venv Python virtual environment

DNS & Networking

Paket Keterangan
dnsmasq Local DNS resolver
net-tools ifconfig, netstat, dll
dnsutils dig, nslookup

System Tools

Paket Keterangan
curl HTTP client CLI
wget Download manager
git Version control
htop Process monitor
iotop Disk I/O monitor
lsof List open files
lshw Hardware info
traceroute Network trace
p7zip-full 7z extraction (untuk database archive)
unzip ZIP extraction
acl Access control lists (SFTP user)
figlet ASCII banner
vim Text editor
sudo Privilege elevation
gnupg GPG key management

Repository Tambahan

Repository URL Alasan
Sury PHP packages.sury.org/php PHP 8.3 tidak tersedia di Debian 13 default
Nginx.org nginx.org/packages/debian Versi >= 1.30 untuk CVE fixes

Monitoring (Opsional)

Diinstall terpisah via examtool setup-monitoring:

Komponen Source Bind Address
Grafana apt (packages.grafana.com) 0.0.0.0:3000
Prometheus GitHub binary 127.0.0.1:9090
Node Exporter GitHub binary 127.0.0.1:9100
MariaDB Exporter GitHub binary 127.0.0.1:9104
Memcached Exporter GitHub binary 127.0.0.1:9150
Nginx Exporter GitHub binary 127.0.0.1:9113
PHP-FPM Exporter GitHub binary 127.0.0.1:9253

Semua exporter hanya bind ke 127.0.0.1 — tidak terekspos ke luar. Hanya Grafana yang bisa diakses dari luar via port 3000.

File Konfigurasi

File Fungsi
/etc/examtool.conf Konfigurasi server (domain, client, credentials, DB_CHECKSUM)
/etc/examtool.env Environment lokal (SEB config, helpdesk, dll)
/etc/ssl/ujian/ujian.crt SSL certificate
/etc/ssl/ujian/ujian.key SSL private key
/etc/nginx/sites-available/ujian Nginx vhost
/etc/nginx/conf.d/rate-limiting.conf Rate limiting zones
/etc/php/8.3/fpm/pool.d/ujian.conf PHP-FPM pool
/etc/mysql/mariadb.conf.d/99-exam-server.cnf MariaDB tuning
/etc/memcached.conf Memcached config
/etc/fail2ban/jail.d/examtool.conf Fail2ban jails
/etc/sysctl.d/99-exam-server.conf Kernel tuning
/etc/security/limits.d/99-exam-server.conf File descriptor limits

Aplikasi

Ujian

  • Path: /var/www/ujian
  • Config: /var/www/ujian/application/config/cbt_kedokteran_config.php

RASCH Analysis

  • Path: /var/www/rasch

System Tuning

Kernel parameters yang dioptimasi:

  • TCP connection backlog: 65535
  • Port range: 1024-65535
  • TCP reuse enabled, FIN timeout 15s
  • Keepalive: 300s
  • SYN cookies enabled (flood protection)
  • Swappiness: 10 (prefer RAM)
  • File descriptors: 2M

Arsitektur Docker (Alternatif)

Selain instalasi bare metal, server ujian juga bisa dijalankan via Docker Compose. Arsitektur containerized:

┌─────────────────────────────────────────────┐
│  Container: app (Debian Trixie)             │
│  ┌─────────┐  ┌─────────┐  ┌────────────┐  │
│  │  Nginx  │  │ PHP-FPM │  │ Memcached  │  │
│  │  (:80)  │  │ (8.3)   │  │  (:11211)  │  │
│  └─────────┘  └─────────┘  └────────────┘  │
│         managed by supervisord              │
└──────────────────┬──────────────────────────┘
                   │
         ┌─────────┴─────────┐
         ▼                   ▼
┌─────────────────┐  ┌──────────────────┐
│  Container: db  │  │  Monitoring      │
│  MariaDB 11.4   │  │  (opsional)      │
└─────────────────┘  └──────────────────┘

Perbedaan utama dengan bare metal:

  • Semua service (Nginx, PHP-FPM, Memcached) dalam satu container dikelola supervisord
  • MariaDB di container terpisah dengan health check
  • Kode aplikasi di-mount sebagai volume (perubahan langsung terlihat)
  • Tidak include firewall, fail2ban, DNSMasq — tangani di level host
  • Tier scaling tetap sama (SMALL/MEDIUM/LARGE/MAX via env TIER)