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
2οΈβ£ Clone Project
Catatan:
- Ganti
username/project.gitsesuai 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
Kalau pakai Poetry:
sudo pip install poetry
poetry install # <-- otomatis install dependency dari pyproject.toml
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
π‘ Tips:
- Pastikan branch yang ingin dijalankan sesuai kebutuhan (
git checkout branch-name)- Kalau pakai Poetry, pastikan
poetry shellatau jalankan dengan.venv/bin/pythonsesuai virtual environment
3οΈβ£ Test FastAPI Lokal
gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
Buka browser
http://127.0.0.1:8000harus 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
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
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
π‘ Note:
- Nama service (
project) harus konsisten di/etc/systemd/system/dan saat enable/start- Path
WorkingDirectorydanExecStartharus 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
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;
}
}
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
π‘ Note:
- Nama file config (
project.conf) bisa diganti sesuai project, tapi harus konsisten saatln -sserver_nameharus sama dengan subdomain / domain yang sudah diarahkan di DNSproxy_passharus 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
π‘ 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
projectatauproject.example.comsesuai 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):
- Login ke Cloudflare β pilih domain β DNS.
- Tambah A record:
-
Name:
project# <-- ganti sesuai subdomain -
Type:
A - Content: IP publik Raspberry Pi # <-- ganti sesuai IP server
-
Proxy status: Proxied / DNS only
- 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.
- 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
- Login & buat tunnel:
cloudflared tunnel login
cloudflared tunnel create project-tunnel # <-- ganti nama tunnel sesuai project
- Hubungkan subdomain:
cloudflared tunnel route dns project.example.com project-tunnel # <-- ganti domain/subdomain
- Jalankan tunnel:
cloudflared tunnel run project-tunnel
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
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
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
Catatan penting:
project-tunnelβ sesuaikan dengan nama tunnel kamu cek dengan:cloudflared tunnel list
- Lokasi
cloudflaredbiasanya/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
Kalau tampilannya active (running) berarti sukses.
π 3. Cek apakah tunnel sudah jalan
cloudflared tunnel list
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)