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)