Как провести сборку и развертывание Django приложения?
Доброе время суток.
Есть проект - сайт на Django. В качестве VCS мы используем Git, репозиторий хранится в сервисе BitBucket.
Для разработки проекта мы используем SASS, а также Gulp & Bower. SASS код должен сохранятся в репозитории, исключать его нельзя. Однако, на боевом сервере, естественно, его и таких фалов как gulpfile.js, package.json, bower.json, .bowerrc быть не должно. Вот и сам вопрос: как правильно провести сборку проекта, чтобы в репозитории BitBucket хранился весь код, а на боевом сервере было только то, что там должно быть?
У меня были разные идеи, но все они мне кажутся не очень хорошими. Например, создать в папке проекта папку, где будет хранится копия всего сайта, но без лишних файлов. Но тут проблема: как я буду пушить на боевой сервер? Да и вообще мне кажется, что делать в таких случаях копию сайта - далеко не самый лучший метод.
Буду рад любой помощи. Я пока недостаточно опытен в этой области, поэтому обращаюсь к мастерам тостера. Спасибо.
Ваша задача сводится к простой вещи - как правильно деплоить код на продакшен.
Делается это очень просто:
- Просто клонируем код на продакшен
- Ставим зависимости (и все остальное)
- Удаляем все, чего не должно быть на продакшене - gulpfile.js, package.json, bower.json, .bowerrc и конечно же директорию .git.
Дальше начинаются варианты:
- Не далять директорию .git, а создать для prod окружения отдельный ключ, который имеет доступ только к prod ветке репозитория. Для увеличения секурности - можно еще открывать репозиторий для продакшена только перед деплоем и закрывать после деплоя.
- Использовать Docker. Просто собираем контейнер где-то еще, удаляем из контейнера все лишнее и после деплоим сам контейнер в продакшен.
Вариант с Docker является самым популярным сейчас и имеет огромный плюс - вы собираете образ с Django кодом, этот образ передаете на тестирование и после тестирования этот же образ уходит в продакшен. Это позоляет избегать ошибок, не найденных из-за различия тестового и продакшен окружений. Однако есть много особенностей сборки Docker контейнеров - будет правильным в начале изучить Best Practice, чтобы понять, что можно применить в Вашем случае.
Чтобы не делать все руками, имеет смысл этот процесс автоматизировать - для вас есть огромное количество инструментов - CI сервера (тот же Jenkins или web аналоги) и средства автоматизации для деплоя - ansible, salt-stack, puppet, chef. Как показывает практика - ansible один из самых простых.
Я использую простой баш скрипт для установки и настройки сервера. Каждый раз, когда я деплою код в продакшине, я делаю это на новом сервере. Вагрант используется для тестирования локально. Код простой в поддержке, и легко используется. Если у вас будут вопросы, спрашивайте.