текст перекладу
Дізнайтесь, як розгорнути ваш Django додаток за допомогою coolify.
Що таке 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
.
Тепер ви повинні побачити стандартне продакшн середовище. Якщо ви натиснете на нього, ви побачите кнопку + 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
Налаштування повинно виглядати приблизно так:
4. Підключення репозиторію github
Повернувшись на сторінку продакшн проекту (в https://coolify.fmacedo.com/project//production
), натискаємо кнопку + New
.
Давайте додамо наш кодовий репозиторій. Ви можете вибрати між приватним або публічним репозиторієм.
У цьому випадку, оскільки ми використовуємо публічний репозиторій, ми можемо просто натиснути на кнопку Public repository
, вставити URL репозиторію і натискати кнопку Check repository
.
Тепер ми можемо вибрати гілку, яку хочемо розгорнути, і вибрати docker як метод розгортання. Ваші вибори повинні виглядати приблизно так:
Тепер натискайте 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())'
Ваші змінні середовища повинні виглядати приблизно так:
Не забудьте натискати кнопку Update
для кожної змінної, щоб зберегти зміни.
Вкладка "Advanced"
У вкладці Advanced
потрібно активувати налаштування Connect To Predefined Network
, щоб наша база даних postgres була доступна з сервера. Якщо ви цього не зробите, вам доведеться вручну налаштувати хост postgres на IP адресу сервера та налаштувати проброс портів у налаштуваннях ресурсу postgres.
Ваші розширені налаштування повинні виглядати приблизно так:
6. Розгортання проекту
Тепер ми готові до розгортання проекту. У верхньому правому куті сторінки натискаємо кнопку Deploy
. Через кілька секунд проект повинен бути розгорнутий, і ви зможете отримати доступ до нього за вибраним доменом.
Якщо ви хочете створити суперкористувача для тестування адміністративного інтерфейсу, перейдіть до вкладки terminal
і запустіть команду для створення суперкористувача Django:
python manage.py createsuperuser
Тепер ви повинні мати можливість отримати доступ до адміністративного інтерфейсу за адресою на кшталт http://pw8cgs88ckcog8swswgw0cww.5.74.172.122.sslip.io/admin
.
Щоразу, коли ви пушите новий коміт до основної гілки, coolify автоматично розгортає проект. Для подальшої налаштування цього процесу перегляньте документацію coolify.
Висновок
У цьому посібнику ми дізналися, як розгорнути Django проект за допомогою coolify. Ми також дізналися, як використовувати управління базою даних coolify для створення бази даних postgres та підключення її до сервера.
Якщо у вас є питання, не соромтеся запитувати мене на x або email.
Дякую за прочитання!
Корисні посилання
Перекладено з: Coolify your Django project