Sudah lama ingin membuat Home Server kecil-kecilan sendiri, karena belum ada waktu (time is money, oke?) jadi mengurungkan niat terlebih dahulu setidaknya sampai hari ini.
Pilihan gue untuk membuat Home Server sebelumnya adalah antara menggunakan NAS seperti Synology atau Rack-based seperti Supermicro. Karena salary saya belum sampai ke skala itu, jadi mari kita gunakan Raspberry Pi saja sebagai Home Server.
Sebelum kita masuk ke pembahasan, barang-barang yang digunakan disini adalah:
Dengan spesifikasi:
- Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz, 4 Cores.
- RAM 4GB
- MicroSD 16GB
- SSD 500GB
- Sistem Operasi Raspberry Pi OS
- Kernel 5.4.72-v7l+
Disini gue pakai sistem operasi bawaan karena alasan "ke-native-an" yang dirancang khusus untuk Raspberry Pi, dan menggunakan SSD karena hidup terlalu singkat untuk menggunakan MicroSD.
Berikut penampakan apa adanya:

Ketika baru dinyalakan (Plug power + Sambung HDMI, Keyboard, Mouse), akan ada menjumpai hal-hal yang biasa kita temukan ketika memasang OS baru, dan yang biasa kita lakukan adalah melakukan update dan upgrade.
Btw di Raspi 3+ sudah built-in Wi-Fi yang gak kenceng-kenceng amat tapi lumayanlah untuk digunakan diatas jaringan Telkom, jadi, silahkan gunakan koneksi Wi-Fi untuk melakukan update & upgrade dan tunggu beberapa jam, jika sudah selesai, lakukan Reboot.
Hal petama yang dilakukan setelah proses diatas adalah memindahkan segalanya dari MicroSD ke SSD, jika jenis drive kamu ExFat, silahkan pasang exfat-fuse
dan exfat-utils
terlebih dahulu agar Raspi mu bisa baca itu drive.
Setelah sudah dipasang, mari kita konfigurasi terkait booting. Untuk yang sudah biasa install ulang laptop bagian ini udah lancar lah ya.
Pertama, kita harus kasih tau raspi buat memuat versi ROM ke yang paling terbaru, ini bisa di atur di dengan cara sudo raspi-config > Advanced Options > Bootloader Version
dan pilih Latest.

Pas disuruh Reboot sekarang, jangan dulu alias pilih No.
Setelah itu, kita buat si Raspi buat melakukan booting dari USB sebagai prioritas utama, ini bisa diatur di tempat Advanced Options juga tapi di bagian Boot Order.

Pilih USB Boot dan jangan langsung di Reboot juga.
Setelah itu, kita lakukan pemindahan dari MicroSD ke SSD dengan program SD Card Copier yang sudah bawaan dari Raspi OS.

Dan silahkan pilih MicroSD sebagai sumber dan SSD mu sebagai target, tunggu sebentar, dan matikan Raspi mu (bukan Reboot).
Setelah mati, cabut MicroSD, cabut (dan pasang kembali) SSD—dalam kasus gue menggunakan USB 3.0—lalu nyalakan.
Jika berhasil, untuk memastikan apakah Raspi kita sekarang sudah menggunakan SSD, kita cek via df
dan lihat ke bagian /dev/root

Jika misalnya sudah terlihat seperti menggunakan SSD (gue lihat dari bagian Size) berarti Raspi kita sudah berhasil menggunakan SSD!
HAHAHA.
Oke oke, gue udah buat perbandingan ketika menggunakan MicroSD dan SSD khususnya untuk operasional I/O. Berikut ketika masih menggunakan MicroSD:

Disitu bisa terlihat bahwa untuk melakukan Write sebesar 1GB memiliki kecepatan 12.7 MB/s ketika melakukan pengukuran sederhana.
Dan berikut hasilnya ketika sudah menggunakan SSD:

