DEV Community

Zaenal Arifin
Zaenal Arifin

Posted on

🚀 Panduan Hosting Website di Raspberry Pi + Subdomain

Panduan ini buat bikin Website online di Raspberry Pi dengan FastAPI + Gunicorn + Uvicorn + Nginx + SSL, sekaligus atur subdomain supaya bisa diakses dari internet.


1️⃣ Update & Install Dependency

sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv nginx git -y
Enter fullscreen mode Exit fullscreen mode

2️⃣ Clone Project

Catatan:

  • Ganti username/project.git sesuai repository GitHub kamu
  • Path folder lokal (cd project) bisa diganti sesuai nama project
  • Pilih metode dependency sesuai kebutuhan: Poetry atau requirements.txt
git clone https://github.com/username/project.git   # <-- ganti URL repo kamu
cd project                                          # <-- ganti sesuai nama folder project
Enter fullscreen mode Exit fullscreen mode

Kalau pakai Poetry:

sudo pip install poetry
poetry install                                     # <-- otomatis install dependency dari pyproject.toml
Enter fullscreen mode Exit fullscreen mode

Kalau pakai requirements.txt:

python3 -m venv venv                               # <-- buat virtual environment
source venv/bin/activate                            # <-- aktifkan venv
pip install -r requirements.txt                    # <-- install dependency dari requirements.txt
Enter fullscreen mode Exit fullscreen mode

💡 Tips:

  • Pastikan branch yang ingin dijalankan sesuai kebutuhan (git checkout branch-name)
  • Kalau pakai Poetry, pastikan poetry shell atau jalankan dengan .venv/bin/python sesuai virtual environment

3️⃣ Test FastAPI Lokal

gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
Enter fullscreen mode Exit fullscreen mode

Buka browser http://127.0.0.1:8000 harus muncul website.


4️⃣ Setup systemd Service

Biar FastAPI jalan otomatis di background. Catatan: ganti semua bagian yang sesuai project kamu, khususnya:

  • project.service → nama service, bisa diganti sesuai project
  • User & Group → user di Pi yang punya akses ke folder project
  • WorkingDirectory → path ke folder project di Pi
  • ExecStart → path ke virtual environment dan nama file app (main:app)
sudo vim /etc/systemd/system/project.service
Enter fullscreen mode Exit fullscreen mode

Isi file (sesuaikan nama & path):

# /etc/systemd/system/project.service
[Unit]
Description=project FastAPI
After=network.target

[Service]
User=pi
Group=pi
WorkingDirectory=/home/pi/project
Environment="PATH=/home/pi/project/myenv/bin"
ExecStart=/home/pi/project/project/myenv/bin/gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
Enter fullscreen mode Exit fullscreen mode

Enable & start service:

sudo systemctl daemon-reload
sudo systemctl enable project        # <-- pastikan sama dengan nama file service
sudo systemctl start project
sudo systemctl status project
Enter fullscreen mode Exit fullscreen mode

💡 Note:

  • Nama service (project) harus konsisten di /etc/systemd/system/ dan saat enable/start
  • Path WorkingDirectory dan ExecStart harus sesuai lokasi project & virtual environment kamu
  • Jika pakai Poetry, path ke executable bisa diganti: /home/pi/project/.venv/bin/gunicorn ...

5️⃣ Setup Nginx sebagai Reverse Proxy

Catatan: ganti semua yang perlu sesuai project kamu, khususnya:

  • project.conf → nama file config, bisa sesuai project
  • server_name → subdomain / domain yang kamu pakai
  • proxy_pass → URL lokal tempat FastAPI/Gunicorn berjalan
sudo vim /etc/nginx/sites-available/project.conf
Enter fullscreen mode Exit fullscreen mode

Isi file (sesuaikan nama & domain):

