/MeowMoments

Primary LanguageJavaScript

Meow Moments - делитесь фотографиями котиков



Технологии:

Python Django DRF Docker DockerCompose GitHub Actions Gunicorn Nginx Certbot


Функционал:

  • Проект Meow Moments позволяет пользователям делиться своими фотографиями котиков и просматривать фотографии котиков других пользователей.
  • При загрузке фото котика пользователь должен ввести в специальные поля имя котика, год его рождения и, при желании, может добавить ему достижения.
  • Добавлять и просматривать фотографии могут только зарегистрированные и авторизованные пользователи.
  • Только авторы могут изменять свои фотографии и описание.

Технические особенности:

Репозиторий включает в себя два файла docker-compose.yml и docker-compose.production.yml, что позволяет развернуть проект как на локальном или удалённом серверах.

Данная инструкция подразумевает, что на вашем локальном сервере уже установлен Git, Python 3.9, пакетные менеджеры npm и pip, Docker, Docker Compose, утилита виртуального окружения python3-venv.

Для локального запуска в ручном режиме настроена и запущена СУБД PostgreSQL.

С подробными инструкциями запуска вы можете ознакомиться ниже.


Запуск проекта локально в ручном режиме

Полные инструкции по запуску в ручном режиме серверов frontend и backend вы можете найти в соответствующих директориях репозитория в файлах README.md

MeowMoments/frontend/README.md
MeowMoments/backend/README.md

Запуск проекта в Docker контейнерах с помощью Docker Compose

Склонируйте проект из репозитория:

git clone https://github.com/PrimeStr/MeowMoments.git

Перейдите в директорию проекта:

cd MeowMoments/

Создайте файл .env в корне проекта, затем добавьте строки, содержащиеся в файле .env.example и подставьте свои значения.

Пример из .env файла:

# Если вы будете использовать СУБД PostgreSQL - заполните следующие константы.
POSTGRES_USER=your_username        # Пользователь Postgres
POSTGRES_PASSWORD=your_password    # Пароль пользователя Postgres
POSTGRES_DB=db_name                # Название БД
DB_HOST=db                         # Хост, по дефолту db
DB_PORT=port_for_db                # Порт, по дефолту 5432

# Следующие константы необходимо заполнить независимо от выбора СУБД.
SECRET_KEY=DJANGO_SECRET_KEY       # Секретный ключ Джанго
DEBUG=False                        # Выставьте True, если вам нужно включить дебаг. Оставьте пустым если не нужен.
ALLOWED_HOSTS=127.0.0.1            # 127.0.0.1 localhost по дефолту если DEBUG=False. Разделите адреса пробелами.

В корне проекта находится файл docker-compose.yml, с помощью которого вы можете запустить проект локально в Docker контейнерах.

Находясь в корне проекта выполните следующую команду:

Примечание. Если нужно - добавьте в конец команды флаг -d для запуска в фоновом режиме.

sudo docker compose -f docker-compose.yml up

Она сбилдит Docker образы и запустит backend, frontend, СУБД и Nginx в отдельных Docker контейнерах.

Выполните миграции в контейнере с backend:

sudo docker compose -f docker-compose.yml exec backend python manage.py migrate

Соберите статику backend'a:

sudo docker compose -f docker-compose.yml exec backend python manage.py collectstatic

Переместите собранную статику в volume, созданный Docker Compose для хранения статики:

sudo docker compose -f docker-compose.yml exec backend cp -r /app/collected_static/. /static/static/

По завершении всех операции проект будет запущен и доступен по адресу http://127.0.0.1/

Для остановки Docker контейнеров выполните следующую команду в корне проекта:

sudo docker compose -f docker-compose.yml down

Либо просто завершите работу Docker Compose в терминале, в котором вы его запускали, сочетанием клавиш CTRL+C.


CI/CD - Развёртка проекта на удаленном сервере

В проекте уже настроен Workflow для GitHub Actions.

Ваш GitHub Actions самостоятельно запустит:

  • 🧪 Тесты: Запускаются тесты для вашего проекта.
  • 🏗️ Сборка образов: Git Action создает Docker-образы вашего приложения.
  • 🚀 Деплой: Образы отправляются на ваш репозиторий DockerHub, проект деплоится на сервер.
  • ✉️ Уведомление: В случае успеха вы получите уведомление в Telegram.