Disitu dia bisa melakukan Write dengan kecepatan 133 MB/s, lumayanlah untuk menjalani beban yang tidak berat-berat amat.
Dan karena gue sering menggunakan shred(1)
untuk menghapus berkas, ketika menghapus berkas berukuran ~1G, berikut hasilnya:

Yang mana memakan waktu ~45 detik, beda dengan ketika masih menggunakan MicroSD yang memakan 2 menit lebih yang sayangnya lupa gue foto.
Btw gue belum riset lebih lanjut seputar Disk Failure Rate disini, jadi, gue hanya bisa berharap modal yakin bahwa data yang ada tidak terjadi corrupt
Install Wireguard
Oke setelah kita berhasil menggunakan SSD, hal kedua yang dilakukan adalah memasang Wireguard®. Gue tidak akan menjelaskan apa itu Wireguard karena sudah sering dibahas di blog ini, untuk spesifik kegunaannya, agar server Raspi ini bisa diakses melalui jaringan internet.

Server Raspi gue memiliki IP 10.0.0.9, dan bisa diakses dari IP yang masih di subnet yang sama. Memiliki IP statis memudahkan hidup kita ketika berurusan dengan jaringan internet.
Untuk memasang Wireguard® di Raspi, gue mengikuti panduan yang ada disini.
Dan untuk konfigurasinya, gue menggunakan konfigurasi ini:
[Interface]
PrivateKey = [redacted]
Address = fd42:42:42::9/64, 10.0.0.9/24
ListenPort = 8999
[Peer]
PublicKey = [redacted]
Endpoint = 172.105.127.151:8999
AllowedIPs = fd42:42:42::0/64, 10.0.0.0/24
PersistentKeepAlive = 25
Di bagian Interface gue eksplisit kasih tau wg untuk menggunakan Port 8999 (biar ga dynamically assigned) dan untuk melihat apakah sudah terhubung atau belum (setelah melakukan wg-quick up wg0
), kita bisa melihatnya dengan perintah wg

Karena sudah terhubung ke jaringan Wireguard, gue bisa mengakses Raspi gue dimanapun tidak terbatas di kosan aja (yang satu jaringan) karena sekarang sudah berada di 1 jaringan yakni Wireguard yang saling tersambung ke jaringan publik (internet).
Install Docker
Docker mendukung ARM dan gue masih nyaman menggunakan Docker daripada berurusan dengan journalctl+iptables+chroot+cgroup secara langsung. Install docker di Raspi relatif tidak terlalu ribet, tinggal menjalankan:
curl -fsSL https://get.docker.com -o get-docker.sh
Silahkan periksa skrip yang ada di get-docker.sh
jika kamu skeptis. Setelah semuanya terlihat yoi, jalankan sudo sh get-docker.sh
dan tunggu proses selesai.
Dan jika sudah selesai, silahkan tambahkan user pi
ke grup docker
untuk mengurangi keribetan dalam hidup.
Jika kurang suka dengan Docker, silahkan gunakan Podman tapi gue belum coba apakah mendukung ARM juga atau tidak.
Menjalankan Nextcloud di Docker
Salah satu tujuan utama Home Server gue adalah untuk melakukan arsip.
Jika menjual jiwa kita ke Google, layanan-layanan Google yang bisa digunakan untuk membuat hidup kita menjadi mudah adalah:
- Google Drive
- Google Calendar
- Google Contact
- Google Mail
Dengan menggunakan Nextcloud (Open Source), kita bisa menggunakan alternatif dari 1-3 diatas, dan untuk email gue menggunakan Migadu.
Nextcloud bisa berjalan di SQLite, MySQL, dan Postgres. Karena gue lagi seneng-senengnya sama Postgres, mari kita gunakan Postgres sebagai backend nya.
Pertama, kita ambil dulu image nya dengan docker pull postgres:alpine
yang memiliki ukuran sekitar 131MB. Bila menggunakan Postgres biasa (bukan versi alpine linux), berukuran sekitar 669MB.
Setelah itu kita jalankan Postgres via docker-compose.yml
.
version: '3'
services:
db:
image: postgres:alpine
restart: always
volumes:
- db:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=mysecretpassword
volumes:
db:
Jika belum memasang Docker Compose bisa pasang dengan perintah sudo apt install docker-compose
.
Setelah si postgres berjalan (docker-compose up -d db), kita buat db untuk nextcloud nya terlebih dahulu.
Hal yang biasa gue lakukan adalah masuk ke container (via bash), dan jalankan perintah-perintah yang harus dijalankan :))
# masuk ke container
$ docker exec -ti <container_id> bash
# jalankan interactive terminal postgres dengan user postgres
$ psql -U postgres
# buat user nextcloud dengan password
postgres=> create user nextcloud with password '<password>' createdb;
# keluar dari psql
postgres=> \q
# buat database nextcloud dengan owner nextcloud
$ createdb nextcloud -U nextcloud
Untuk generate password biasanya gue menggunakan perintah openssl rand -base64 32
karena mengapa tidak.
Setelah itu, mari kita buat instance Nextcloud kita dengan Docker Compose lagi:
nextcloud:
restart: always
image: nextcloud
environment:
- POSTGRES_HOST=db
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
- POSTGRES_PASSWORD=<password>
ports:
- <host>:8080:80
depends_on:
- db
volumes:
- nextcloud:/var/www/html
Silahkan gunakan Docker Secret jika kamu paranoid.
Lalu jalankan docker-compose up -d nextcloud
dan akses <host>:8080
di peramban kamu. Karena gue inginnya si Nextcloud ini bisa diakses di jaringan Wireguard, nilai <host>
gue adalah 10.0.0.9
.
Berikut gambaran Nextcloud gue:

