Это сайт сети ресторанов Star Burger. Здесь можно заказать превосходные бургеры с доставкой на дом.
Сеть Star Burger объединяет несколько ресторанов, действующих под единой франшизой. У всех ресторанов одинаковое меню и одинаковые цены. Просто выберите блюдо из меню на сайте и укажите место доставки. Мы сами найдём ближайший к вам ресторан, всё приготовим и привезём.
На сайте есть три независимых интерфейса. Первый — это публичная часть, где можно выбрать блюда из меню, и быстро оформить заказ без регистрации и SMS.
Второй интерфейс предназначен для менеджера. Здесь происходит обработка заказов. Менеджер видит поступившие новые заказы и первым делом созванивается с клиентом, чтобы подтвердить заказ. После оператор выбирает ближайший ресторан и передаёт туда заказ на исполнение. Там всё приготовят и сами доставят еду клиенту.
Третий интерфейс — это админка. Преимущественно им пользуются программисты при разработке сайта. Также сюда заходит менеджер, чтобы обновить меню ресторанов Star Burger.
Для запуска сайта нужно запустить одновременно бэкенд и фронтенд, в двух терминалах.
Скачайте код:
git clone https://github.com/devmanorg/star-burger.git
Перейдите в каталог проекта:
cd star-burger
Установите Python, если этого ещё не сделали.
Проверьте, что python
установлен и корректно настроен. Запустите его в командной строке:
python --version
Важно! Версия Python должна быть не ниже 3.6.
Возможно, вместо команды python
здесь и в остальных инструкциях этого README придётся использовать python3
. Зависит это от операционной системы и от того, установлен ли у вас Python старой второй версии.
В каталоге проекта создайте виртуальное окружение:
python -m venv venv
Активируйте его. На разных операционных системах это делается разными командами:
- Windows:
.\venv\Scripts\activate
- MacOS/Linux:
source venv/bin/activate
Установите зависимости в виртуальное окружение:
pip install -r requirements.txt
Определите переменную окружения SECRET_KEY
. Создать файл .env
в каталоге star_burger/
и положите туда такой код:
SECRET_KEY=django-insecure-0if40nf4nf93n4
Создайте файл базы данных SQLite и отмигрируйте её следующей командой:
python manage.py migrate
Запустите сервер:
python manage.py runserver
Откройте сайт в браузере по адресу http://127.0.0.1:8000/. Если вы увидели пустую белую страницу, то не пугайтесь, выдохните. Просто фронтенд пока ещё не собран. Переходите к следующему разделу README.
Откройте новый терминал. Для работы сайта в dev-режиме необходима одновременная работа сразу двух программ runserver
и parcel
. Каждая требует себе отдельного терминала. Чтобы не выключать runserver
откройте для фронтенда новый терминал и все нижеследующие инструкции выполняйте там.
Установите Node.js, если у вас его ещё нет.
Проверьте, что Node.js и его пакетный менеджер корректно установлены. Если всё исправно, то терминал выведет их версии:
nodejs --version
# v16.16.0
# Если ошибка, попробуйте node:
node --version
# v16.16.0
npm --version
# 8.11.0
Версия nodejs
должна быть не младше 10.0
и не старше 16.16
. Лучше ставьте 16.16.0
, её мы тестировали. Версия npm
не важна. Как обновить Node.js читайте в статье: How to Update Node.js.
Перейдите в каталог проекта и установите пакеты Node.js:
cd star-burger
npm ci --dev
Команда npm ci
создаст каталог node_modules
и установит туда пакеты Node.js. Получится аналог виртуального окружения как для Python, но для Node.js.
Помимо прочего будет установлен Parcel — это упаковщик веб-приложений, похожий на Webpack. В отличии от Webpack он прост в использовании и совсем не требует настроек.
Теперь запустите сборку фронтенда и не выключайте. Parcel будет работать в фоне и следить за изменениями в JS-коде:
./node_modules/.bin/parcel watch bundles-src/index.js --dist-dir bundles --public-url="./"
Если вы на Windows, то вам нужна та же команда, только с другими слешами в путях:
.\node_modules\.bin\parcel watch bundles-src/index.js --dist-dir bundles --public-url="./"
Дождитесь завершения первичной сборки. Это вполне может занять 10 и более секунд. О готовности вы узнаете по сообщению в консоли:
✨ Built in 10.89s
Parcel будет следить за файлами в каталоге bundles-src
. Сначала он прочитает содержимое index.js
и узнает какие другие файлы он импортирует. Затем Parcel перейдёт в каждый из этих подключенных файлов и узнает что импортируют они. И так далее, пока не закончатся файлы. В итоге Parcel получит полный список зависимостей. Дальше он соберёт все эти сотни мелких файлов в большие бандлы bundles/index.js
и bundles/index.css
. Они полностью самодостаточно и потому пригодны для запуска в браузере. Именно эти бандлы сервер отправит клиенту.
Теперь если зайти на страницу http://127.0.0.1:8000/, то вместо пустой страницы вы увидите:
Каталог bundles
в репозитории особенный — туда Parcel складывает результаты своей работы. Эта директория предназначена исключительно для результатов сборки фронтенда и потому исключёна из репозитория с помощью .gitignore
.
Сбросьте кэш браузера Ctrl-F5. Браузер при любой возможности старается кэшировать файлы статики: CSS, картинки и js-код. Порой это приводит к странному поведению сайта, когда код уже давно изменился, но браузер этого не замечает и продолжает использовать старую закэшированную версию. В норме Parcel решает эту проблему самостоятельно. Он следит за пересборкой фронтенда и предупреждает JS-код в браузере о необходимости подтянуть свежий код. Но если вдруг что-то у вас идёт не так, то начните ремонт со сброса браузерного кэша, жмите Ctrl-F5.
Собрать фронтенд:
./node_modules/.bin/parcel build bundles-src/index.js --dist-dir bundles --public-url="./"
Настроить бэкенд: создать файл .env
в каталоге star_burger/
со следующими настройками:
DEBUG
— дебаг-режим. ПоставьтеFalse
.SECRET_KEY
— секретный ключ проекта. Он отвечает за шифрование на сайте. Например, им зашифрованы все пароли на вашем сайте.ALLOWED_HOSTS
— см. документацию DjangoYANDEX_GEOCODER_API_KEY
— см. статьюDATABASE_URL
— настройки доступа к базе данных PostgreSQL с помощью одного URL, пример URL для PostgreSQL может выглядеть следующим образом:postgres://имя_пользователя:пароль@localhost:5432/имя_базы_данных
. Вы можете указать соответствующие значения для имени пользователя, пароля, хоста и имени базы данных в URL.ROLLBAR_ACCESS_TOKEN
— необязательный параметр. Токен для Rollbar — сервиса для сбора ошибок. Если вы не хотите использовать Rollbar, то просто удалите эту строку из файла.env
.
Создать базу данных PostgreSQL и пользователя к ней:
sudo -u postgres psql
CREATE DATABASE new_db_name WITH ENCODING='UTF8' LC_CTYPE='ru_RU.UTF-8' LC_COLLATE='ru_RU.UTF-8' OWNER=postgres TEMPLATE=template0;
GRANT ALL PRIVILEGES ON DATABASE star_burger_db TO postgres;
ALTER USER username WITH PASSWORD 'new_password';
Создайте файл star_burger.service в каталоге /etc/systemd/system со следующим содержимым:
[Unit]
Requires=postgresql.service
After=postgresql.service
[Service]
WorkingDirectory=/opt/star-burger
ExecStart=/opt/star-burger/env/bin/gunicorn -w 3 --bind 127.0.0.1:8000 star_burger.wsgi:application
Restart=always
[Install]
WantedBy=multi-user.target
Также необходимо настроить файлы обновления сертификатов SSL. Для этого создайте файл certbot-renewal.service и certbot-renewal.timer в каталоге /etc/systemd/system со следующим содержимым:
certbot-renewal
[Unit]
Description=Certbot Renewal
[Service]
ExecStart=/usr/bin/certbot renew --force-renewal --post-hook "systemctl reload nginx.service"
certbot-renewal.timer
[Unit]
Description=Timer for Certbot Renewal
[Timer]
OnBootSec=300
OnUnitActiveSec=1w
[Install]
WantedBy=multi-user.target
Настройка для очистки сессий. Создайте файл starburger-clearsessions.service и starburger-clearsessions.timer в каталоге /etc/systemd/system со следующим содержимым:
[Unit]
Description=Clear Django Sessions
Requires=star_burger.service
[Service]
WorkingDirectory=/opt/star-burger
ExecStart=/opt/star-burger/env/bin/python3 manage.py clearsessions
Restart=on-abort
[Install]
WantedBy=multi-user.target
[Unit]
Description=Timer for Clearsessions
[Timer]
OnBootSec=300
OnUnitActiveSec=1w
[Install]
WantedBy=multi-user.target
Далее следует добавить сервисы в автозагрузку:
sudo systemctl daemon-reload
sudo systemctl enable star_burger
sudo systemctl enable certbot-renewal.timer
sudo systemctl enable starburger-clearsessions.timer
Настроить nginx: создать файл /etc/nginx/sites-enabled/starbrger
со следующим содержимым:
server {
server_name kek.lolkekazaza.ru, www.kek.lolkekazaza.ru; # managed by Certbot
location / {
include proxy_params;
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /opt/star-burger/static/;
}
location /media/ {
alias /opt/star-burger/media/;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/www.kek.lolkekazaza.ru/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.kek.lolkekazaza.ru/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = kek.lolkekazaza.ru) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = www.kek.lolkekazaza.ru) {
return 301 https://$host$request_uri;
}
listen 80;
server_name kek.lolkekazaza.ru www.kek.lolkekazaza.ru;
return 404;
}
Перезапустите nginx:
sudo systemctl restart nginx
При необходимости внесения изменений в репозиторий, можно обновить проект с помощью скрипта script_star_burger
, который находится в корне проекта:
./script_star_burger
Ссылка на демонстрационную версию проекта: kek.lolkekazaza.ru
Установите Docker и Docker Compose.
У вас также должны быть получены сертификаты SSL для домена на котором будет запущен сайт и создана база данных Postgres. Смотри раздел Как запустить prod-версию сайта.
Склонируйте репозиторий:
git clone https://github.com/devmanorg/star-burger.git
Настойте переменные окружения в файле .env
в корне проекта, смотри раздел Как запустить prod-версию сайта.
Запустите скрипт script_star_burger_with_docker_compose.sh
в корне проекта:
./script_star_burger_with_docker_compose.sh
Код написан в учебных целях — это урок в курсе по Python и веб-разработке на сайте Devman. За основу был взят код проекта FoodCart.
Где используется репозиторий:
- Второй и третий урок учебного курса Django