Перейдите в GitHub в настройки репозитория — Settings, найдите на панели слева пункт Secrets and Variables, перейдите в Actions, нажмите New repository secret.

Создайте следующие ключи:

DOCKER_USERNAME (Ваш логин в DockerHub)
DOCKER_PASSWORD (Ваш пароль в DockerHub)
HOST (IP адресс вашего удалённого сервера)
USER (Логин вашего удалённого сервера)
SSH_KEY (SSH ключ вашего удалённого сервера)
SSH_PASSPHRASE (Пароль вашего удалённого сервера)
TELEGRAM_TO (Ваш ID пользователя в Telegram)
TELEGRAM_TOKEN (Токен вашего бота в Telegram)

Подключитесь к вашему удалённому серверу любым удобным способом. Создайте в домашней директории директорию с названием MeowMoments.

mkdir MeowMoments

Перейдите в созданную директорию и создайте в ней файл .env, затем добавьте строки, содержащиеся в файле .env.example и подставьте свои значения.

nano .env

Пример из .env файла:

# По этим константам будет создана база данных для проекта.
POSTGRES_USER=your_username        # Пользователь Postgres
POSTGRES_PASSWORD=your_password    # Пароль пользователя Postgres
POSTGRES_DB=db_name                # Название БД
DB_HOST=db                         # Хост, по дефолту db
DB_PORT=port_for_db                # Порт, по дефолту 5432

SECRET_KEY=DJANGO_SECRET_KEY       # Секретный ключ Джанго
DEBUG=False                        # Выставьте True, если вам нужно включить дебаг. Оставьте пустым если не нужен.
ALLOWED_HOSTS=127.0.0.1            # 127.0.0.1 localhost по дефолту если DEBUG=False. Разделите адреса пробелами.

При подключении к вашему удалённому серверу воркер GitHub Actions создаст БД и запустит контейнер с backend'ом, используя эти константы.

Теперь можно приступать к деплою

В локальном проекте замените в файле docker-compose.production.yml названия образов в соответствии с вашим логином на DockerHub в нижнем регистре (Например your_name/MeowMoments_backend)

Аналогично измените названия образов и в файле main.yml, который находится в директории /.github/workflows/.

Весь процесс автоматизирован! Как только вы инициируете коммит и отправите изменения на GitHub, GitHub Action берет дело в свои руки:

git add .
git commit -m "Ваше сообщение для коммита."
git push

После успешной отправки изменений перейдите в своём репозитории на GitHub во вкладку Actions. Вы увидите процесс работы Actions. После окончания работы воркера в ваш Telegram придёт сообщение от бота:

Деплой Meow Moments успешно выполнен!

После этого можно вернуться на удалённый сервер, в директорию MeowMoments и создать суперпользователя:

sudo docker compose -f docker-compose.production.yml exec backend python manage.py createsuperuser

Внимание! : Для полноценной работы проекта на вашем удалённом сервере должен быть установлен, настроен и запущен Nginx. Удостоверьтесь что в конфиге по вашему доменному имени настроена переадресация всех запросов на 127.0.0.1:9000.

Настройка SSL шифрования через Let's Encrypt

Чтобы проект отвечал базовым стандартам безопасности необходимо настроить SSL сертификат.

Установите certbot:

sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Запустите sertbot и получите свой SSL сертификат:

sudo certbot --nginx

После перезапустите Nginx:

sudo systemctl reload nginx
sudo certbot certificates

Примечание. SSL-сертификаты от Let's Encrypt действительны в течение 90 дней. Их нужно постоянно обновлять. Если вы не хотите делать это самостоятельно, вы можете настроить автоматическое обновление сертификата с помощью команды ниже.

sudo certbot renew --dry-run

Теперь вы можете получить доступ к сайту по его доменному имени. Как только вы убедитесь, что все работает как надо, можете приглашать пользователей.


Автор

Максим Головин
Вы можете заглянуть в другие мои репозитории в моем профиле GitHub. Нажмите здесь.