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.

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.

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.
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
ujiandengan 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)