Ссылка на проект: streetsrussia.sytes.net
Ссылка на документацию API: streetsrussia.sytes.net/swagger
Реализованный фунционал:
- Yandex Object Storage S3: используется для взаимодействия с пользовательскими медиа-файлами
- Почтовый сервер SMTP Yandex: используется для отправки электронных писем.
- Celery с Redis: настроены для асихронной отправки электронных писем, обеспечивая эффективное выполение задач в фоновом режиме.
- Авторизация и регистрация пользователей: для регистрации пользователя необходимо подать заявку на вступление в участники организации. Заявка проходит модерацию у администратора, при подверждении происходит асинхронная отправка письма.
- Профиль пользователя: реализована смена пароля, установка аватарки и просмотр профиля.
- Разделение пользователей на роли: Пользователь может иметь одну из трёх ролей
-
- Администратор (имеет доступ к админ панели, модерирует любой раздел на сайте)
-
- Региональный директор (имеет доступ к модерированию новостей и мероприятий только своего региона)
-
- Участник (имеет доступ к записи и созданию мероприятий. Мероприятия созданные участником отправляются на модерацию **региональному директору **)
- Обратная связь: любой пользователь может отправить обращение через форму на главной странице (настроен механизм Throttling, ограничивающий количество запросов на API ручки). В базе данных создается соответствующая запись.
- Ответ на обратную связь: администратор может отвечать на обратную связь, отправляя ответы на электронные адреса отправителей.
- Мероприятия: cоздание мероприятий доступно только авторизированным пользователям. Редактирование, удаление и модерирование мероприятий определенного региона доступно региональным директорам и администраторам. В мероприятиях реализована галерея: доступно добавлять медиа-файлы (валидация: только видео и изображения не более 20MB)
- Новости: cоздание новостей модерируется региональным директором, так же имеет галерею (валидация: только видео и изображения не более 20MB)
- Партнёры: создание партнёра доступно только администраторам. Данные выводятся в разделах "О нас", "Главная страница"
- Фильтрация данных: для моделей "Мероприятия", "Локация", "Новости", " Партнёры" и "Дисциплины" используется подключение django-filter для реализации фильтрации данных на бекенде.
- Логирование: на всём проекте настроен механизм логирования
В проекте реализована следующая архитектура:
Для каждого компонента созданы Docker-образы и размещены на Docker Hub:
backend
: образ бекенда, содержащий приложение и его зависимости.db
: официальный образ PostgreSQL.celery
: образ для Celery, настроенный для взаимодействия с Redis и бекендом.redis
: официальный образ Redis.`nginx
: образ Nginx с конфигурацией для проксирования запросов.frontend
: образ фронтенда, собираемого из исходного кода.
Для управления многоконтейнерной инфраструктурой используется docker-compose. Репозиторий включает в себя два файла docker-compose.local.yml и docker-compose.yml, что позволяет развернуть проект на локальном или удалённом серверах.
В проекте настроен CI/CD с использованием GitHub Actions. При каждом пуше в ветку master выполняются следующие шаги:
flake8
: код тестируется утилитой flake8build_backend_and_push_to_docker_hub
,build_nginx_and_push_to_docker_hub
: собираются актуальные Docker-образы и пушатся на Docker Hubdeploy
: выполняется деплой на сервер
Все секреты, включая токены для доступа к Docker Hub и ключи для деплоя,
хранятся в секретах GitHub Actions и автоматически подтягиваются в процессе
выполнения CI/CD.
В репозитории frontend
также настроен CI/CD, который обновляет Docker-образ
на Docker Hub и выполняет деплой на сервер.
Nginx проксирует запросы к статическим файлам, API, административному интерфейсу, автодокументации Swagger и фронтенд-приложению, направляя их на соответствующие сервисы.
В проекте настроена автодокументация с помощью Swagger. Для ознакомления перейдите по ссылке
Данная инструкция подразумевает, что на вашем локальном/удалённом сервере уже установлен Git, Python 3.11, пакетный менеджер pip, Docker, Docker Compose, утилита виртуального окружения python3-venv.
Склонируйте проект из репозитория:
git clone https://github.com/D-Nevskiy/StreetsRussia.git
Перейдите в директорию infra и создайте файл .env:
cd infra/
nano .env
Пример из .env файла:
SECRET_KEY=DJANGO_SECRET_KEY # Cекретный ключ Django
DEBUG=False # True - включить Дебаг. False - выключить Дебаг
ALLOWED_HOSTS=localhost backend # Список адресов, разделенных пробелами
# Помните, если вы выставляете DEBUG=False, то необходимо будет настроить список ALLOWED_HOSTS.
# 127.0.0.1 и backend является стандартным значением. Через пробел.
# БД выбирается автоматически на основе константы DB_ENGINE. Если DB_ENGINE = sqlite , используется SQLite3.
# Если DB_ENGINE = postgresql , используется PostgreSQL.
DB_ENGINE=postgresql
POSTGRES_USER=django_user # Ваше имя пользователя для бд
POSTGRES_PASSWORD=django # Ваш пароль для бд
POSTGRES_DB=django # Название вашей бд
DB_HOST=db # Стандартное значение - db
DB_PORT=5432 # Стандартное значение - 5432
# На основе константы USE_S3 выбирается хранилище медиа-файлов пользователей
# Если USE_S3 = True, используется хранилище S3, False - Django
USE_S3=True
AWS_ACCESS_KEY_ID=your_data # Ваш ключ доступа AWS
AWS_SECRET_ACCESS_KEY=your_data # Ваш секретный ключ AWS
AWS_STORAGE_BUCKET_NAME=your_data # Название вашего S3-бакета
AWS_S3_ENDPOINT_URL=your_data # URL конечной точки S3
DEFAULT_API_URL=your_data # URL вашего API
# Данные вашего SMTP сервера
EMAIL_HOST=smtp.yandex.ru # Адрес хоста эл. почты
EMAIL_PORT=465 # Порт эл. почты
EMAIL_USE_SSL=True # Использование SSL
EMAIL_HOST_USER=your_data # Адрес почты, с которой будут отправляться письма
EMAIL_HOST_PASSWORD=your_data # Пароль почты, с которой будут отправляться письма
В директории infra проекта находится файл docker-compose.local.yml, с помощью которого вы можете запустить проект локально в Docker контейнерах.
Примечание. Если нужно - добавьте в конец команды флаг -d для запуска в фоновом режиме.
sudo docker compose -f docker-compose.yml up
Она сбилдит Docker образы и запустит backend, frontend, СУБД, Celery, Redis и Nginx в отдельных Docker контейнерах.
По завершении всех операции проект будет запущен и доступен по адресу http://localhost:8500/
Данил Распопов
Марат Ахметзянов
Вы можете заглянуть в другие наши репозитории в наших профилях GitHub :)