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:

Dijepret melalui kamera hp saomi mohon maklum

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.

sudo raspi-config > Advanced Options > Bootloader Version

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.

sudo raspi-config > Advanced Options > 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.

Accessories > SD Card Copier

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

Cek apakah sudah menggunakan SSD dengan cara tidak elegan

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:

Tangkapan layar apa adanya

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:

Masih tangkapan layar apa adanya

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:

shred -zvfun5

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.

Gambaran sederhana

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

Sudah terhubung ke jaringan wireguard

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:

Nextcloud di VPN

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

Gambaran

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:

Lumayan

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:

I use Asia/Singapore tz because why not

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

min: 36º, median: 45º, max: 55º

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:

why not

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:

Gambaran akhir setup home server apa adanya

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:

Upload ~2.38 mbps (harusnya), Download ~10.87mbps (harusnya juga)

Yaa gak jelek-jelek banget lah ya dengan budget pas-pas-an.

Update (05/12/2020): Berikut ketika melakukan pengujian menggunakan Ethernet (Gigabit Ethernet):

Upload ~2.36 mbps (harusnya), Download ~10.16mbps (harusnya juga)

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.

Gue yang B1

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!

Diskusi