Оживи свій Django проект за допомогою Coolify

текст перекладу

Дізнайтесь, як розгорнути ваш Django додаток за допомогою coolify.

pic

Що таке Coolify?

Coolify — це інструмент, який допомагає розгортати вебпроекти. Він заявляє, що є альтернативою Heroku / Netlify / Vercel, яку можна хостити самостійно та яка є відкритим кодом.

Я користуюсь ним уже деякий час для деяких Django проектів (та й інших фреймворків) і це був хороший досвід. Деякі з них вже працюють, наприклад:

  • Join the DJ — платформа для DJ, щоб приймати запити на пісні;
  • Streamliter — платформа для створення додатків Streamlit повністю в браузері;

У цьому посібнику я покажу, як розгорнути Django проект за допомогою coolify на вашому VPS або віртуальній машині.

Я почну з створення нового Django проекту з деякими обраними варіантами. Потім я покажу вам, як розгорнути його за допомогою coolify.

Якщо ви просто хочете побачити кінцевий результат коду, ви можете переглянути репозиторій django-coolify-tutorial.

Найбільший недолік coolify (на мою думку)

Хоча я великий прихильник coolify, він не є ідеальним. У мене є одна основна претензія:

Він не має простого налаштування для безперервного розгортання.

Це означає, що якщо ваш проект стає великим і між побудовою та розгортанням займається певний час, сервер може бути недоступний деякий час. Якщо ви повинні гарантувати відсутність часу простою, можливо, варто розглянути інші рішення. Або, можливо, ви знайшли спосіб уникнути простоїв за допомогою coolify та docker — у такому разі, будь ласка, поділіться зі мною (можете зв’язатися зі мною через x або email).

Передумови

1. VPS, віртуальна машина або ваш власний сервер.

Вам потрібно мати якийсь сервер для запуску coolify.

Рекомендую орендувати машину на Hetzner (це може бути всього $5/місяць). Це просто і дешево. Просто дотримуйтесь інструкцій і переконайтеся, що ви можете підключитися через ssh.

Або ж ви можете використовувати Digital Ocean, будь-якого іншого постачальника хмарних послуг або навіть власний самостійно розгорнутий сервер.

2. Встановлений Coolify на сервері

Інструкції з встановлення Coolify досить прості. Ви можете слідувати їм тут.

Наприкінці встановлення у вас має бути запущена інстанція coolify на сервері, доступна за адресою http://:8000.

Django проект

Для нашого Django проекту ми будемо використовувати:

  • whitenoise для обслуговування статичних файлів;
  • python-decouple для завантаження змінних середовища;
  • postgres як базу даних. Ми могли б використати sqlite, але я покажу, як використовувати postgres для управління базою даних coolify;
  • gunicorn як вебсервер.

Ви можете використовувати будь-які інші налаштування, але це те, що я рекомендую для швидкого старту.

1. Встановлення залежностей

У новій директорії почнемо з створення віртуального середовища та встановлення залежностей:

mkdir djproject  
cd djproject  
python -m venv .venv  
source .venv/bin/activate  
pip install django whitenoise python-decouple gunicorn psycopg2-binary dj-database-url

Також створіть файл requirements.txt:

pip freeze > requirements.txt

Якщо ви надаєте перевагу використанню poetry, ви можете зробити це так:

mkdir djproject  
cd djproject  
poetry init  
poetry add django whitenoise python-decouple gunicorn psycopg2-binary dj-database-url

У наступних кроках я надам інструкції/код для обох варіантів (poetry і pip).

2. Створення бази даних

Локально ви можете просто використовувати sqlite або мати запущену базу даних postgres — код оброблятиме обидва варіанти.
текст перекладу

Якщо ви використовуєте sqlite, можете пропустити цей крок.

Якщо ви хочете використовувати postgres локально, ви можете створити нову базу даних за допомогою наступних команд (припускаючи, що ви використовуєте за замовчуванням користувача postgres):

sudo -u postgres psql  
CREATE DATABASE djproject;

Отриманий URL для бази даних має виглядати так:

postgres://postgres:postgres@localhost:5432/djproject

Залежно від вашої налаштування, вам, можливо, потрібно буде змінити користувача, пароль або порт. Збережіть цю змінну для подальшого використання.

3. Створення Django проекту

Тепер створимо новий Django проект під назвою djproject (в середині вже створеної директорії djproject):

django-admin startproject djproject .

У вас повинна бути наступна структура:

djproject/ # коренева директорія  
 manage.py  
 djproject/   
 __init__.py  
 asgi.py  
 settings.py  
 urls.py  
 wsgi.py  
 requirements.txt # або pyproject.toml, pyproject.lock тощо

4. Налаштування Django проекту

