Stack self-hosting untuk VPS kecil: apa yang muat di RAM 2 GB dan 4 GB
Stack self-hosted awal yang realistis di VPS kecil: Docker Compose, Caddy, Vaultwarden, Uptime Kuma, dan Forgejo, anggaran RAM per layanan, backup, dan dasar-dasar keamanan.
Singkatnya: VPS 2 GB dengan nyaman menjalankan inti self-hosted berupa Caddy (reverse proxy HTTPS), Vaultwarden (kata sandi), Uptime Kuma (monitoring), dan Forgejo (git) di bawah Docker Compose, dengan pemakaian RAM sekitar 0,6 hingga 1 GB. Tambahkan Nextcloud dan Anda butuh 4 GB; pilih tool yang lebih ringan seperti Syncthing atau File Browser dan 2 GB tetap cukup.
Panduan ini memberikan file Compose yang berfungsi, anggaran RAM per layanan, dan dua hal yang paling sering dilewatkan setup self-hosted sampai terlambat: backup off-site dan permukaan jaringan yang dikunci rapat. Perintah mengasumsikan Debian 12/13 atau Ubuntu 24.04 dengan Docker Engine dan plugin Compose yang dipasang dari repositori resmi Docker.
Anggaran RAM per layanan
Angka-angka ini adalah memori resident umum saat idle hingga pemakaian ringan untuk satu sampai lima pengguna dengan SQLite jika didukung. Puncak saat upgrade, git clone repositori besar, atau preview Nextcloud bisa lebih tinggi, jadi sisakan setidaknya 20% ruang dan tambahkan file swap 1 hingga 2 GB.
| Layanan | Peran | RAM umum | Catatan |
|---|---|---|---|
| OS + sshd + journald | Sistem dasar | 150–250 MB | Debian atau Ubuntu minimal |
| Docker Engine + containerd | Runtime container | 80–120 MB | Biaya tetap memakai container |
| Caddy | Reverse proxy, HTTPS otomatis | 20–50 MB | Satu binary, tanpa database |
| Vaultwarden | Server kata sandi kompatibel Bitwarden | 20–60 MB | Ditulis dengan Rust, SQLite |
| Uptime Kuma | Monitoring uptime dan sertifikat | 100–200 MB | Node.js; bertambah seiring jumlah monitor |
| Forgejo | Hosting git, issue, hook CI | 150–300 MB | Go, SQLite cukup untuk tim kecil |
| Nextcloud + MariaDB + Redis | File, kalender, kontak | 600 MB–1,2 GB | Worker PHP-FPM paling dominan |
| Syncthing | Sinkronisasi file, tanpa suite web | 50–150 MB | Alternatif Nextcloud yang lebih ringan |
| File Browser | Pengelola file web | 20–40 MB | Unggah dan bagikan file lewat HTTPS |
| Radicale | CalDAV dan CardDAV | 30–50 MB | Kalender dan kontak tanpa Nextcloud |
Memilih ukuran VPS
Stack inti (Caddy, Vaultwarden, Uptime Kuma, Forgejo) plus sistem dasar berada di sekitar 0,6 hingga 1 GB, yang muat di server 2 vCPU / 2 GB dengan ruang untuk Syncthing dan Radicale. Nextcloud dengan MariaDB dan Redis mendorong total ke sekitar 1,5 hingga 2,2 GB, sehingga 4 GB adalah minimum realistis jika Anda menginginkan suite lengkap plus semua yang lain. Disk juga penting: repositori Forgejo dan file yang disinkronkan terus bertambah, sedangkan layanannya sendiri hanya butuh beberapa GB.
Di NoctisNode, paket Pulse (2 vCPU, RAM 2 GB, NVMe 40 GB, $10 per 28 hari) cukup untuk stack inti, dan Umbra (4 vCPU, 4 GB, NVMe 60 GB, $15 per 28 hari) cukup untuk inti plus Nextcloud. Keduanya KVM dengan root penuh dan IPv4 dedicated, dan bisa dibayar dengan Monero atau kripto lain. Tidak ada bagian panduan ini yang bergantung pada penyedia.
File Docker Compose
Hanya Caddy yang mem-publish port web; aplikasi hanya dapat dijangkau melalui network Compose internal. Forgejo juga mem-publish port 2222 untuk git lewat SSH, sehingga OpenSSH host tetap di port-nya sendiri. Set `FORGEJO_TAG` di file `.env` ke versi mayor Forgejo terkini dan ganti domain contoh dengan record DNS Anda sendiri.
# /srv/stack/compose.yaml
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy/data:/data
- ./caddy/config:/config
vaultwarden:
image: vaultwarden/server:latest
restart: unless-stopped
environment:
DOMAIN: "https://vault.example.com"
SIGNUPS_ALLOWED: "true" # set to "false" after creating your account
volumes:
- ./vaultwarden:/data
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
volumes:
- ./uptime-kuma:/app/data
forgejo:
image: codeberg.org/forgejo/forgejo:${FORGEJO_TAG}
restart: unless-stopped
environment:
USER_UID: "1000"
USER_GID: "1000"
FORGEJO__service__DISABLE_REGISTRATION: "true"
volumes:
- ./forgejo:/data
ports:
- "2222:22"
# /srv/stack/Caddyfile
# vault.example.com {
# reverse_proxy vaultwarden:80
# }
# status.example.com {
# reverse_proxy uptime-kuma:3001
# }
# git.example.com {
# reverse_proxy forgejo:3000
# }Menjalankannya
- 01.Arahkan record A (dan AAAA) untuk `vault`, `status`, dan `git` ke IP server, agar Caddy dapat memperoleh sertifikat saat pertama kali dijalankan.
- 02.Buat `/srv/stack`, taruh `compose.yaml`, `Caddyfile`, dan `.env` di sana, lalu jalankan `docker compose up -d`.
- 03.Buka URL Forgejo dan selesaikan installer; akun pertama yang Anda buat melaluinya menjadi admin, karena pendaftaran publik dinonaktifkan.
- 04.Buat akun Vaultwarden Anda, lalu set `SIGNUPS_ALLOWED` ke `"false"` dan jalankan `docker compose up -d` lagi. Biarkan panel admin nonaktif kecuali Anda mengatur `ADMIN_TOKEN` yang di-hash dengan Argon2.
- 05.Buat user admin Uptime Kuma segera setelah dijalankan, karena halaman setup terbuka untuk siapa saja sampai Anda melakukannya.
- 06.Tambahkan monitor untuk setiap layanan dan untuk kedaluwarsa sertifikat, idealnya dari lokasi kedua, karena monitor di server yang sama tidak bisa melaporkan gangguannya sendiri.
Note · Caddy menangani HTTPS secara otomatis. Untuk header, rate limit, dan routing yang lebih kompleks, lihat panduan reverse proxy Caddy.
Backup yang benar-benar bisa dipulihkan
Semua yang layak disimpan berada di `/srv/stack`: database SQLite, repositori Forgejo, sertifikat Caddy, dan konfigurasi Anda. Jangan mengandalkan snapshot penyedia; simpan salinan terenkripsi dan off-site milik Anda sendiri dengan restic, seperti dijelaskan di panduan backup restic.
File SQLite yang disalin saat layanan sedang menulis bisa tidak konsisten. Cara aman paling sederhana di server kecil adalah menghentikan stack selama semenit proses backup berlangsung. Jika Anda menambahkan Nextcloud dengan MariaDB, dump database dengan `mariadb-dump` sebelum restic dijalankan. Uji restore ke direktori sementara setidaknya sekali; backup yang belum pernah dipulihkan hanyalah tebakan.
#!/bin/sh
# /usr/local/sbin/stack-backup (run nightly from cron or a systemd timer)
# needs RESTIC_REPOSITORY and RESTIC_PASSWORD_FILE in the environment
cd /srv/stack || exit 1
docker compose stop
rc=0
restic backup /srv/stack --tag stack || rc=$?
docker compose start
[ "$rc" -eq 0 ] || exit "$rc"
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneDasar-dasar keamanan
- ▹SSH: hanya kunci, tanpa login kata sandi root, opsional port non-standar; lihat [panduan hardening SSH](/guides/ssh-hardening).
- ▹Catatan firewall: port yang di-publish Docker melewati aturan `ufw`, karena Docker menulis chain iptables/nftables sendiri. Publish hanya yang harus publik (80, 443, 2222) dan jangan pernah mem-publish port database atau admin.
- ▹Pembaruan: aktifkan `unattended-upgrades` untuk host, dan jalankan `docker compose pull && docker compose up -d` sesuai jadwal yang benar-benar Anda patuhi.
- ▹Pendaftaran: matikan pendaftaran publik di Vaultwarden dan Forgejo; undang pengguna sebagai gantinya.
- ▹Enkripsi disk: letakkan `/srv` di [root terenkripsi](/guides/luks-encrypted-root) agar image disk yang disalin tidak mengungkap apa pun; di server jarak jauh gunakan [remote unlock LUKS lewat SSH](/guides/luks-remote-unlock-ssh), dan pilih format LUKS2 yang dijelaskan di [LUKS2 vs LUKS1](/guides/luks2-vs-luks1).
- ▹Rahasia: `.env` dan direktori data Vaultwarden sebaiknya hanya dapat dibaca root (`chmod 600`/`700`).
FAQ
QBerapa RAM yang dibutuhkan untuk self-hosting?
AStack self-hosted inti berisi Caddy, Vaultwarden, Uptime Kuma, dan Forgejo berjalan di sekitar 0,6 hingga 1 GB termasuk OS dan Docker, jadi VPS 2 GB sudah cukup. Menambahkan Nextcloud dengan MariaDB dan Redis menjadikan 4 GB sebagai minimum praktis.
QBisakah saya menjalankan Nextcloud di VPS 2 GB?
ABisa berjalan, tetapi bersama layanan lain ruang tersisanya sedikit dan menjadi lambat saat preview atau lonjakan sinkronisasi. Di 2 GB, Syncthing plus File Browser dan Radicale mencakup file, kalender, dan kontak dengan sebagian kecil memori.
QApakah Vaultwarden aman untuk di-self-host?
AVaultwarden hanya menyimpan data vault yang terenkripsi end-to-end, sehingga server yang disusupi tidak langsung mengekspos kata sandi dalam bentuk teks biasa. Matikan pendaftaran, biarkan panel admin nonaktif atau dilindungi token yang di-hash, perbarui secara rutin, dan backup direktori datanya.
QApa reverse proxy terbaik untuk stack Docker self-hosted?
ACaddy paling mudah untuk setup kecil karena memperoleh dan memperbarui sertifikat HTTPS secara otomatis hanya dengan beberapa baris konfigurasi. Nginx dan Traefik juga bisa, tetapi butuh konfigurasi lebih banyak.
QApakah ufw melindungi container Docker?
ATidak secara default. Port yang di-publish dengan opsi `ports:` Docker melewati ufw karena Docker menyisipkan aturan firewall sendiri, jadi publish hanya port yang memang harus publik.