Развёртывание боевого веб сервера - LernaProject/Lerna GitHub Wiki

Что из себя представляет веб-сервер и как работает

Структурная схема

Технически, веб-сервер - это контейнер Docker, использующий сетевой интерфейс хоста (это позволяет напрямую привязываться к портам машины, и использовать БД, развёрнутую локально). Директория проекта монтируется в контейнер в точку /lerna. В ходе работы, в ней создаётся поддиректория /build, в которой лежит готовая к раздаче статика build/static/, все логи build/logs/, и unix-сокет gUnicorn /build/gunicorn.sock.

В докере постоянно функционируют nginx, gUnicorn и supervisor.

  • Работа supervisor'а самая простая - он следит, чтобы gUnicorn работал, и поднимает его, если тот вдруг упадёт.
  • gUnicorn - веб-сервер Django, который обрабатывает все динамические страницы и связывается с БД. Он общается с внешним миром через unix-сокет и не имеет открытого веб-интерфейса.
  • nginx висит на 80-м порту серверной машины и принимает соединения. Если идет обращение по адресу /static, nginx сразу отдаёт файл. Если запрашивается какая-то другая страница - проксирует запрос в gUnicorn через gunicorn.sock

Все скрипты для управления лежат в папке /scripts/deployment, в дальнейшем на них будем ссылаться без префикса.

Как обновлять проект на развёрнутом сервере

Так как докер является низкоуровневым демоном, то для управления им потребуются либо root (все вызовы дополнять sudo), либо состоять в группе docker (предпочтительно). Для добавления в эту группу, нужно выполнить sudo usermod -aG docker <user_name> и перезайти (чтобы применились групповые политики).

Существуют три скрипта, которые различаются только предварительными действиями, в остальном они выполняют все необходимые шаги для запуска веб-сервера.

  • start.sh ничего не делает, если сервер уже запущен и работает. Его можно выполнять автоматически по расписанию, чтобы убедиться, что сервер работает.
  • restart.sh форсирует перезапуск сервера, даже если он уже работает. Его нужно выполнять, если есть изменения, но файлы в /scripts/deployment/data не затрагивались (пересборка образа не требуется).
  • rebuild.sh форсирует пересборку сервера, даже если он работает или собран. Его нужно выполнять, если были изменены файлы в /scripts/deployment/data.

Как развернуть сервер с нуля

  1. Установить докер sudo apt-get install docker.io и добавиться в его группу (см. выше).
  2. Выкачать репозиторий проекта, создать и заполнить файл /lerna/local_settings.py (как образец можно использовать lerna/local_settings.py.production_template)
  3. Выполнить скрипт /scripts/deployment/start.sh. Это потребует сборки образа и запуска контейнера, - процесс отобразится в консоли, но потребуется подождать.

Я что-то сломал, но не понял, что

  1. Все логи лежат в папке build/logs/, в первую очередь нужно посмотреть по ним.
  2. Если непонятно, завёлся ли вообще сервер, можно посмотреть docker ps -a - контейнер lerna_web должен быть онлайн.
  3. Если сервер не заводится, или завёлся, но не работает - можно посмотреть его вывод командой docker logs lerna_web.
  4. Если ничего не понятно, но очень нужно что-то сделать - hard reset можно выполнить скриптом rebuild.sh
⚠️ **GitHub.com Fallback** ⚠️