Тепер ми можемо завантажити змінні середовища за допомогою python-decouple і відредагувати файл djproject/settings.py. Ви можете переглянути кінцевий файл налаштувань тут.

4.1 — Імпорти

На початку файлу djproject/settings.py додайте наступні імпорти:

# djproject/settings.py  
from decouple import config  
import dj_database_url

4.2 — Завантаження змінних середовища

Додамо деякі налаштування для завантаження змінних середовища:

# djproject/settings.py  
SECRET_KEY = config('SECRET_KEY', default='django-insecure-siqce7e*%*426p$)2hxgk0u-b11vht*fiz_mj+6z4=tbnn7la3')  

DEBUG = config('DEBUG', default=True, cast=bool)  

ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='localhost,127.0.0.1', cast=lambda x: [i.strip() for i in x.split(',')])  

CSRF_TRUSTED_ORIGINS = config('CSRF_TRUSTED_ORIGINS', default='http://localhost:8000,http://127.0.0.1:8000', cast=lambda x: [i.strip() for i in x.split(',')])
  • SECRET_KEY — це випадковий рядок, який Django використовує для забезпечення сесій. Локально можна використовувати значення за замовчуванням, але ми згенеруємо новий у продакшн середовищі.
  • DEBUG — за замовчуванням встановлений на True, що нам підходить для розробки. В продакшн ми встановимо його на False.
  • ALLOWED_HOSTS — список хостів, з яких сервер буде приймати з'єднання. У розробці ми встановлюємо його на localhost,127.0.0.1. В продакшн на доменне ім'я сервера.
  • CSRF_TRUSTED_ORIGINS — список джерел, з яких сервер буде приймати запити CSRF. В розробці встановлюємо на http://localhost:8000,http://127.0.0.1:8000. В продакшн на доменне ім'я сервера (з протоколом http).

4.3 — Налаштування бази даних

Додамо наступні налаштування для налаштування бази даних:

# djproject/settings.py  
DATABASES = {  
 "default": dj_database_url.config(  
 default=config("DATABASE_URL", f"sqlite:///{BASE_DIR}/db.sqlite3"),  
 conn_max_age=600,  
 ssl_require=False,  
 ),  
}

Ми використовуємо бібліотеку dj_database_url для парсингу змінної середовища DATABASE_URL та налаштування бази даних.

4.4 — Налаштування статичних файлів та whitenoise

Додамо також STATIC_ROOT до файлу settings.py, щоб ми могли збирати статичні файли у продакшн:

STATIC_ROOT = BASE_DIR / 'staticfiles'

Також додамо middleware whitenoise до файлу settings.py, щоб ми могли обслуговувати статичні файли в продакшн:

# djproject/settings.py  

MIDDLEWARE = [  
 ... # інші middleware  
 'whitenoise.middleware.WhiteNoiseMiddleware',  
]

4.5 — Налаштування шаблонів

Додамо також наступні налаштування до файлу settings.py, щоб ми могли додавати шаблони в директорії templates:

# djproject/settings.py  
TEMPLATES = [  
 {  
 ... # інші налаштування   
 'DIRS': [BASE_DIR / 'templates'],  
 ...  
 }

текст перекладу


# інші налаштування  
 },  
]

4.6 — Створення файлу .env

Для відповідності змінам налаштувань, тепер ми можемо створити файл .env локально з наступним вмістом:

# .env - локальні змінні середовища для розробки  

SECRET_KEY=django-insecure-siqce7e*%*426p$)2hxg7la3  
DEBUG=True  
ALLOWED_HOSTS=localhost,127.0.0.1  
CSRF_TRUSTED_ORIGINS=http://localhost:8000,http://127.0.0.1:8000  

# url для бази даних - ви можете залишити його порожнім, якщо використовуєте sqlite  
DATABASE_URL=postgres://postgres:postgres@localhost:5432/djproject

5. Створення головної сторінки

Ми також створимо головну сторінку в файлі templates/index.html, щоб перевірити, чи все працює.

Hello, World!

У нашому demo проекті, ми використовуємо більш багатий макет з mvp.css, але це лише для гарного вигляду, насправді не обов'язково слідувати цьому у даному посібнику. Також ми створимо файл djproject/views.py для домашнього виду:

# djproject/views.py  
from django.shortcuts import render  

def index(request):  
 return render(request, 'index.html')  

та додамо наступне до файлу djproject/urls.py:

# djproject/urls.py  
from django.contrib import admin  
from django.urls import path  
from . import views  

urlpatterns = [  
 path('admin/', admin.site.urls),  
 path('', views.index, name='index'),  
]  

6. Застосування міграцій та запуск Django проекту

Давайте застосуємо міграції та запустимо Django проект:

python manage.py migrate  
python manage.py runserver  

