Deploy Django Backend ke EC2 dengan Gunicorn + Nginx + Supabase π οΈ β
π 1. Membuat Instance EC2 β
AWS EC2 (Amazon Elastic Compute Cloud) adalah layanan server virtual di cloud yang disediakan oleh AWS. Gampangnya, EC2 itu kayak kamu sewa komputer/server di internet yang bisa kamu pakai buat install sistem operasi, jalankan aplikasi, hosting website, dan lainnya.
π§ Konsep Dasar EC2: β
| Konsep | Penjelasan |
|---|---|
| Instance | Satu unit βserver virtualβ yang kamu jalankan |
| AMI (Amazon Machine Image) | Template OS (misal Ubuntu, Windows, Amazon Linux) |
| Instance Type | Menentukan spek server (CPU, RAM, dsb), contoh: t2.micro, t3.large |
| Elastic IP | Alamat IP publik tetap yang bisa kamu hubungkan ke instance |
| Security Group | Firewall-nya EC2 (atur port yang boleh diakses, misal port 22 untuk SSH, 80 untuk HTTP) |
πΈ Apakah Berbayar? β
Ya, berbayar, tapi kamu bisa pakai Free Tier:
- 750 jam per bulan untuk
t2.micro(cukup untuk 1 server nyala nonstop sebulan penuh) - Gratis 12 bulan pertama
π§© EC2 vs Layanan Lain? β
| Layanan | Fungsi | Cocok Untuk |
|---|---|---|
| EC2 | Full control server | Web server, app, database |
| Lambda | Jalankan fungsi tanpa server | Otomatisasi, microservice |
| Elastic Beanstalk | Deploy app otomatis | Developer yang nggak mau ribet setup EC2 |
| Lightsail | Simpel, mirip VPS | Website kecil, pemula |
Langkah-langkah β
- Buka AWS Console β EC2 β Launch Instance.
- Pilih OS: Ubuntu Server 22.04 (gratis dalam free tier).
- Pilih tipe:
t2.micro(untuk free tier). - Buat/gunakan key pair (misalnya:
your-key.pem). - Atur Security Group: buka port 22 (SSH), 80 (HTTP), dan 443 (HTTPS).
β Setelah berhasil launch, catat public IPv4 address untuk digunakan pada SSH dan SCP.
β Tips Setup Security Group EC2 yang Aman β
1. Hanya buka port yang diperlukan β
Jangan buka semua port ke publik!
| Port | Fungsi | Kapan dibuka? |
|---|---|---|
22 | SSH (akses ke server) | Hanya untuk IP kamu sendiri, jangan 0.0.0.0/0 |
80 | HTTP (website) | Kalau kamu hosting web tanpa HTTPS |
443 | HTTPS | Untuk web yang pakai SSL |
3306 | MySQL | Jangan dibuka ke publik! Cukup local IP atau VPC |
5432 | PostgreSQL | Sama, hanya untuk internal/whitelist |
8000, 5000, 3000 | Port dev Django, Node, dll | Hanya sementara untuk testing, idealnya non-public |
π Contoh konfigurasi aman: β
Port: 22 | Source: Custom IP β [alamat IP kamu] (misalnya: 36.74.20.55/32)
Port: 80 | Source: Anywhere (0.0.0.0/0)
Port: 443 | Source: Anywhere (0.0.0.0/0)2. Gunakan IP Whitelist β
- Jangan asal pakai
0.0.0.0/0untuk port sensitif seperti SSH, MySQL. - Gunakan
/32untuk hanya 1 IP. Misal:36.74.20.55/32 β hanya bisa diakses dari satu IP ini
3. Gunakan Bastion Host (kalau kompleks) β
Kalau kamu punya banyak EC2, jangan semua bisa SSH. Gunakan 1 EC2 (bastion) sebagai gerbang masuk, lalu akses internal EC2 lain lewat private network.
4. Hapus Rule yang Nggak Dipakai β
Jangan biarkan port terbuka kalau udah nggak kamu gunakan. Tutup akses ke port seperti:
8000,8080,3000, dst. setelah development selesai- Port database kalau nggak perlu remote access
5. Gunakan Security Group Terpisah per Role β
Misal:
- SG-Web: hanya untuk web (port 80/443)
- SG-DB: hanya untuk MySQL/PostgreSQL (tidak menerima publik)
- SG-SSH: hanya untuk SSH dan dari IP kamu
Hindari Password Login via SSH β
- Gunakan key-pair (.pem) yang disediakan AWS saat buat EC2.
- Disable password login di konfigurasi SSH (
/etc/ssh/sshd_config).
π 2. Remote Server via SSH β
Perintah Login dari PowerShell: β
ssh -i your-key.pem ubuntu@<EC2-IP>π§ Note: Pastikan permission file .pem benar:
chmod 400 your-key.pemJika berhasil, kamu akan melihat prompt seperti:
ubuntu@ip-172-31-xx-xx:~$π¦ 3. Upload Project ke Server β
Perintah upload file dari lokal ke server: β
scp -i your-key.pem yourproject_backend.zip ubuntu@<EC2-IP>:/home/ubuntu/Setelah itu remote kembali via SSH dan cek file:
lsKalau file belum bisa dibuka:
sudo apt update && sudo apt install unzip
unzip yourproject_backend.zipπ 4. Install Python + Django β
Django adalah framework web berbasis Python yang bersifat open-source dan dirancang untuk memudahkan pembuatan aplikasi web dengan cepat, aman, dan terstruktur. Django sangat populer di kalangan developer karena:
π§ Fitur Utama Django: β
- MTV (Model-Template-View): Mirip dengan MVC, tapi dengan istilah yang sedikit berbeda.
- ORM (Object-Relational Mapping): Menghubungkan database dengan model Python secara otomatis, tanpa perlu banyak SQL.
- Admin Panel Otomatis: Django bisa secara otomatis membuat halaman admin dari model database.
- Routing URL yang fleksibel: Mudah mengatur URL dan views sesuai kebutuhan.
- Keamanan Tinggi: Melindungi dari serangan seperti CSRF, XSS, SQL injection, dll.
- Skalabilitas dan Modularitas: Cocok untuk proyek kecil maupun besar.
π Contoh Penggunaan Django: β
- Aplikasi web seperti blog, toko online, manajemen pengguna, forum.
- Backend untuk aplikasi mobile.
- Sistem manajemen konten (CMS).
β‘ Contoh Kode Sederhana: β
# models.py
from django.db import models
class Artikel(models.Model):
judul = models.CharField(max_length=100)
isi = models.TextField()
# views.py
from django.shortcuts import render
from .models import Artikel
def index(request):
artikel = Artikel.objects.all()
return render(request, 'index.html', {'artikel': artikel})Cek dan install Python: β
sudo apt update
sudo apt install python3 python3-pip python3-venvSetup Virtual Environment: β
python3 -m venv venv
tsource venv/bin/activateInstall dependensi dari requirements.txt: β
pip install -r requirements.txtπ Gunakan requirements.txt yang sudah kamu buat di lokal.
π₯ 5. Jalankan Django β
Cek struktur direktori: β
Pastikan kamu pakai struktur apps/ di dalam proyek Django.
.
βββ manage.py
βββ apps/
βββ yourproject/
βββ requirements.txtJalankan server dev (untuk cek awal): β
python manage.py runserver 0.0.0.0:8000Coba akses di browser: http://<EC2-IP>:8000
πΏοΈ 6. Setup Gunicorn (WSGI Server) β
Gunicorn adalah WSGI HTTP Server untuk aplikasi Python seperti Django. Dibutuhkan agar Django bisa jalan di production dengan performa optimal dan memungkinkan multiple worker (multi-process), jadi aplikasimu bisa melayani banyak permintaan secara paralel (lebih cepat dan stabil).
Kenapa nggak pakai python manage.py runserver? β
runserverhanya untuk development.- Tidak aman dan tidak efisien untuk production (nggak bisa handle banyak trafik).
- Gunicorn lebih cepat, stabil, dan cocok untuk deployment.
π₯ Apa itu systemd? β
systemd adalah sistem init di Linux yang bisa menjalankan service saat booting dan menjaga proses tetap hidup. Jadi kalau server di-restart, Gunicorn jalan otomatis.
π‘ Fungsi dan Manfaat Jalankan Gunicorn via systemd β
| Fitur | Fungsi |
|---|---|
| β Auto-start | Gunicorn jalan otomatis saat server reboot |
| β Logging | Mudah di-log dengan journalctl |
| β Restart otomatis | Kalau crash, bisa otomatis di-restart |
| β Bisa di-manage | Start/Stop/Restart lebih rapi: |
sudo systemctl start gunicorn
sudo systemctl stop gunicorn
sudo systemctl restart gunicornLangkah-langkahnya adalah:
Install Gunicorn: β
pip install gunicornJalankan Gunicorn: β
gunicorn yourproject.wsgi:application --bind 0.0.0.0:8000Kalau jalan, lanjut bikin service:
Konfigurasi gunicorn.service: β
# /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/yourproject
ExecStart=/home/ubuntu/yourproject/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/yourproject/yourproject.sock yourproject.wsgi:application
[Install]
WantedBy=multi-user.targetJalankan dan enable: β
sudo systemctl start gunicorn
sudo systemctl enable gunicornCek status:
sudo systemctl status gunicornπ 7. Setup Nginx (Reverse Proxy) β
Nginx digunakan sebagai reverse proxy. Ia meneruskan request dari port 80/443 ke Gunicorn (yang biasanya berjalan di socket atau port internal).
Install Nginx: β
sudo apt install nginxKonfigurasi Nginx: β
sudo nano /etc/nginx/sites-available/yourprojectIsi dengan:
server {
listen 80;
server_name your-ec2-ip;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/ubuntu/yourproject;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/ubuntu/yourproject/yourproject.sock;
}
}Aktifkan konfigurasi:
sudo ln -s /etc/nginx/sites-available/yourproject /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginxCek akses: http://<EC2-IP> π₯
π§© 8. Connect ke Supabase β
Supabase adalah backend-as-a-service yang menyediakan fitur database PostgreSQL + autentikasi + API siap pakai.
Gunakan URL dan anon/public key dari Supabase: β
SUPABASE_URL=https://xyzcompany.supabase.co
SUPABASE_KEY=public-anon-keyGunakan di Django via python-dotenv atau langsung di settings.py.
π Gunakan psycopg2 untuk koneksi database PostgreSQL:
pip install psycopg2-binaryπ§± 9. Django REST Framework (DRF) β
Django REST Framework (DRF) adalah library powerful untuk membangun API (Application Programming Interface) menggunakan Django. DRF (Django REST Framework) mempermudah kita membangun RESTful API dengan Django.
Kalau Django itu buat bikin web app (HTML-based), maka DRF itu buat bikin backend RESTful API β bisa diakses oleh frontend (misalnya React, Flutter, atau aplikasi mobile).
π¦ Fitur Utama DRF: β
| Fitur | Penjelasan |
|---|---|
| β Serializer | Mengubah data Python (QuerySet, Model) jadi JSON, dan sebaliknya. |
| β Viewsets & Routers | Otomatis generate endpoint (GET, POST, PUT, DELETE) dengan sedikit kode. |
| β Authentication & Permissions | Mudah atur login, token, dan hak akses pengguna. |
| β Browsable API | Ada UI web interaktif untuk tes API langsung di browser (enak banget buat debugging!). |
| β Support Format | Bisa hasilkan response dalam format JSON, XML, dll. |
| β Pagination, Filtering, Search | Fitur-fitur API lengkap built-in. |
Install dan aktivasi: β
pip install djangorestframework# settings.py
INSTALLED_APPS = [
...
'rest_framework',
]Mulai buat views, serializers, dan routes.
π Contoh Sederhana: API untuk Buku β
# models.py
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)# serializers.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'# views.py
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer# urls.py
from rest_framework.routers import DefaultRouter
from .views import BookViewSet
router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns = router.urlsβ‘οΈ Setelah itu kamu bisa akses:
GET /books/(list semua buku)POST /books/(tambah buku)GET /books/1/(detail buku)PUT /books/1/,DELETE /books/1/dll
π Contoh Fitur Otentikasi: β
DRF bisa digabung dengan:
- Token Auth (
rest_framework.authtoken) - JWT (pakai
SimpleJWT) - OAuth2 (pakai
django-oauth-toolkit) - Session Auth Django
π§Ύ Perintah-perintah File Permission di Linux β
π 1. Cek permission β
ls -lContoh output:
-rw-r--r-- 1 ubuntu ubuntu 1234 Apr 24 10:00 file.txtArti -rw-r--r--:
r= readw= writex= execute- urutannya:
owner | group | others
π 2. Ubah permission (chmod) β
chmod [opsi] [file]Contoh:
chmod 600 file.pem # Hanya owner bisa baca/tulis
chmod 755 script.sh # Owner bisa semua, yang lain bisa baca & eksekusi
chmod +x program.sh # Tambahkan izin eksekusiAngka dalam chmod:
| Angka | Artinya |
|---|---|
| 7 | read + write + execute |
| 6 | read + write |
| 5 | read + execute |
| 4 | read |
| 0 | tidak ada izin |
π€ 3. Ubah pemilik file (chown) β
chown username:group file.txtContoh:
chown ubuntu:ubuntu file.txtπ 4. Ubah group file (chgrp) β
chgrp groupname file.txtπ§° Contoh Kasus Praktis β
Kamu punya file rahasia.txt yang cuma kamu sendiri yang boleh baca:
chmod 600 rahasia.txtKamu buat skrip backup.sh yang perlu bisa dijalankan:
chmod +x backup.shπ Saran Keamanan File & Data di Linux β
β 1. Gunakan Permission yang Sesuai β
- Jangan kasih akses
777sembarangan! Ini berarti semua orang bisa baca, tulis, dan eksekusi. - Untuk file sensitif (seperti
.pem, config DB), gunakan600.
β 2. Batasi Akses Root β
- Jangan login langsung sebagai
root - Gunakan
sudohanya saat dibutuhkan
β
3. Gunakan ufw (firewall) β
sudo ufw enable
sudo ufw allow ssh
sudo ufw allow 80β 4. Audit file penting secara berkala β
Gunakan ls -l atau find untuk cek permission yang aneh:
find / -type f -perm 777β 5. Backup dan enkripsi file sensitif β
Pakai gpg atau openssl untuk enkripsi file:
gpg -c rahasia.txtπ§° Kumpulan Command Penting di Server β
| Perintah | Keterangan |
|---|---|
ls | Lihat isi direktori |
cd | Pindah direktori |
cp file tujuan/ | Copy file |
mv file tujuan/ | Pindah/rename file |
rm file | Hapus file |
chmod 600 file.pem | Ubah permission aman file (khusus SSH) |
chown user:group file | Ganti pemilik file |
cat file.txt | Tampilkan isi file |
nano file / vim file | Edit file |
systemctl status <service> | Lihat status service (misal gunicorn) |
journalctl -u gunicorn | Lihat log gunicorn |
df -h | Lihat penggunaan disk |
htop / top | Cek resource server |
β¨ Kalau ada error atau service tidak jalan, baca log dan cek konfigurasi satu per satu. Kamu selalu bisa restart service atau cek port yang sedang digunakan dengan:
sudo lsof -i :8000