Self-hosting for the rest of us.

Let's take control where, how, and what our data is.

Setelah mendapatkan pesan traktir dari Radisa yang berbunyi It's Friday and can you stop writing blog posts that make me sad or I'll may start to unsubscribe your blog from my RSS feed list /j, yang sepertinya /j disitu bermaksud ke Java bukan ke Joke, jadi hari ini gue akan membahas sesuatu yang semoga membuat dia menjadi lebih sedih lagi dan berhenti berlangganan RSS blog gue.

Kenapa tulisan ini dipublikasikan di blog gue bukan di blog evilfactorylabs? Yaa suka-suka gue dong, money people will follow. Anyway.

Pada 04 Desember 2020 kemarin gue menulis tentang Membangun Home Server untuk orang miskin yang pada dasarnya cuma ngebahas tentang Raspberry Pi dan membuatnya agar sedikit berguna, at least untuk server workload.

Di tulisan ini, untuk membuatnya menjadi lebih berguna lagi, gue akan coba melengkapi tulisan berikut namun untuk keperluan pribadi, yang singkatnya adalah dengan melakukan self-hosting.

Bukan bukan, gue bukan ngebahas tentang compiler yang bisa mengkompilasi sumber kodenya sendiri.

Melainkan layanan-layanan sehari-hari yang bisa kamu jalankan sendiri, tanpa bergantung dengan pihak lain yang diluar kontrol kita.

Mengapa self-hosting?

Kebanyakan orang berpendapat adalah karena alasan kebebasan. Self-hosting bukan berarti kamu bebas dalam bentuk biaya, tidak. Self-hosting tetap memiliki biaya, ada tagihan listrik; internet, dan waktu untuk melakukan pemeliharaan yang harus kamu bayar.

Contoh sederhana tentang kebebasan disini adalah misal bila kamu mengunggah foto si rin lagi jackpot, satu-satunya orang yang memiliki kontrol penuh terhadap foto tersebut adalah kamu. Tidak bisa misalnya raja internet Google menghapus foto yang kamu unggah tanpa persetujuan dari kamu hanya karena memproses permintaan dari si rin sebagai orang yang ada di foto tersebut.

Oke itu contoh sederhananya, klo contoh lumayan ekstrim nya misal begini, kamu menggunakan Google Drive, lalu, akun Gmail Google kamu dianggap Google sebagai akun yang membahayakan/mencurigakan entah atas alasan apapun itu, lalu mereka membatasi aktivitas dari akun kamu.

Atau yang paling buruknya misalnya langsung memblokir akun kamu, tanpa diberikan kesempatan sekalipun untukmu mendapatkan kejelasan.

Mungkin terdengar lucu, sampai kamu yang menjadi korbannya :)

Selain itu, dengan melakukan self-hosting kamu memiliki kontrol penuh terhadap apa yang kamu jalankan. Blog Wordpress kamu tidak bisa diakses karena internet home server kamu sedang gangguan? Kamu yang bertanggung jawab! Dan itu adalah fitur.

Beda cerita ketika blog Wordpress kamu misalnya disimpan di Wordpress.com gratis yang ketika mereka sedang down dan sedangkan kamu sedang menulis sesuatu dan tidak bisa disimpan/diterbitkan, kamu harus menunggu layanan tersebut beroperasi kembali, sambil berharap semoga kondisi tersebut tidak lama.

Apalagi selamanya.

Apa aja yang oke untuk di self-hosting?

Gue selalu membandingkan dengan layanan Google, karena memang kehidupan di dunia maya kamu sudah disediakan oleh Google dari ujung ke ujung.

Butuh layanan surat elektronik untuk dapat mengirim dan menerima surat elektronik dari pengguna internet lain? Gunakan Gmail!

Butuh kalender elektronik untuk menyimpan agenda-agenda kamu? Gunakan Google Calendar! Tanpa perlu daftar, cukup gunakan satu akun Gmail Google!

Butuh buku elektronik untuk mencatat apapun yang ingin kamu catat? Gunakan Google Keep! Atau Google Docs!

Dan masih banyak lagi yang gak mungkin gue tulis satu-satu.

