Приложение состоит из двух сервисов:
- Django сервер, реализующий GraphQL API (папка
server
) - SSR Nuxt клиент (папка
client
)
Для работы приложения должны быть запущены оба сервиса.
Рекомендованной средой разработки является PyCharm.
Обязательные плагины:
- Vue.js
- Pug
- GraphQL
Рекомендованные плагины:
- GitToolBox
- Conventional Commit
Для работы сервиса обязательно необходимы следующие зависимости:
Зависимость | Версия |
---|---|
Python | 3.10 |
Poetry | latest |
PostgreSQL | latest |
Redis | latest |
Для Windows Redis официально не поддерживается, поэтому необходимо или установить WSL, как это описано на сайте Redis, или воспользоваться неофициальном портом.
В исключительных сценариях, для преобразования docx в pdf может потребоваться установленный LibreOffice. Для запуска таких сценариев из Windows рекомендуется запускать Django сервер в WSL с установленным LibreOffice.
Здесь и далее все команды
должны выполняться из папки server
, для перехода необходимо выполнить команду:
cd server
Префикс poetry run
для всех команд может быть опущен
при активированном виртуальном окружении в терминале.
Активация окружения описана в секции "Дополнительные настройки PyCharm".
После установки зависимостей необходимо:
- Создать базу данных PostgreSQL.
Имя базы данных по умолчанию - devind
.
- Создать
.env
файл в папкеserver
.
Создать файл можно путем копирования файла .env.example
с новым названием .env
.
При необходимости в файле нужно поменять данные для подключения к базе данных:
- Имя базы данных (ключ
DB_APP_NAME
) - Пользователь (ключ
DB_APP_USER
) - Пароль (ключ
DB_APP_PASSWORD
)
На Windows также необходимо удалить из созданного файла все комментарии, начинающиеся с символа #
.
- Установить зависимости Python
Для установки зависимостей Python необходимо выполнить команду:
poetry install
- Убедиться в том, что Redis сервер запущен
На Linux это можно сделать следующей командой:
sudo service redis-server restart
На macOS необходимо выполнить следующую команду:
brew services start redis
На Windows необходимо зайти в диспетчер задач и запустить службу Redis
,
если она остановлена.
- Выполнить скрипт, заполняющий базу данных начальными данными
Сделать это можно следующей командой:
# Unix
poetry run python3 manage.py migrate
poetry run python3 manage.py load_fixtures
# Windows
poetry run python3 manage.py migrate
poetry run python manage.py load_fixtures
Далее сервис может быть запущен следующей командой:
# Unix
poetry run python3 manage.py runserver
# Windows
poetry run python manage.py runserver
Для удобной работы с сервисом из PyCharm необходимо:
- Активировать Python окружение в терминале
Для активации окружения необходимо перейти File
, Settings
, Project: eleden
, Python interpreter
.
Далее необходимо нажать на кнопку с шестеренкой, далее кнопка Add
.
В открывшемся диалоговом меню необходимо выбрать пункт Poetry Environment
, далее Existing Environment
.
Pycharm должен автоматически определить путь к окружению, созданному с помощью команды poetry install
.
Далее необходимо нажать на кнопку Ok
в обоих меню.
- Настроить Django
Для настройки Django необходимо перейти File
, Settings
, Languages & Frameworks
, Django
.
Далее необходимо активировать пункт Enanle Django Support
,
выбрать папку server
в качестве Django project root
,
а файл server/deving/settings.py
в качестве Settings
, затем нажать на кнопку Ок
.
- Настроить конфигурацию
Настройка конфигурации осуществляется в правом верхнем углу возле кнопки Run
.
Необходимо выбрать или Add Configuration...
, если ни одна конфигурация не создана,
или Edit Configurations...
, если ранее были созданы конфигурации.
Далее необходимо нажать на кнопку +
в левом верхнем углу,
выбрать Django Server
из списка, ввести имя конфигурации (например, "server")
и нажать на кнопку Ok
.
- Подключить базу данных для работы из PyCharm
Подключение базы данных осуществляется в правом верхнем углу.
Необходимо нажать на кнопку Database
, затем на кнопку +
, далее выбрать DataSource
, PostgreSQL
.
В появившемся окне необходимо подтвердить установку драйвера, если PyCharm её предлагает, затем заполнить поля
в соответствии с данными для подключения из файла .env
и нажать на кнопку Ok
.
После описанных выше действий появляется возможность:
- Запускать команды без префикса
poetry run
. - Пользоваться
Python Console
c настроенным и запущенным Django. - Запускать сервис путем нажатия кнопки
Run
. - Взаимодействовать с базой данных из PyCharm.
Для работы сервиса необходимы следующие зависимости:
Зависимость | Версия |
---|---|
Node.js | latest LTS |
Yarn | latest |
После установки зависимостей необходимо:
- Создать
.env
файл в папкеclient
.
Создать файл можно путем копирования файла .env.example
с новым названием .env
.
- Установить зависимости Node.js.
Для установки зависимостей Node.js необходимо перейти в папку client
и выполнить команду:
yarn
- Создать символическую ссылку между клиентом и сервером.
Для возможности выгрузки файлов необходимо создать символическую ссылку
на папку server/storage
в папке client/static
.
Для этого в Unix необходимо в корне проекта выполнить команду:
python3 init.py
В Windows необходимо открыть терминал от имени администратора и в корне проекта выполнить команду:
python init.py
Далее сервис может быть запущен из папки client
следующей командой:
yarn run dev
Для удобной работы с сервисом из PyCharm необходимо настроить конфигурацию.
Настройка конфигурации осуществляется в правом верхнем углу возле кнопки Run
.
Необходимо выбрать или Add Configuration...
, если ни одна конфигурация не создана,
или Edit Configurations...
, если ранее были созданы конфигурации.
Далее необходимо нажать на кнопку +
в левом верхнем углу и
выбрать npm
из списка.
Затем необходимо ввести имя конфигурации (например, "client"),
выбрать в качестве файла package.json
файла client/package.json
,
а в качестве Scripts
команду dev
. В конце необходимо нажать на кнопку Ок
.
После настройки конфигурации появляется возможность запускать сервис путем нажатия кнопки Run
.
Системные требования сервера:
- ОС: любой дистрибутив Linux(Ubuntu, Debian и т. д.)
- Двухъядерный процессор с частотой 2 ГГц или лучше
- Оперативной памяти минимум 4 Гб
- 32 Гб свободного пространства на жестком диске
Кроме этого на сервере должны быть установлены следующие зависимости:
Зависимость | Версия |
---|---|
PostgreSQL | latest |
docker | latest |
docker-compose | latest |
Nginx | latest |
После установки всех зависомостей необходимо:
- Аутентифицироваться в реестре контейнеров:
docker login ghcr.io -u USERNAME -p TOKEN
- Создать директорию для хранения файлов и конфигурационные файлы для развертывания элетронной образовательной среды:
- Создание директории:
sudo mkdir /var/www/eleden/storage
- Создать файл
.env
со следующим содержимом:# Client settings # Data connection APP_NAME='Электронная образовательная среда' URL=https://example.ru API_URL=http://192.168.1.3:8000/graphql/ API_URL_BROWSER=https://example.ru/graphql/ WS_URL=wss://example.ru/graphql/ CLIENT_ID= CLIENT_SECRET= # Settings for sentry SENTRY_CLIENT_DSN= TINYMCE_API= ASK= # Server settings SECRET_KEY= DEBUG=False # Application database data DB_APP_HOST= DB_APP_NAME= DB_APP_USER= DB_APP_PASSWORD= # Email settings EMAIL_HOST= EMAIL_HOST_USER= EMAIL_HOST_PASSWORD= EMAIL_HOST_SUPPORT= # Sentry integration SENTRY_DNS= # Notification service interation FCM_API_KEY= # Settings for celery REDIS_SERVER=redis # Data for celery BROKER_URL=redis://redis:6379 BROKER_BACKEND=redis://redis:6379 TASK_SERIALIZER=json RESULT_SERIALIZER=json
- Создать файл
docker-compose.yml
со следующим содержимом:version: '3.7' services: client: container_name: client image: ghcr.io/devind-team/eleden/eleden-client:latest command: yarn run nuxt start restart: always ports: - "3000:3000" env_file: .env api: container_name: api image: ghcr.io/devind-team/eleden/eleden-server:latest command: poetry run daphne -b 0.0.0.0 -p 8000 devind.asgi:application restart: always ports: - "8000:8000" env_file: .env volumes: - "/var/www/eleden/storage:/usr/src/app/storage" celery: container_name: celery image: ghcr.io/devind-team/eleden/eleden-server:latest command: poetry run celery -A devind worker -B -E -l INFO restart: always env_file: .env volumes: - "/var/www/eleden/storage:/usr/src/app/storage" redis: image: redis restart: always
- Создание директории:
- Создать и запустить докер контейнеры:
Команды
docker-compose
выполняюся в директории, где находится файлdocker-compose.yml
# Извлечение образа sudo docker-compose pull # Создание и запуск контейнеров sudo docker-compose up -d
- Создать и настроить базу данных:
- Создание пользователя, базы данных и присвоение всех привилегий пользователю над базой данных:
# Подключение к PostgreSQL sudo psql -U postgres
create user username with encrypted password 'user_password'; create database database_name; grant all privileges on database database_name to username; grant connect on database database_name TO username;
- Изменить конфигурационный файл PostgreSQL(
/etc/postgresql/latest_version/main/
), добавив в него записи:
host database_name username ip_addres_docker_container/24 md5
- Перезапустить PostgreSQL
sudo service postgresql restart
- Наполнение базы данных начальными данными:
# Создание таблиц в базе данных sudo docker-compose run api poetry run python manage.py migrate # Наполнение базы данных начальными данными sudo docker-compose run api poetry run python manage.py fs
- Настройка
nginx
- Создать файл в
/etc/nginx/sites-available
со следующим содержимом:
upstream channels-site { server localhost:8000; } server { listen 443 ssl http2; server_name site.ru www.site.ru; access_log /var/log/nginx/site.ru.access.log; error_log /var/log/nginx/site.ru.error.log; client_max_body_size 32m; #ssl on; ssl_certificate /etc/ssl/certificate/site.crt; ssl_certificate_key /etc/ssl/certificate/site.key; location /storage/ { alias /var/www/site/storage/; } location /graphql/ { proxy_pass http://channels-site; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_redirect off; 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-Host $server_name; } location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name site.ru www.site.ru; return 301 https://$host$request_uri; }
- Создать символическую ссылку созданного файла в
/etc/nginx/sites-enabled
:
ln -s /etc/nginx/sites-available/file_name.conf /etc/nginx/sites-enabled
- Перезапустить
nginx
sudo service nginx restart
- Создать файл в