Agar Nextcloud gue bisa diakses melalui jaringan internet, gue menggunakan Reverse Proxy yakni Caddy.

Isi Caddyfile
nya kurang lebih seperti ini:
nextcloud.faultable.dev {
reverse_proxy * 10.0.0.9:8080
header Strict-Transport-Security max-age=31536000;
redir /.well-known/caldav /remote.php/dav 301
redir /.well-known/carddav /remote.php/dav 301
respond /.htaccess 403
respond /data 403
respond /config 403
respond /db_structure 403
respond /.xml 403
respond /README 403
}
Dan docker-compose.yml
lengkapnya kurang lebih seperti ini:
version: '3'
services:
db:
image: postgres:alpine
restart: always
volumes:
- db:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=mysecretpassword
nextcloud:
restart: always
image: nextcloud
environment:
- POSTGRES_HOST=db
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
- POSTGRES_PASSWORD=<password>
ports:
- 10.0.0.9:8080:80
depends_on:
- db
volumes:
- nextcloud:/var/www/html
volumes:
db:
nextcloud:
Dan berikut stats sederhana nya:

Sekarang gue bisa mengakses berkas-berkas yang gue punya di semua perangkat gue, menggunakan layanan kalender & kontak sendiri, serta dapat menyimpan berkas yang ingin gue simpan dari manapun tanpa ribet!
Btw gue tidak menggunakan service-side encryption seperti sebelumnya ketika gue masih menjalankan Nextcloud di VM, karena sekarang gue tidak perlu terlalu khawatir akan berkas yang gue simpan diluar komputer gue :)
Monitoring
Gue terlalu males untuk atur-atur Prometheus dan Grafana khususnya untuk monitoring suhu, sementara ini gue membuat cronjob sederhana untuk memonitor suhu dari Raspi gue:
* * * * * echo "[$(date)] $(vcgencmd measure_temp)" >> /home/pi/.log/temp.log
Cron ini untuk memastikan diri gue apakah gue bisa meninggalkan si Raspi terus berjalan dengan tenang sekalipun gue lagi di luar kos.
Berikut curhatan nya:

Gue melakukan monitoring tiap menit untuk ngecek temperatur si Raspi. Sudah sekitar 973x pengecekan yang dilakukan, dan berikut nilai uniknya:

Menyentuh suhu ~50º terjadi ketika belum menggunakan kipas angin, setelah menggunakan kipas angin untuk raspi gue, suhu rata-ratanya adalah 42º.
Kipas yang gue gunakan kurang lebih seperti ini:

Dan Raspi gue bisa menyentuh suhu ~36º thanks to suhu Bandung yang relatif dingin. Juga, gue memasang Heatsink untuk membantu si komponen mensirkulasikan (bener gak si?) suhu nya.
Berikut gambaran akhir setup dari Home Server ini:

Di depan si Raspi dan SSD itu adalah kipas angin yang 24/7 mendinginkan mereka HAHAHA.
Speedtest
Dengan menggunakan ISP Telkom (Indihome) dan via Wi-Fi, berikut hasil Speedtest nya:

Yaa gak jelek-jelek banget lah ya dengan budget pas-pas-an.
Update (05/12/2020): Berikut ketika melakukan pengujian menggunakan Ethernet (Gigabit Ethernet):

Gak beda jauh lah ya, tapi setidaknya mendapatkan jaringan yang lebih terjamin & stabil daripada menggunakan Wi-Fi.
Catatan tambahan
Karena gue gak pakai si Raspi sebagai PC, jadi gue cuma pakai Text console nya aja ketika boot (ga pakai desktop environment) yang bisa diatur di sudo raspi-config > Boot / Auto Login > pilih
.

Sebelum melakukan perintah diatas, pastikan Raspi sudah bisa diakses via SSH yang sayangnya gue gak ada dokumentasi (we have internet, right?)
Tujuan tidak menggunakan Desktop Environment selain karena tidak butuh juga karena untuk menghemat memori.
Biaya setup
- Raspberry Pi 4 (paket lengkap): Rp 1.095.000
- Seagate Ultra Touch SSD 500GB (USB 3.0): Rp 1.350.000
- Kabel RJ45 5m (belum dipasang): Rp 15.000
- Total: Rp 2.460.000
Biaya bulanan (listrik+internet) sudah include di biaya kosan, jadi gue gak perlu memusingkan itu.
Penutup
Tujuan utama gue membuat home server adalah untuk menyimpan arsip-arsip gue, dan pakai setup ginian lumayan seru juga.
Setelah memasang Nextcloud, hal-hal yang mau gue lakukan lagi adalah:
- Memasang Firefly III yang hanya bisa diakses di VPN, untuk mengatur pengeluaran gue karena gue orangnya susah ngatur duit :))
- Mengatur Borg repo untuk backup-backup data-data yang ada di VM gue (sejauh ini ada 4 VM)
- Cek awesome-selfhosted untuk inspirasi
Proses "de-google-ify"—yang untuk kepentingan pribadi—sejauh ini sudah Gmail (Migadu), Drive; Calendar dan Contact (Nextcloud).
Masih menggunakan produk Google (berbayar ataupun gratis) hanya Google Workspace (kantor) dan Play Store.
Gue masih mempelajari untuk membuat "mirroring" atau seperti f-droid gitu untuk aplikasi-aplikasi Android populer di Indonesia, tolong kasih tau gue kalau kamu berpengalaman dengan itu!
Dan juga gue belum tertarik untuk membuat Home Media Server seperti menggunakan Plex, karena sejauh ini gue masih oke berlangganan Spotify dan Netflix, tapi gak tau kalau nanti :))
Tulisan ini adalah awal dari kategori journalctl yang khusus membahas dunia per-sysadmin-an dan self-hosting, dan masih bingung apakah harus membuat blog khusus atau berada di satu tempat saja (blog ini). Please give me some feedback!
Terima kasih sudah mampir, have a nice weekend!