Sebenarnya kondisi tersebut justru bukankah sesuatu yang menyenangkan?

Free services.

Since forever.

Tapi pernah kebayang gak sih kenapa layanan tersebut gratis?

Dan sampai kapan?

Come on, ada biaya yang harus dibayar Google as the corporation untuk menjalankan layanan-layanan tersebut, sama seperti ketika kita melakukan self-hosting.

Jika ternyata tujuan Google mulia, misal, ingin ikut membantu dalam membangun peradaban Internet menjadi lebih yoi, god, harusnya Google dibangun sebagai yayasan, bukan sebagai perusahaan.

Tujuan utama dibentuknya korporasi adalah untuk menghasilkan cuan, that's it.

Jika Google tidak menjual layanan sebagai cuan stream mereka, lalu apalagi yang dijual Google jika bukan surga dan neraka?

Hahaha bercanda, sorry garing.

Ya lo pasti tau lah arah gue kemana, udah jadi rahasia umum lah itu mah.

Pertanyaannya, mau sampai kapan kamu terus menjual jiwa bergantung dengan layanan Google atau lebih tepatnya para big corpo seperti Google, Apple, dan Microsoft dalam hidupmu untuk kelangsungan hidupmu?

Let's start this shit

Mari kita mulai dari hal yang paling fundamental ketika menjadi masyarakat internet: Alamat email.

Ini menjadi yang paling susah, dan sengaja gue buat di paling awal.

Email: Migadu

Lo mungkin akan berpikir seperti 'paying for email like seriously?' dan kenyataan pahitnya adalah, ya, biaya dalam memelihara layanan email ini sayangnya tidak murah.

Pertama, lo akan berurusan dengan port 25; 465, 993, 995, dkim thing, spf thing, postfix, dns thing, ip address thing, isp thing, shitty internet spammers thing, dan masih banyak lagi.

Kedua, lo akan berurusan dengan reliability, alias, server email lo harus sedia setiap saat sekalipun nobody is sending you one. Fucking sad.

Ketiga, lo harus memonitor alamat IP ataupun hostname yang lo gunakan yang semoga gak masuk ke blacklist nya spamassain ataupun spamhaus.

Dan terakhir, time is money, bro. Rekomendasi gue adalah daripada pusing-pusing ngurusin mail server mending bayar Fastmail, Protonmail, Mailbox, ataupun Migadu dan biarkan mereka yang pusing. It's worth every penny.

Biaya menggunakan Fastmail hanya $30/tahun, dan bila menggunakan harga Rupiah sekarang (~14k), berarti cuma ~424rb/tahun alias ~35rb/bulan yang bahkan harga segelas kopi lo adalah 60rb itupun kalau grande.

Jika harga tersebut dirasa masih mahal, berarti nilai kepentingan akan emailmu mungkin rendah.

And it's fine. Maybe. And definetly not me.

Gue pribadi pake https://www.migadu.com

Oke setelah menggunakan email—misal dari Migadu yang paling murah adalah $19/tahun—sekarang waktunya ke hal lain yang fundamental juga untuk masyarakat internet: Penyimpanan berbasis cloud.

Cloud Drive: NextCloud

Mengapa kita butuh itu? Karena kita memiliki hal-hal yang menarik untuk disimpan dan sayangnya ukuran penyimpanan tidak setuju dengan itu. Hp saomi gue aja yang memiliki kapasitas penyimpanan 16GB dan yang HANYA menggunakan 24 aplikasi dan HANYA menyimpan 2 foto (tangkapan layar nomor indihome dan nomor rekening penjaga kosan) tinggal memiliki 2.49GB untuk digunakan.

Sekalipun sistem operasi yang gue gunakan adalah LineageOS yang relatif lebih ringan dan hemat tempat daripada sistem operasi android bawaan hengpon.

Tapi gue senang menyimpan kenangan.

Meskipun dilain sisi gue juga benci mengenang.

Ada ratusan foto yang gue simpan, dari tahun 2018 sampai 2020 yang gue kategorikan per-direktori, meskipun gue orangnya jarang banget ngefoto apalagi menyimpannya.

