Deploy Django application trên DigitalOcean

Django là framework-web đã có lịch sử 11 năm tuổi của ngôn ngữ python. Với cộng đồng phát triển lâu đời, việc phát triển ứng dụng web trở nên dễ dàng. Hôm nay tôi sẽ hướng dẫn cách deploy một ứng dụng django trên DigitalOcean.
Mọi ứng dụng web đều yêu cầu database để lưu trữ dữ liệu. Trong bài viết tôi sẽ sử dụng PostgreSQL và web server Nginx. Với những bạn lần đầu deploy có thể tìm hiểu thêm về Nginx tại đây.

Local File Directory Structure

Chúng ta sẽ deploy project Django có tên myproject lên server. Ứng dụng có cấu trúc thư mục:

    myproject
        manage.py
        myproject
            __init__.py
            settings.py
            urls.py
            wsgi.py

Trong file setting chúng ta sẽ có thiết lập database và static file:

DATABASES = {
  'default': {
      'ENGINE': 'django.db.backends.postgresql_psycopg2',
      'NAME': 'mydb',
      'USER': 'myuser',
      'PASSWORD': 'password',
      'HOST': 'localhost',
      'PORT': '',
  }
}

STATIC_ROOT = os.path.join(BASE_DIR, "static/")
STATIC_URL = '/static/'
STATICFILES_DIRS = [..DIRS..]

SSH and Package Installation

Để thiết lập kết nối ssh tới digital ocean server mọi người tham khảo tại đây. Chúng ta mở terminal và kết nối tới digital ocean server

ssh -l root

Để quản lý các gói package thư viện python cho chạy ứng dụng, các bạn sử dụng pip:

sudo apt-get update
sudo apt-get install python-pip

Tiếp theo chúng ta phải cài đặt các package cho server để chạy ứng dụng:

# Python and Debian package, python headers and postgresql library for python
sudo apt-get install python-dev libpq-dev

# Postgresql Package
sudo apt-get install postgresql postgresql-contrib

# Nginx Package
sudo apt-get install nginx

sudo apt-get install git

sudo apt-get install gunicorn

Tạo PostgreSQL Database
Chúng ta sẽ tạo người dùng và password cho database:

sudo su postgres

psql

CREATE DATABASE mydb;
CREATE USER myuser WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
\q;
exit

Tạo Python Virtual Environment cho project

sudo pip install virtualenv
mkdir ~/myproject
cd ~/myproject
virtualenv myprojectenv
source myprojectenv/bin/activate

Bây giờ chúng ta có thể cài Django, Gunicorn, and Psycopg2.

pip install django
pip install psycopg2

Mở Gunicorn

Chúng ta start Gunicorn:

gunicorn --bind 0.0.0.0:8000 mydjangoproject.wsgi:application

Picture12.png

Gunicorn dùng để tương tác với ứng dụng, để start hoặc stop ứng dụng theo cách này, chúng ta sẽ tạo script trong file gunicorn.conf:

sudo nano /etc/init/gunicorn.conf
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid root
setgid www-data
chdir /root/myproject

Ở trên chúng ta thiết lập hệ thống chạy ở các mức level từ 0-6:
0 : System Halt
1 : Single User
2-5 : Full multiUser mode
6 : System reboot

Ngoài ra respawn sẽ tự động restart service nếu fails. Để start Gunicorn service.

exec gunicorn --workers 3 --bind unix://mydjangoproject.sock mydjangoproject.wsgi:application

Ở đây, lần đầu tiên chúng ta phải đưa path để gunicorn thực thi và nó sẽ được lưu trong môi trường ảo. Chúng ta sẽ sử dụng socket thay port để communicate với Nginx.

sudo service gunicorn start

Configure Nginx Sau khi Gunicorn được thiết lập , chúng ta có thể configure proxy web để gửi yêu cầu tới nó.
Đầu tiên tạo 1 site myproject cho nginx:

sudo nano /etc/nginx/sites-available/myproject

Tiếp theo add thêm code vào:

server {
    listen 80;
    server_name Your server name or your IP address;
}

Nó sẽ listen mặc định trên cổng 80 và địa chỉ IP. Ở đây bạn có thể thiết lập theo domain của bạn. Tiếp theo bỏ qua cac vấn đề finding favicon:

location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
      root /root/myproject;
}

Chúng ta sẽ trỏ tới file statis trong thư muc myproject/static Sau đó tạo location để match các requests.

location / {
     include proxy_params;
     proxy_pass http://unix:/mydjangoproject.sock;
}

Cuối cùng chúng ta sẽ enable file thiết lập

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

Đến đây chúng ta đã hoàn thành việc setting và bắt đầu start service

sudo service nginx restart

ban có thể đi tới ứng dụng: Picture23.png

Tổng kết Chúng ta đã có DigitalOcean server chạy ứng dụng Django, NGINX, và Gunicorn. mỗi lần có thể update code từ git tới Digital Ocean bằng ssh nhanh chóng, dễ dàng.