Тепер ви повинні мати змогу отримати доступ до головної сторінки за адресою http://localhost:8000 та адміністративного інтерфейсу за адресою http://localhost:8000/admin.

7. Додавання Docker

Для розгортання Django проекту за допомогою coolify, нам потрібно додати файл Docker і файл docker compose. Ми також додамо скрипт entrypoint для запуску Django проекту.

7.1. Створення Docker файлу

Створимо файл Dockerfile з наступним вмістом:

# Dockerfile  
FROM python:3.12-slim-bookworm  

ENV PYTHONDONTWRITEBYTECODE=1  
ENV PYTHONUNBUFFERED=1  

RUN apt-get update && apt-get install -y \  
 libpq-dev \  
 gcc \  
 && rm -rf /var/lib/apt/lists/*  

RUN mkdir -p /code  
WORKDIR /code  

# Якщо ви хочете використовувати poetry  
RUN pip install poetry  
COPY pyproject.toml poetry.lock /code/  
RUN poetry config virtualenvs.create false  
RUN poetry install --only main --no-root --no-interaction  

# Якщо ви хочете використовувати pip  
COPY requirements.txt /code/  
RUN pip install -r requirements.txt  

COPY . /code  
RUN python manage.py collectstatic --noinput  
RUN chmod +x /code/entrypoint.sh  
RUN chmod +x /code/entrypoint.sh  

У цьому Dockerfile ми встановлюємо залежності, збираємо статичні файли та робимо скрипт entrypoint виконуваним (вам потрібно вибрати між poetry або pip для встановлення залежностей).

7.2. Створення скрипта entrypoint

Створимо файл entrypoint.sh з наступним вмістом:

# entrypoint.sh  
#!/bin/sh  

until cd /code  
do  
 echo "Waiting for server volume..."  
done  

until python manage.py migrate  
do  
 echo "Waiting for db to be ready..."  
 sleep 2  
done  

gunicorn --bind :8000 --workers 2 djproject.wsgi  

Цей скрипт робить наступне:
- Чекає, поки серверне сховище буде готове;
- Чекає, поки база даних буде готова;
- Запускає Django сервер за допомогою gunicorn.

7.3. Створення файлу docker compose

Створимо файл docker-compose.yml з наступним вмістом:

# docker-compose.yml  
version: '3'  

services:  
 server:  
 container_name: djproject  
 restart: unless-stopped  
 build:  
 context: .  

текст перекладу


dockerfile: ./Dockerfile  
 entrypoint: /code/entrypoint.sh  
 volumes:  
 - static_volume:/code/staticfiles  
 expose:  
 - 8000   
 environment:  
 DEBUG: "False"  
 SECRET_KEY: ${SECRET_KEY}  
 ALLOWED_HOSTS: ${ALLOWED_HOSTS}  
 CSRF_TRUSTED_ORIGINS: ${CSRF_TRUSTED_ORIGINS}  
 DATABASE_URL: ${DATABASE_URL}  

volumes:  
 static_volume: {}

Цей файл docker compose побудує docker образ, запустить скрипт entrypoint і відкриє сервер на порту 8000. Він також завантажить відповідні змінні середовища — ми налаштуємо coolify так, щоб передавати відповідні змінні середовища на сервер.

Розгортання Django проекту з coolify

Тепер, коли у нас є локально працюючий Django проект, ми можемо розгорнути його за допомогою coolify.

1. Завантажте код на github/gitlab/bitbucket/тощо…

Почнемо з того, що завантажимо код на github (або будь-який інший git-постачальник), щоб мати можливість доступити його через coolify.

git init  
git add .  
git commit -m "Початковий коміт"  
git branch -M main  
git remote add origin https://github.com/your-username/your-repo.git  
git push -u origin main

У цьому посібнику ми використовуємо репозиторій django-coolify-tutorial як приклад.

2. Створіть новий проект в coolify

Припускаючи, що ваша інстанція coolify працює на http://:8000, тепер ви можете створити новий проект в coolify, перейшовши на http://:8000/projects і натиснувши кнопку New у верхньому правому куті. Дайте йому назву та опис і натисніть кнопку Continue.

pic

Тепер ви повинні побачити стандартне продакшн середовище. Якщо ви натиснете на нього, ви побачите кнопку + Add new resource. Натисніть на неї.

3. Створіть базу даних postgres

Ми можемо використовувати ресурс PostgreSQL, щоб створити базу даних postgres безпосередньо в coolify. Для цього посібника ми використовуватимемо стандартну версію PostgreSQL 16.

  • натисніть на кнопку PostgreSQL;
  • виберіть версію PostgreSQL 16 (default);
  • налаштуйте параметри за необхідності та натисніть кнопку Save. У цьому посібнику ми в основному будемо використовувати стандартні налаштування і просто змінемо назву ресурсу;
  • натисніть кнопку Start, щоб створити базу даних;
  • після всього цього скопіюйте значення Postgres URL (internal) і збережіть його тимчасово — воно буде використано для підключення сервера до бази даних; важливо скопіювати це значення лише на останньому етапі, щоб уникнути копіювання застарілих значень. URL виглядатиме приблизно так:
postgres://postgres:e1646815-c08e-4814-b66f-b1d0646fec36@87a33fe-8a8b-425a-9db5-5d7b913d763:5432/postgres

Налаштування повинно виглядати приблизно так:

pic

4. Підключення репозиторію github

Повернувшись на сторінку продакшн проекту (в https://coolify.fmacedo.com/project//production), натискаємо кнопку + New.

Давайте додамо наш кодовий репозиторій. Ви можете вибрати між приватним або публічним репозиторієм.

У цьому випадку, оскільки ми використовуємо публічний репозиторій, ми можемо просто натиснути на кнопку Public repository, вставити URL репозиторію і натискати кнопку Check repository.

Тепер ми можемо вибрати гілку, яку хочемо розгорнути, і вибрати docker як метод розгортання. Ваші вибори повинні виглядати приблизно так:

pic

Тепер натискайте Continue і починайте налаштування вашого проекту.

5. Налаштування проекту

Ми пройдемо через найбільш важливі етапи на сторінці додатку coolify.

**5.1.
текст перекладу

Загальна вкладка

У вкладці General, яка має бути активною, коли ви натискаєте кнопку Continue на попередньому кроці, ви можете:

  • Встановити ім’я проекту на django-coolify-tutorial-app або на будь-яке інше, яке вам подобається;
  • Створити новий домен або налаштувати свій — якщо ви створюєте новий, coolify створить щось на кшталт http://pw8css18cfctg8shhwjw3cww.5.74.172.122.sslip.io;
  • Скопіювати цей домен — він буде використовуватися в змінних середовища;

Вкладка змінних середовища

У вкладці Environment variables, ви можете встановити змінні середовища на відповідні значення. Як видно, coolify вже встановив імена змінних із порожніми значеннями за замовчуванням на основі файлу docker compose.

  • Встановіть змінну ALLOWED_HOSTS на домен, який ви скопіювали без протоколу (наприклад, pw8css18cfctg8shhwjw3cww.5.74.172.122.sslip.io);
  • Встановіть змінну CSRF_TRUSTED_ORIGINS на домен, який ви скопіювали з протоколом (наприклад, http://pw8css18cfctg8shhwjw3cww.5.74.172.122.sslip.io);😉
  • Встановіть змінну DATABASE_URL на URL postgres, який ви скопіювали (наприклад, postgres://postgres:e1646815-c08e-4814-b66f-b1d0646fec36@87a33fe-8a8b-425a-9db5-5d7b913d763:5432/postgres);
  • Встановіть SECRET_KEY на нове згенероване значення. Для генерації нового значення за допомогою Django:
python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'

Ваші змінні середовища повинні виглядати приблизно так:

pic

Не забудьте натискати кнопку Update для кожної змінної, щоб зберегти зміни.

Вкладка "Advanced"

У вкладці Advanced потрібно активувати налаштування Connect To Predefined Network, щоб наша база даних postgres була доступна з сервера. Якщо ви цього не зробите, вам доведеться вручну налаштувати хост postgres на IP адресу сервера та налаштувати проброс портів у налаштуваннях ресурсу postgres.

Ваші розширені налаштування повинні виглядати приблизно так:

pic

6. Розгортання проекту

Тепер ми готові до розгортання проекту. У верхньому правому куті сторінки натискаємо кнопку Deploy. Через кілька секунд проект повинен бути розгорнутий, і ви зможете отримати доступ до нього за вибраним доменом.

Якщо ви хочете створити суперкористувача для тестування адміністративного інтерфейсу, перейдіть до вкладки terminal і запустіть команду для створення суперкористувача Django:

python manage.py createsuperuser

Тепер ви повинні мати можливість отримати доступ до адміністративного інтерфейсу за адресою на кшталт http://pw8cgs88ckcog8swswgw0cww.5.74.172.122.sslip.io/admin.

Щоразу, коли ви пушите новий коміт до основної гілки, coolify автоматично розгортає проект. Для подальшої налаштування цього процесу перегляньте документацію coolify.

pic

Висновок

У цьому посібнику ми дізналися, як розгорнути Django проект за допомогою coolify. Ми також дізналися, як використовувати управління базою даних coolify для створення бази даних postgres та підключення її до сервера.

Якщо у вас є питання, не соромтеся запитувати мене на x або email.

Дякую за прочитання!

Корисні посилання

Перекладено з: Coolify your Django project

Leave a Reply

Your email address will not be published. Required fields are marked *