Dan ada ratusan dokumen yang gue simpan: Ebook, kontrak kerja, invoice, bitcoin wallet (cold), catatan iseng, jurnal, dsb.

Tidak lupa juga beberapa arsip dingin yang gue simpan dalam bentuk tarball.

Jika gue hitung, ada 8GB lebih, dan egoisnya gue—atau kita sebagai manusia?—gue ingin bisa mengakses 8GB penyimpanan gue tersebut, dimanapun dan kapanpun.

Itulah mengapa ada sebuah teknologi bernama Cloud Drive. Penyimpanan yang berada diatas awan.

Hahaha ada-ada aja.

Alias penyimpanan yang berada di komputer orang lain yang dapat diakses melalui sebuah jaringan bernama internet.

Ketika kamu mengunggah seluruh foto kamu di galeri kamu yang berukuran 18GB ke Dropbox, kamu bisa dengan aman menghapusnya dari galeri kamu, tanpa perlu khawatir foto tersebut hilang sehilang-hilangnya.

Itu pastinya dapat menghemat penyimpanan hpmu.

Ketika sedang butuh/ingin mengaksesnya, yang kamu butuhkan hanyalah tinggal mengakses Dropbox melalui jaringan internet yang kebanyakan orang pasti memiliki akses ke jaringan tersebut, termasuk kamu.

Layanan Cloud Drive ini beragam, ada Google Drive; iCloud, Dropbox, Box, OneDrive, dsb yang terkesan memiliki fitur berbeda-beda yang padahal sama aja.

Kamu bisa menjalankan layanan serupa, dan gue merekomendasikan NextCloud karena gue menggunakan itu juga!

NextCloud ini Open Source, berlisensi permissive, dan ditulis menggunakan PHP.

Serta mendukung banyak basis data sebagai penyimpanan metadata, plus mendukung server-side encryption (bukan e2ee) yang membuat hidup kita menjadi lebih nyaman lagi bila kamu paranoid.

Dan asiknya, ekosistem NextCloud lumayan kaya. Ada banyak aplikasi/plugin yang mendukung kehidupan digital kamu, yang mana hampir sama dengan yang ditawarkan oleh BigCo.

Bedanya, data tersebut disimpan di media milikmu dan layanan tersebut dikontrol penuh olehmu :))

Dashboard — The Cloud®

Gambar diatas adalah Dashboard dari instance NextCloud gue yang bisa diakses secara publik disini. Instance tersebut dijalankan diatas Docker yang berada di Raspi gue yang memiliki ram 4GB dengan Gigabit Ethernet walaupun gue pakai 5mbps indihome pula.

NextCloud gue menggantikan:

  • Google Drive
  • Google Calendar
  • Google Contact
  • Google Keep
  • Google Task
  • Google Bookmark (chrome)
  • Google Photos ala-ala
  • Trello

Yang sejauh ini berjalan dengan lancar tanpa ada data loss sejauh yang gue monitor.

Instalasi NextCloud nya pun relatif mudah, ini docker-compose.yml yang gue gunakan:

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=<postgres_password>
    ports:
      - 10.0.0.9:8080:80
    depends_on:
      - db
    volumes:
      - nextcloud:/var/www/html
      
volumes:
  db:
  nextcloud:

Karena nextcloud gue ingin bisa diakses di jaringan internet, dan sedangkan raspi gue berada dibelakang nat, gue menggunakan Wireguard dan meneruskan koneksi dari jaringan publik (nextcloud.faultable.dev dengan ip publik 172.105.127.151) ke raspi gue via jaringan Wireguard (yang memiliki ip pribadi 10.0.0.9).

Sampai hari ini layanan Google yang gue gunakan hanyalah:

  • Google Domains (Baited, but mostly only for side project)
  • Google Workspace (Kantor)
  • Google Play (Cuma buat update BCA Mobile, Pintu dan Bibit, and on the way bikin alternatif!)

Dan gue merasa bangga sekaligus lega tidak bergantung dengan layanan lain khususnya yang ditawarkan oleh BigCo karena alasan prinsip.

Gue tidak menggunakan server-side encryption di NextCloud gue karena selain ada biaya tambahan (performa+disk space) juga SSD gue relatif tersimpan aman di kosan gue yang membosankan ini.

