Deployment Aplikasi Flask ke Production

Deployment Aplikasi Flask ke Production

Sun Jun 07 2026
558 words · 5 minutes

Di artikel ini, kita akan membahas cara mendeploy aplikasi Flask ke production dengan praktik terbaik tahun 2026. Kita akan fokus pada pendekatan yang paling umum dan direkomendasikan: menggunakan Gunicorn + Nginx + Docker.


1. Persiapan Aplikasi untuk Production

Sebelum deploy, pastikan aplikasi Anda sudah siap production:

Checklist Persiapan

  • Matikan debug=True
  • Gunakan environment variables untuk konfigurasi sensitif
  • Gunakan production database (PostgreSQL/MySQL, bukan SQLite)
  • Aktifkan logging yang baik
  • Siapkan requirements.txt atau pyproject.toml
  • Gunakan Application Factory pattern
  • Siapkan konfigurasi terpisah (Development, Production, Testing)

Contoh config.py

import os
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard-to-guess-string'
SQLALCHEMY_TRACK_MODIFICATIONS = False
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///dev.db'
class ProductionConfig(Config):
DEBUG = False
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
config = {
'development': DevelopmentConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}

2. Menggunakan Gunicorn sebagai WSGI Server

Flask development server (app.run()) tidak boleh digunakan di production.

Gunakan Gunicorn:

Terminal window
pip install gunicorn

Menjalankan dengan Gunicorn

Terminal window
gunicorn -w 4 -b 0.0.0.0:8000 "app:create_app('production')"

Penjelasan flag:

  • -w 4 → 4 worker processes (sesuaikan dengan jumlah CPU)
  • -b 0.0.0.0:8000 → Bind ke semua interface di port 8000
  • "app:create_app('production')" → Application factory

Rekomendasi Jumlah Worker

(2 x $num_cores) + 1

Contoh: Server dengan 2 core → gunakan 5 worker.


3. Nginx sebagai Reverse Proxy

Nginx bertugas menerima request dari internet dan meneruskannya ke Gunicorn.

Instalasi Nginx

Terminal window
sudo apt update
sudo apt install nginx

Konfigurasi Nginx

Buat file konfigurasi:

Terminal window
sudo nano /etc/nginx/sites-available/myapp

Isi dengan:

server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static {
alias /path/to/your/app/static;
}
}

Aktifkan konfigurasi:

Terminal window
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

4. Deployment dengan Docker (Rekomendasi 2026)

Docker adalah cara terbaik untuk deployment Flask saat ini karena konsistensi environment.

Dockerfile

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:create_app('production')"]

docker-compose.yml

version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
environment:
- FLASK_ENV=production
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:

Jalankan dengan:

Terminal window
docker-compose up -d --build

5. Environment Variables & Secrets

Jangan pernah hardcode secret di kode.

Gunakan .env file (dengan python-dotenv atau Docker secrets).

Contoh variabel penting:

SECRET_KEY=super-secret-key-here
DATABASE_URL=postgresql://user:password@localhost/mydb
FLASK_ENV=production

6. Mengamankan dengan SSL/TLS (HTTPS)

Menggunakan Let’s Encrypt + Certbot

Terminal window
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Certbot akan otomatis memperbarui sertifikat dan mengkonfigurasi Nginx.


7. Process Management

Jika tidak menggunakan Docker, gunakan systemd untuk menjalankan Gunicorn secara otomatis.

Buat service file:

Terminal window
sudo nano /etc/systemd/system/myapp.service

Isi:

[Unit]
Description=Gunicorn instance for my Flask app
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/path/to/your/app
Environment="PATH=/path/to/venv/bin"
ExecStart=/path/to/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 "app:create_app('production')"
[Install]
WantedBy=multi-user.target

Aktifkan:

Terminal window
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp

8. Logging di Production

Tambahkan konfigurasi logging di aplikasi:

import logging
from logging.handlers import RotatingFileHandler
if not app.debug:
file_handler = RotatingFileHandler('app.log', maxBytes=10240, backupCount=10)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
))
file_handler.setLevel(logging.INFO)
app.logger.addHandler(file_handler)

9. Best Practices Deployment Flask

AspekRekomendasi
WSGI ServerGunicorn (bukan Flask dev server)
Reverse ProxyNginx
ContainerizationDocker + Docker Compose
DatabasePostgreSQL (bukan SQLite)
HTTPSWajib pakai Let’s Encrypt
Environment VariablesJangan simpan secret di kode
Zero Downtime DeployGunakan Blue-Green deployment atau Docker rolling update
MonitoringGunakan Sentry, Prometheus + Grafana, atau Netdata
BackupBackup database secara berkala

10. Alternatif Platform Deployment

Jika tidak ingin mengelola server sendiri:

PlatformKelebihanKekuranganCocok Untuk
RenderMudah, gratis tier tersediaVendor lock-inProyek kecil-menengah
RailwayDeveloper experience sangat baikBiaya bisa naikStartup & indie hacker
HerokuSudah matangMahal untuk productionPrototipe & testing
VPS (DigitalOcean, Hetzner, Linode)Kontrol penuh & murahHarus manage sendiriProduction skala menengah+
Docker Swarm / KubernetesScalability tinggiKompleksAplikasi besar

Kesimpulan

Deployment yang baik adalah kombinasi antara keamanan, stabilitas, dan kemudahan pemeliharaan. Dengan menggunakan:

  • Gunicorn sebagai WSGI server
  • Nginx sebagai reverse proxy
  • Docker untuk konsistensi environment
  • Let’s Encrypt untuk HTTPS

Anda sudah memiliki fondasi deployment yang solid dan profesional.

Ingat: Deployment bukanlah sekali jadi. Terus monitor performa, update dependensi, dan backup data secara berkala.


Thanks for reading!

Deployment Aplikasi Flask ke Production

Sun Jun 07 2026
558 words · 5 minutes