Cara Membuat Server Flask dengan Nginx, MongoDB dan Docker

Flask bagi yang belum tahu adalah web framework berbasis bahasa pemrograman python. Salah satu framework populer ini memang sangat mudah digunakan. Pada tutorial kali ini, kita akan menginstall Flask Framework dengan Docker. Docker sendiri memungkinkan kita membuat lingkungan development yang sama pengalamannya dan mudah pengalamannya.

Syarat:

  • punya akun root atau akun non-root dengan kemampuan sudo,
  • sudah terinstall docker dan docker compose
  • koneksi internet

Langkah 1: Buat file Docker Compose

Buat sebuah folder dengan nama flaskapp misalnya, lalu buat file docker-compose.yml dengan konten seperti ini:

[sourcecode]
version: ‘3’
services:

flask:
build:
context: app
dockerfile: Dockerfile
container_name: flask
image: digitalocean.com/flask-python:3.6
restart: unless-stopped
environment:
APP_ENV: "prod"
APP_DEBUG: "False"
APP_PORT: 5000
MONGODB_DATABASE: flaskdb
MONGODB_USERNAME: flaskuser
MONGODB_PASSWORD: your_mongodb_password
MONGODB_HOSTNAME: mongodb
volumes:
– appdata:/var/www
depends_on:
– mongodb
networks:
– frontend
– backend

mongodb:
image: mongo:4.0.8
container_name: mongodb
restart: unless-stopped
command: mongod –auth
environment:
MONGO_INITDB_ROOT_USERNAME: mongodbuser
MONGO_INITDB_ROOT_PASSWORD: your_mongodb_root_password
MONGO_INITDB_DATABASE: flaskdb
MONGODB_DATA_DIR: /data/db
MONDODB_LOG_DIR: /dev/null
volumes:
– mongodbdata:/data/db
networks:
– backend

webserver:
build:
context: nginx
dockerfile: Dockerfile
image: digitalocean.com/webserver:latest
container_name: webserver
restart: unless-stopped
environment:
APP_ENV: "prod"
APP_NAME: "webserver"
APP_DEBUG: "true"
SERVICE_NAME: "webserver"
ports:
– "80:80"
– "443:443"
volumes:
– nginxdata:/var/log/nginx
depends_on:
– flask
networks:
– frontend

networks:
frontend:
driver: bridge
backend:
driver: bridge

volumes:
mongodbdata:
driver: local
appdata:
driver: local
nginxdata:
driver: local
[/sourcecode]

Langkah 2: Bikin Template Server Flask dengan Dockerfile

Pada folder diatas tadi, silakan bikin folder app lalu bikin file Dockerfile dengan konten:

[sourcecode]
FROM python:3.6.8-alpine3.9

LABEL MAINTAINER="FirstName LastName <[email protected]>"

ENV GROUP_ID=1000 \
USER_ID=1000

WORKDIR /var/www/

ADD . /var/www/
RUN pip install -r requirements.txt
RUN pip install gunicorn

RUN addgroup -g $GROUP_ID www
RUN adduser -D -u $USER_ID -G www www -s /bin/sh

USER www

EXPOSE 5000

CMD [ "gunicorn", "-w", "4", "–bind", "0.0.0.0:5000", "wsgi"]
[/sourcecode]

pada folder /flaskapp buat folder nginx, kemudian file Dockerfile:

[sourcecode]
FROM digitalocean.com/alpine:latest

LABEL MAINTAINER="FirstName LastName <[email protected]>"

RUN apk –update add nginx && \
ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log && \
mkdir /etc/nginx/sites-enabled/ && \
mkdir -p /run/nginx && \
rm -rf /etc/nginx/conf.d/default.conf && \
rm -rf /var/cache/apk/*

COPY conf.d/app.conf /etc/nginx/conf.d/app.conf

EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
[/sourcecode]

lalu buat Reverse Proxy dengan Nginx. buat folder /flaskapp/nginx/conf.d/. buat file app.conf.

[sourcecode]
upstream app_server {
server flask:5000;
}

server {
listen 80;
server_name _;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
client_max_body_size 64M;

location / {
try_files $uri @proxy_to_app;
}

location @proxy_to_app {
gzip_static on;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_buffering off;
proxy_redirect off;
proxy_pass http://app_server;
}
}
[/sourcecode]

Langkah 3: Contoh Aplikasi Flask

Contoh bikin sebuah file bernama /app/app.py dengan contoh:

[sourcecode language=”python”]
import os
from flask import Flask, request, jsonify
from flask_pymongo import PyMongo

application = Flask(__name__)

application.config["MONGO_URI"] = ‘mongodb://’ + os.environ[‘MONGODB_USERNAME’] + ‘:’ + os.environ[‘MONGODB_PASSWORD’] + ‘@’ + os.environ[‘MONGODB_HOSTNAME’] + ‘:27017/’ + os.environ[‘MONGODB_DATABASE’]

mongo = PyMongo(application)
db = mongo.db

@application.route(‘/’)
def index():
return jsonify(
status=True,
message=’Welcome to the Dockerized Flask MongoDB app!’
)

@application.route(‘/todo’)
def todo():
_todos = db.todo.find()

item = {}
data = []
for todo in _todos:
item = {
‘id’: str(todo[‘_id’]),
‘todo’: todo[‘todo’]
}
data.append(item)

return jsonify(
status=True,
data=data
)

@application.route(‘/todo’, methods=[‘POST’])
def createTodo():
data = request.get_json(force=True)
item = {
‘todo’: data[‘todo’]
}
db.todo.insert_one(item)

return jsonify(
status=True,
message=’To-do saved successfully!’
), 201

if __name__ == "__main__":
ENVIRONMENT_DEBUG = os.environ.get("APP_DEBUG", True)
ENVIRONMENT_PORT = os.environ.get("APP_PORT", 5000)
application.run(host=’0.0.0.0′, port=ENVIRONMENT_PORT, debug=ENVIRONMENT_DEBUG)
[/sourcecode]

lalu buat file wsgi.py dengan konten:

[sourcecode]
from app import application

if __name__ == "__main__":
application.run()
[/sourcecode]

Langkah 4: Build Container dan Coba

Pastikan semua langkah diatas sudah di ikuti, lalu jalankan docker-compose untuk membuat stack server Nginx, Flask/Python, dan MongoDB.

[sourcecode]docker-compose up -d[/sourcecode]

dan coba dengan:
[sourcecode]curl -i http://your_server_ip/todo[/sourcecode]

Scroll to Top