Dan juga, gue hanya menggunakan koneksi via Wireguard yang ter-enkripsi sehingga mengurangi overhead karena tidak menggunakan protokol https serta masih dapat diakses darimanapun sekalipun gue lagi ngopi di arcamanik tapi pengen download foto yang ada di NextCloud gue.

Password Manager: Enpass

Setelah sekian lama menggunakan 1Password dan KeepassXC, gue berpindah ke password-store. Password store/pass sangat cocok dengan Workflow gue, terlebih gue menggunakan Alfred Workflow (Powerpack) yang memungkinan gue untuk mendapatkan nilai kata sandi tanpa perlu membuka terminal.

Namun yang jadi masalah, entah kenapa GPG agent gue lambat banget dan kadang (sering) harus di restart via gpgconf --kill gpg-agent baru bisa berjalan dengan normal (tapi kadang masih lambat).

Yang padahal, kombinasi pass(1) dan pass-otp(1) udah cocok banget dengan Workflow gue.

Lalu setelah melakukan riset kecil-kecilan, ketemulah gue dengan Enpass.

Kontra gue dengan enpass cuma satu: Proprietary software.

Dengan modal kepercayaan—bahwa mereka tidak melakukan something evil—gue akhirnya memutuksna menggunakan Enpass sampai hari ini.

Alasannya, karena gue bisa menyimpan data tersebut di NextCloud gue.

Beda sama alternatif lain yang Open Source seperti Bitwarden Passbolt yang mengharuskan menjalankan komponen server nya juga untuk menyimpan data-data.

Enpass

Gue cuma butuh Password Manager di Desktop karena gue enggak segila itu memiliki banyak akun di internet dan harus terotentikasi di semua perangkat gue.

Model bisnis si Enpass ini adalah mereka menyediakan layanan 'penyimpanan' mereka sendiri dan yang berfokus kepada pengguna mobile. Enaknya Enpass, mereka memberikan versi Portable nya juga sehingga tidak perlu melakukan instalasi (meskipun di MacOS hanya drag-and-drop ke direktori Applications).

Enpass menyediakan fitur-fitur dasar dari Password Manager, seperti:

  • Password Generator (Passphrase/random characters)
  • Password Audit (via haveibeenpwned)
  • TOTP (no qrcode, secret text only)
  • Category (Login, Credit Card, Identity, License, dll)
  • Tags
  • "Secure Notes", gue pake buat nyimpen gpg dan ssh secret key

Dan sampai hari ini masih nyaman dengan Enpass dan belum ada niatan buat pindah.

Money Manager: Firefly III

Mengatur uang bukanlah hal yang mudah.

Gue pernah coba menggunakan ledger-cli tapi kagak intuitif banget dan susah dipelajari.

Lalu jatuhlah pilihan gue ke firefly-iii yang berbasis Web App, Open Source, memiliki UI intuitif dan dashboard lucu biar keliatan seperti eksekutif.

Duit adalah sesuatu yang sensitif jadi gue sensor ya HAHAHA

Di Firefly, technically gue mengatur 3 jenis akun:

  • Assets Account (BCA, Bibit & Pintu)
  • Expense Account (Jenius)
  • Revenue Account (BCA)

Biar kagak pusing, gue melakukan budgeting dan menggunakan pendekatan Zero-based budgeting. Setiap duit masuk ke Revenue Account, akan gue bagikan langsung ke 2 akun lain.

Gue rasa yang ini aman dibagikan karena banyak banget klo harus di sensor

Budgets diatas adalah budget bulanan gue, dan selain budgets, gue juga set bills bulanan dan tahunan gue. Berikut contohnya:

BILLS

Bills ini masuk ke Budgets tipe Tagihan, dan dengan Rules, proses bisa automated alias gak perlu melakukan hal-hal secara manual. Misal: Bayar kosan 725rb perbulan setiap tanggal 25, gue buat recurring transactions untuk itu:

  • Setiap tanggal 25 buat transaksi dengan deskripsi mengandung "kosan"
  • Firefly tau kalau itu berkaitan juga dengan Biils, maka anggap tagihan tersebut sudah terbayar
  • Firefly tau kalau itu berkaitan juga dengan Budgets, maka buat transaksi tersebut menjadi bagian dari Budgets.

