← Back to projects

Homelab Website Portfolio

Hosting Website Portofolio ini pake baremetal host dan membuat dia bisa diakses menggunakan cloudflare tunnel

Homelab Website Portfolio
  1. GitHub Repository kita punya branch: main feature/landing-page feature/admin-page

Workflow: feature/* ↓ development ↓ merge ↓ main

main = source code yang siap untuk production.

  1. Mac Mini Mac Mini sekarang berfungsi sebagai host/server utama. Di dalamnya ada: Mac Mini │ ├── Lima VM │ └── cloudflared

Jadi Mac Mini belum menjalankan Astro langsung.

  1. Lima VM

VM ini yang menjalankan aplikasi production.

  1. Astro

Astro kita menggunakan SSR Node adapter. Build: npm run build

menghasilkan: dist/ └── server/ └── entry.mjs

Production dijalankan: npm start

yang sebenarnya menjalankan: node --env-file=.env dist/server/entry.mjs

Astro listen di: 0.0.0.0:4321

Sehingga bisa diakses dari LAN: http://:4321

  1. PostgreSQL PostgreSQL belum langsung di-install di VM. Kita pakai Docker: Docker └── myportfolio-postgres └── PostgreSQL 16

Data persistent menggunakan Docker volume: postgres_data

Jadi container mati → data tetap ada.

  1. systemd

Supaya Astro tidak perlu kita jalankan manual: npm start

kita bikin service: /etc/systemd/system/my-portfolio.service

Isinya kurang lebih:

[Service] User=muhamadfikrinabilassyawali WorkingDirectory= ExecStart=/usr/bin/npm start Restart=always Environment=NODE_ENV=production

Sekarang Linux yang menjaga aplikasi.

Kalau crash:

Astro crash ↓ systemd ↓ restart ↓ Astro hidup lagi

Dan ketika VM reboot: VM boot ↓ systemd ↓ my-portfolio ↓ Astro

  1. Cloudflare Tunnel

Di Mac Mini kita install: cloudflared

Cloudflared membuat koneksi: Mac Mini ↓ Cloudflare

Tanpa perlu membuka port router ke internet.

  1. Ingress

Ingress = aturan routing Cloudflare Tunnel.

Konsepnya:

fikrinabil.my.id ↓ cloudflared ↓ :4321

Config-nya secara konsep:

ingress:

  • hostname: fikrinabil.my.id service: http::4321

  • service: http_status:404

Artinya: Kalau request datang ke fikrinabil.my.id, teruskan ke Astro di VM.

Sedangkan:

  • service: http_status:404

adalah fallback kalau hostname tidak cocok. Jadi Ingress bukan aplikasi baru. Dia cuma routing rule.

  1. DNS

Domain: fikrinabil.my.id

Nameserver sudah dipindahkan ke Cloudflare. Kemudian kita jalankan: cloudflared tunnel route dns my-portfolio fikrinabil.my.id

Cloudflare kemudian membuat routing DNS untuk tunnel.