server {
    listen 80;
    server_name project.example.com;   # <-- ganti sesuai subdomain / domain kamu

    location / {
        proxy_pass http://127.0.0.1:8000;   # <-- ganti port sesuai Gunicorn
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
Enter fullscreen mode Exit fullscreen mode

Enable config & restart Nginx:

sudo ln -s /etc/nginx/sites-available/project.conf /etc/nginx/sites-enabled/
sudo nginx -t                     # <-- cek syntax
sudo systemctl restart nginx      # <-- restart Nginx supaya config berlaku
Enter fullscreen mode Exit fullscreen mode

💡 Note:

  • Nama file config (project.conf) bisa diganti sesuai project, tapi harus konsisten saat ln -s
  • server_name harus sama dengan subdomain / domain yang sudah diarahkan di DNS
  • proxy_pass harus sesuai port Gunicorn/Uvicorn yang kamu pakai

6️⃣ Pasang SSL Gratis dengan Let’s Encrypt

Catatan: ganti project.example.com dengan subdomain atau domain yang sudah diarahkan ke server kamu.

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d project.example.com   # <-- ganti sesuai domain/subdomain kamu
Enter fullscreen mode Exit fullscreen mode

💡 Tips & Catatan:

  • Ikuti instruksi di layar untuk verifikasi domain dan otomatis konfigurasi HTTPS.
  • Setelah selesai, Certbot akan otomatis men-setup redirect HTTP → HTTPS.
  • Untuk perpanjangan SSL otomatis, Certbot biasanya sudah menambahkan cron job. Bisa cek dengan:
  sudo systemctl status certbot.timer
  • Pastikan domain/subdomain sudah propagasi di DNS sebelum menjalankan Certbot.

7️⃣ Opsi Subdomain

Catatan Umum:

  • Ganti project atau project.example.com sesuai nama project/subdomain kamu
  • Pastikan DNS domain/subdomain sudah diarahkan ke server atau tunnel sebelum testing
  • Pilih opsi sesuai kondisi IP server: statik atau dinamis

Opsi 1 – Arahkan langsung ke IP publik

Kalau server punya IP publik statik (atau pakai Dynamic DNS):

  1. Login ke Cloudflare → pilih domain → DNS.
  2. Tambah A record:
  • Name: project # <-- ganti sesuai subdomain
  • Type: A
  • Content: IP publik Raspberry Pi # <-- ganti sesuai IP server
  • Proxy status: Proxied / DNS only

    1. Port forwarding di router (kalau ada):
  • Port 80 → Raspberry Pi

  • Port 443 → Raspberry Pi

Kelebihan: Cepat, langsung, bisa pakai Nginx & SSL
Kekurangan: Kalau IP publik berubah (dynamic IP), subdomain putus


Opsi 2 – Pakai Cloudflare Tunnel (Argo Tunnel)

Cocok kalau server IP dinamis atau di belakang NAT.

  1. Install cloudflared:
sudo apt install curl -y
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb -o cloudflared.deb
sudo dpkg -i cloudflared.deb
Enter fullscreen mode Exit fullscreen mode
  1. Login & buat tunnel:
cloudflared tunnel login
cloudflared tunnel create project-tunnel   # <-- ganti nama tunnel sesuai project
Enter fullscreen mode Exit fullscreen mode
  1. Hubungkan subdomain:
cloudflared tunnel route dns project.example.com project-tunnel   # <-- ganti domain/subdomain
Enter fullscreen mode Exit fullscreen mode
  1. Jalankan tunnel:
cloudflared tunnel run project-tunnel
Enter fullscreen mode Exit fullscreen mode

Kelebihan: Tidak perlu port forwarding, aman, HTTPS otomatis
Kekurangan: Harus jalankan tunnel di background atau sebagai systemd service

💡 Tips:

  • Bisa buat systemd service untuk tunnel supaya otomatis jalan tiap boot
  • Pastikan subdomain sudah terpropagasi di DNS sebelum menjalankan tunnel

Biar cloudflared tunnel jalan otomatis TANPA kamu harus ngetik:

cloudflared tunnel run project-tunnel
Enter fullscreen mode Exit fullscreen mode

Setiap kali boot Raspberry Pi, kamu harus bikin service systemd khusus untuk Cloudflare Tunnel.

Langsung aja—ini cara paling rapi & benar:


1. Buat file service systemd

sudo vim /etc/systemd/system/cloudflared.service
Enter fullscreen mode Exit fullscreen mode

Isi file:

[Unit]
Description=Cloudflare Tunnel
After=network-online.target
Wants=network-online.target

[Service]
User=pi
Group=pi
ExecStart=/usr/bin/cloudflared tunnel run project-tunnel
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
Enter fullscreen mode Exit fullscreen mode

Catatan penting:

  • project-tunnel → sesuaikan dengan nama tunnel kamu cek dengan:
  cloudflared tunnel list
  • Lokasi cloudflared biasanya /usr/bin/cloudflared. Cek dengan:
  which cloudflared

2. Reload systemd dan aktifkan service

sudo systemctl daemon-reload
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
sudo systemctl status cloudflared
Enter fullscreen mode Exit fullscreen mode

Kalau tampilannya active (running) berarti sukses.


📌 3. Cek apakah tunnel sudah jalan

cloudflared tunnel list
Enter fullscreen mode Exit fullscreen mode

Harusnya status-nya HEALTHY.


🎉 Setelah ini:

✔ Cloudflare Tunnel otomatis hidup setelah reboot
✔ Kamu tidak perlu manual run lagi
✔ Website aman tanpa port forwarding

Selesai!
Website kamu sekarang online di subdomain, dan service FastAPI + Gunicorn berjalan otomatis tiap boot.

Top comments (0)