Asik, bukan?

Hal-hal manual yang gue lakukan biasanya yang bersifat kecelakaan. Misal:

  • Temen minjem duit, gue ambil dari budget Darurat
  • Bulan ini beli domain baru karena stress, gue ambil dari budget Side Project
  • Bulan ini beli elektronik baru, gue ambil dari budget Invest yang gak related dengan Assets Account gue

Selebihnya, yaa automated karena bersifat "lumayan" pasti.

Proses instalasi firefly-iii juga relatif mudah, ini berkas docker-compose.yml yang gue pakai:

version: "3"

services:
  fireflyiii:
    image: jc5x/firefly-iii:latest
    restart: always
    volumes:
      - firefly-data:/var/www/html/storage/upload
    env_file: fireflyiii/.env
    ports:
      - 10.0.0.9:8081:8080
    depends_on:
      - db
      
volumes:
  firefly-data:

Berkas .env nya bisa diambil dari sini dengan penyesuaian. Dan gue hanya expose instance firefly gue di jaringan Wireguard (bukan di localhost), jadi gue bisa akses dimanapun dan kapanpun selagi ada akses internet.

Remote git repository: Gitea

Untuk beberapa orang, mungkin GitHub/GitLab saja sudah cukup.

Gue menggunakan Gitea kebanyakan untuk mirror.

Ada beberapa project yang gue bergantung, dan gue ingin tetap keep up to date dengan project tersebut.

Di GitHub/GitLab, sejauh yang gue tau itu gak bisa dilakukan secara native.

Mungkin harus menggunakan GitHub Actions untuk melakukan cron, atau dedicated GitHub Apps yang tugasnya untuk tetap up-to-date dengan upstream.

Di Gitea semudah memilih opsi mirror daripada repositori biasa, maka setiap sekian waktu, jika terdapat perubahan di upstream, maka si Gitea akan memperbaruinya sendiri tanpa perlu sentuhan tangan sekalipun.

Selain itu, untuk tujuan kebebasan juga dong.

Jika suatu saat repositori gue kena takedown atau github down atau apapun worst case scenario yang ada, setidaknya gue ada backup.

Dashboard gitea gue

Sebagai bocoran, ada beberapa repositori yang gue simpen dibawah organisasi bernama research yang memang menyimpan project-project open source yang gue minati untuk dipelajari dari sisi teknis.

Selain itu, kebanyakan juga gue menyimpan repositori-repositori yang jenisnya "curated lists" atau yang biasa disebut "awesome list", lumayan untuk menghemat Bookmark yang mungkin gak terlalu penting-penting banget.

Proses instalasinya pun relatif mudah, ini docker-compose.yml nya:

version: "3"

services:
  gitea:
    image: kunde21/gitea-arm:latest
    restart: always
    volumes:
      - gitea:/data
    ports:
      - 10.0.0.9:8082:3000
      - 10.0.0.9:2222:22
    depends_on:
      - db
      - redis

  redis:
    restart: always
    image: redis:alpine
    
volumes:
  gitea:

Gue menggunakan Redis untuk keperluan caching internalnya Gitea untuk menghemat memori (karena by default inmem) dan juga gue menggunakan port 2222 berada di jaringan Wireguard juga untuk keperluan interaksi via SSH. Jadi, jika ingin berinteraksi dengan repository private atau public dengan write-access, yang gue lakukan tinggal set remote url ke ssh://git@10.0.0.9:2222/username/repo.git.

VPN Server

Dari tadi spesifik ke penggunaan Home Server, sekarang mari kita ke yang lain namun tidak keluar dari pembahasan self-hosting.

Poin gue dalam menggunakan VPN sederhana: Gue cuma ingin aktivitas ber-internet gue menjadi lebih pribadi, menghindari MITM dari ISP, dan juga ketika sedang menggunakan Wi-Fi AP yang berjenis publik.

