Bookstore - http://vingp-timur-ts-bookstore.ru
Bookstore - простой книжный интернет-магазин написанный на python с использованием flask. Целью данного проекта было изучить веб-фреймворк flask и его расширения, разобраться с работой веб сайтов, а также изучить следующие технологии:
- Docker и Docker compose
- Git
- PostgreSQL
- Elasticsearch
- Nginx
- Grafana
- Prometheus
- Loki
- API ЮKassа
- API Dadata
- Bootstrap5
- Jquery
- Ajax
- Pre-commit
- SSL (Let's Encrypt и Certbot)
- Gunicorn
- Mailcow
- Развёртывание проекта на сервер
git clone https://github.com/VinGP/bookstore.git
cd bookstore
- переименовываем файл .env.dev.example -> .env
- Редактируем переменные в файле .env (по желанию)
- Вместо MailHog вы можете подключить свою электронную почту, например Gmail:
- MAIL_SERVER = smtp.gmail.com
- MAIL_PORT = 587
- MAIL_USE_TLS = true
- MAIL_USERNAME = адрес (example@gmail.com)
- MAIL_PASSWORD = пароль
- Добавьте
YOOKASSA_ACCOUNT_ID
иYOOKASSA_SECRET_KEY
, чтобы работала оплата ЮKassа:- YOOKASSA_ACCOUNT_ID=<Идентификатор магазина>
- YOOKASSA_SECRET_KEY=<Секретный ключ>
Чтобы оплата работала необходимо использовать ngrok. Документация ЮKassа Если ключи не добавлена оформление заказа будет работать без оплаты.
- Для работы подсказок при вводе адреса необходимо добавить ключи Dadata:
- DADATA_SECRET_KEY=<API-ключ>
- DADATA_API_KEY=<Секретный ключ>
- Вместо MailHog вы можете подключить свою электронную почту, например Gmail:
docker compose up --build -d
или с помощью make
make dev
docker compose exec web python -m alembic revision --autogenerate
docker compose exec web python -m alembic upgrade head
docker compose exec web python manage.py add_admin admin admin admin@admin admin
По желанию вы можете сразу заполнить базу данных. Файл books.json должен находиться
рядом
с файлом bookstore/manage.py, картинки необходимо поместить в папку
bookstore/app/static/image/book/
Ссылка на books.json
и папку book
с
фотографиями книг. На данный момент там находится 7500 книг.
docker compose exec web python manage.py insert_db_data
После выполнения пунктов для локального запуска, надо выполнить следующие команды:
python -m venv venv
.\venv\Scripts\activate
pip install -r bookstore/requirements-dev.txt
pre-commit install
По итогу у вас должны заработать следующие сервисы:
- Bookstore
- http://localhost:5000 - Основное приложение
- http://localhost:5000/admin - Панель администрации
- MailHog (Для тестирования отправки почты)
- http://localhost:8025/ - веб интерфейс
- http://localhost:1025/ - SMTP сервер
- Postgresql
- http://localhost:54320/ - База данных приложения (54320 - для локального подключения; 5432 - внутри контейнеров)
- http://localhost:5050/ - pgAdmin для администрирования базы данных (email: admin@admin.com; пароль: root)
- pgAdmin:
- http://localhost:5050
- Чтобы подключиться к базе приложение необходио указывает хост и порт внутри контейнеров, т.e host - db и port - 5432
- Kibana:
Все те же шаги, что и при запуске проекта локально, кроме третьего пункта:
- переименовываем файл .env.prod.example -> .env
- удаляем файл docker compose.yml
- переименовываем файл docker compose.prod.yml -> docker compose.yml
- Редактируем переменные в файле .env
В проекте использовался бесплатный сертификат от Let’s Encrypt. Для этого вам надо приобрести доменное имя, делать DNS-записи типа A со значениями:
- @ - your_ip
- www - your_ip
git clone https://github.com/VinGP/bookstore.git
cd bookstore
- переименовываем файл .env.prod.ssl.example -> .env
- удаляем файл docker compose.yml
- переименовываем файл docker compose.prod.ssl.yml -> docker compose.yml
- Редактируем переменные в файле .env
-
DOMAIN - ваш домен (example.org)
-
DOMAIN_WWW - домен третьего уровня (www.example.org)
-
EMAIL - адрес электронной почты для сертификата
-
Добавьте
YOOKASSA_ACCOUNT_ID
иYOOKASSA_SECRET_KEY
, чтобы работала оплата ЮKassа:- YOOKASSA_ACCOUNT_ID=<Идентификатор магазина>
- YOOKASSA_SECRET_KEY=<Секретный ключ>
Чтобы оплата работала необходимо использовать ngrok. Документация ЮKassа Если ключи не добавлена оформление заказа будет работать без оплаты.
-
Для работы подсказок при вводе адреса необходимо добавить ключи Dadata:
- DADATA_SECRET_KEY=<API-ключ>
- DADATA_API_KEY=<Секретный ключ>
Также необходимо переименоватьnginx_ssl.example
->nginx_ssl
. Далее замените все<your_ip>
на ip адрес вашего сервера, а все<your_domain>
на ваш домен. Также в этом файле добавлена конфигурация mailcow, если он находится на одном сервере с приложением. Установка mailcow , nginx proxy чтобы не было конфликта 80-x портов у mailcow-nginx и nginx приложения. (Если вы не захотите использовать mailcow в качестве вашего почтового сервера, просто удалите все после комментария# mailcow config
)
-
bash init-letsencrypt.sh
docker compose up --build -d
docker compose exec web python -m alembic revision --autogenerate
docker compose exec web python -m alembic upgrade head
docker compose exec web python manage.py add_admin admin admin admin@admin admin
По желанию вы можете сразу заполнить базу данных. Файл books.json
должен находиться
рядом
с файлом bookstore/manage.py, картинки необходимо поместить в папку
bookstore/app/static/image/book/
Ссылка на books.json
и папку book
с
фотографиями книг. На данный момент там находится 7500 книг.
docker compose exec web python manage.py insert_db_data
По итогу у вас должны заработать следующие сервисы:
- Bookstore
- https://<your_domain> - Основное приложение
- https://<your_domain>/admin - Панель администрации
- Grafana:
- http://<your_domain>:3000
- Prometheus:
- http://<your_domain>:9090
- pgAdmin:
- http://<your_domain>:5050
- Чтобы подключиться к базе приложение необходио указывает хост и порт внутри контейнеров, т.e host - db и port - 5432
- Kibana:
- http://<your_domain>:5601
В директории README
есть .pdf файл схемы базы данных в лучшем качестве
Скриншоты находятся в директории README/screenshots
Главная страница:
Корзина:
- Документация ЮKassа
- API Dadata
- Статья про мониторинг
- Докеризация Flask приложения
- Установка Docker linux
- swap для более стабильной работы elasticsearch на сервере с малым количеством RAM
- Celery для организации рассылки писем
- Redis для кеширования
- ML для рекомендательной системы
- Google Analytics / Яндекс.Метрика
- Добавить объектное хранилище (MinIO) или S3 для фотографий и медиафайлов
- Kubernetes
- Vue.js для frontend
- CI/CD
- FastAPI