Contoh lah keamanan Bukalapak yang sangat konyol ini yakni memblokir alamat IP yang entah karena:

  • Menggunakan IPv6 by default
  • Berasal dari negara selain Indonesia
  • Terdaftar sebagai operator Tor Relay
  • Mungkin karena pemilik sementara alamat IP tersebut adalah faultable

Dan ini sebagai buktinya:

That "protect itself from online attacks" is definitely Lulzsec-able

Sampai hari ini.

Dan itu kagak keren.

Selain itu, ada juga beberapa layanan yang membatasi 'konten' tergantung dari negara mana, entah karena alasan apapun itu yang pasti selalu tentang politik.

Penyedia VPN yang gue gunakan adalah Wireguard, selain karena menggunakan protokol UDP (pro-kontra) yang relatif lebih cepat, juga sudah menjadi bagian dari Kernel.

Karena berada di level Kernel, Wireguard memakan memori yang relatif lebih kecil dibanding penyedia VPN lainnya dan memiliki abstraksi yang lebih sedikit.

Juga mendukung roaming karena salah satunya menggunakan protokol UDP.

DNS Server

Gue menggunakan DNS Server gue sendiri via Pihole FTL dan unbound sebagai Upstream DNS nya Pihole yang disimpan di server yang gue sewa di Singapore.

Kenapa DNS Server nya di Singapore? Karena selain dekat dengan Indonesia, juga karena agar tidak menggunakan ISP Indonesia :)

DNS Server tersebut hanya bisa diakses melalui jaringan Wireguard untuk mengurangi server workload karena internet adalah tempat yang liar. Namun gue memberikan solusi lain yakni melalui DoH untuk mereka yang ingin menggunakan DNS Server gue namun tidak berada di jaringan Wireguard.

Yang gue rasa itu lumayan efektif karena sebagai pengguna internet biasa, yang kita butuhkan hanyalah record A, AAAA, dan CNAME.

Pihole berguna untuk memblokir query-query yang berjenis iklan ataupun pelacak namun di level DNS. Ini dapat membuat menghemat bandwidth dan baterai karena lebih sedikit sumber daya yang dimuat berarti lebih sedikit sumber daya yang diproses dan digunakan, kan?

Ketika si Pihole tidak memiliki cache untuk query yang dimaksud, maka dia akan meneruskannya ke Unbound, yang mana unbound akan melakukan pencarian rekursif dari ujung ke ujung.

Kenapa gue tidak menggunakan DNS mainstream aja sebagai Upstream seperti 1.1.1.1 nya Cloudflare atau 8.8.8.8 nya Google Public DNS? Karena alasan prinsip aja sih.

Dan selagi yang gue lakukan itu tidak merugikan, ya kenapa why not, kan?

Penutup

Dengan melakukan self-hosting setidaknya gue merasa aman karena gue tahu dimana data—khususnya data pribadi—gue disimpan. Dan juga gue punya kontrol terhadap siapa saja yang memiliki akses terhadap data tersebut, dan apa saja aksesnya.

Selanjutnya yang ingin gue hosting sendiri adalah "google play store" ala-ala khusus untuk aplikasi-aplikasi (Indonesia) yang populer digunakan seperti BCA Mobile, Jenius, Bibit, Pintu, dsb.

Dan juga beberapa aplikasi lain yang gue gunakan (personal) sebagai alternatif dari:

  • Read later service seperti Instapaper
  • Sosial media (gue lagi mengembangkan kecil-kecilan)
  • Workflow automation seperti Zapier
  • Simple file shit hosting service buat nyimpen gambar, gist, dkk

Sejauh ini gue masih puas dengan penggunaan Pihole sebagai home server gue dan SSD untuk mentenagainya. Gue menggunakan strategi backup 3-2-1 yang mana menggunakan kombinasi borgbackup dan rsync-like ke S3-compatible object storage seperti ke Backblaze B2; Wasabi, atau solusi lain yang lebih murah.

Jika kamu tertarik untuk melakukan self-hosting ini dan memiliki pertanyaan atau membutuhkan bantuan, feel free to contact me! Gue akan senang hati membantu sebisa mungkin dengan keterbatasan yang gue punya.

Terima kasih!