🚀 Деплой на сервер#

Параметр Значение
Адрес сервера 192.168.1.11
Логин student
Пароль qwe1234
Порты проекта выдаются командой newproject

1. Подключение к серверу#

Откройте PowerShell или «Терминал» в Windows либо обычный терминал в macOS или Linux:

ssh student@192.168.1.11

При первом подключении на вопрос Are you sure you want to continue connecting ответьте yes. Пароль при вводе не отображается — это нормально.

Чтобы завершить SSH-сеанс, выполните:

exit

2. Создание проекта на сервере#

Создайте каталог для Learning Log. Имя проекта должно начинаться с вашей фамилии латиницей:

newproject ivanov-learning-log

Команда выводит каталог проекта и закреплённый диапазон портов, например:

Папка проекта : /home/student/projects/ivanov-learning-log
Ваши порты    : 20010–20019

Для проекта автоматически создаются:

  • каталог ~/projects/<имя-проекта>;
  • файл .env;
  • отдельный диапазон портов.

Вам нужен первый порт диапазона. В примере это 20010 — значение APP_PORT данного проекта.

Если вы забыли порт, снова выполните newproject <имя-проекта>. Повторный запуск не меняет настройки, а только показывает уже выделенные порты.

3. Подготовка репозитория#

Сначала настройте проект на своём компьютере по разделу «Развёртывание Learning Log через Docker Compose». В репозитории должны находиться settings.py, requirements.txt, Dockerfile, compose.yaml, .gitignore, .dockerignore, README.md и файлы миграций.

Один процесс Gunicorn#

Сервер общий для всей группы, поэтому используйте один рабочий процесс Gunicorn. В compose.yaml замените команду запуска на:

exec gunicorn learning_log.wsgi:application \
  --bind 0.0.0.0:8000 \
  --workers 1 \
  --threads 4 \
  --timeout 60

В Dockerfile замените строку CMD на:

CMD ["gunicorn", "learning_log.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "1", "--threads", "4", "--timeout", "60"]

Команда в compose.yaml используется при запуске через Docker Compose, а CMD в Dockerfile — при запуске образа без Compose.

Проверка перед загрузкой#

Перед отправкой проекта на сервер убедитесь, что:

  • если вы меняли модели, миграции созданы командой python manage.py makemigrations и добавлены в Git;
  • requirements.txt обновлён и содержит Django, django-bootstrap4, gunicorn и whitenoise;
  • .env, db.sqlite3 и виртуальное окружение не попали в репозиторий;
  • README.md объясняет, как запустить приложение через Docker Compose;
  • последние изменения отправлены в публичный репозиторий GitHub.

Если репозитория ещё нет, создайте на GitHub пустой публичный репозиторий. На своём компьютере в каталоге Learning Log, после создания .gitignore, выполните:

git init
git branch -M main
git add .
git commit -m "Learning Log"
git remote add origin https://github.com/ivanov/learning_log.git
git push -u origin main

Замените ivanov и learning_log в адресе на владельца и имя своего репозитория. Если Git уже настроен для проекта, достаточно добавить, зафиксировать и отправить последние изменения.

4. Загрузка кода и настройка .env#

Каталог проекта уже существует и содержит .env, поэтому используйте git pull, а не git clone:

cd ~/projects/ivanov-learning-log
git init -q
git remote add origin https://github.com/ivanov/learning_log.git
git pull origin main

Если основная ветка репозитория называется master, замените main на master.

Откройте существующий файл .env:

nano .env

Добавьте настройки под уже существующими строками. Строки COMPOSE_PROJECT_NAME, PORT1 и остальные значения, созданные командой newproject, не удаляйте.

DJANGO_SECRET_KEY=укажите-длинный-уникальный-секретный-ключ
DJANGO_DEBUG=False
DJANGO_ALLOWED_HOSTS=192.168.1.11,localhost,127.0.0.1
DJANGO_CSRF_TRUSTED_ORIGINS=http://192.168.1.11:20010
DJANGO_USE_HTTPS=False
SQLITE_PATH=/app/data/db.sqlite3
APP_BIND_IP=0.0.0.0
APP_PORT=20010

Замените 20010 на первый порт диапазона этого проекта. Этот порт должен совпадать и в DJANGO_CSRF_TRUSTED_ORIGINS, и в APP_PORT. Замените значение DJANGO_SECRET_KEY на собственный длинный ключ до запуска.

В редакторе nano сохраните файл сочетанием Ctrl+O, затем нажмите Enter и выйдите через Ctrl+X.

5. Запуск#

Все команды выполняйте из каталога нужного проекта:

cd ~/projects/ivanov-learning-log
docker compose up -d --build
docker compose ps
docker compose logs --tail=100 web

Сборка может занять несколько минут. В выводе docker compose ps контейнер должен перейти в состояние Up (healthy).

Один раз создайте администратора:

docker compose exec web python manage.py createsuperuser

Откройте приложение в браузере:

http://192.168.1.11:20010/

Замените 20010 на APP_PORT вашего проекта. По IP-адресу проверьте регистрацию, вход, выход, создание и редактирование тем и записей.

Публикация во внешней сети#

Достаточно работающего адреса http://192.168.1.11:<APP_PORT>/ внутри учебной сети.

По запросу преподаватель может «выпустить» приложение во внешний мир через свой шлюз и выдать домен с HTTPS. Сообщите преподавателю имя проекта и его APP_PORT. После получения домена измените .env:

DJANGO_ALLOWED_HOSTS=ваш-домен.рф,192.168.1.11,localhost,127.0.0.1
DJANGO_CSRF_TRUSTED_ORIGINS=https://ваш-домен.рф
DJANGO_USE_HTTPS=True

Затем примените настройки:

docker compose up -d

6. Обновление проекта#

После изменения кода:

  1. На своём компьютере создайте миграции, если меняли модели: python manage.py makemigrations.
  2. Выполните git commit и git push.
  3. На сервере перейдите в каталог проекта и выполните git pull origin main (или master, если так называется ваша основная ветка).
  4. Пересоберите приложение командой docker compose up -d --build.

Миграции применятся автоматически, а база останется в Docker volume.

7. Полезные команды#

Команда Что делает
docker compose ps показывает состояние контейнера
docker compose logs -f web выводит журнал Django и Gunicorn в реальном времени; выход — Ctrl+C
docker compose up -d --build пересобирает образ и применяет изменения кода
docker compose up -d применяет изменения .env, база сохраняется
docker compose restart web перезапускает приложение без пересборки
docker compose exec web python manage.py createsuperuser создаёт администратора
docker compose exec web python manage.py changepassword admin меняет пароль пользователя admin
docker compose exec web python manage.py showmigrations показывает применённые миграции
newproject ivanov-learning-log повторно показывает каталог и выделенные порты проекта

8. Правила работы на общем сервере#

  • Работайте только в каталогах ~/projects/<ваша-фамилия>-….
  • Запускайте docker compose только из каталога нужного проекта.
  • Для каждого проекта используйте собственный APP_PORT — первый порт его диапазона.
  • Не загружайте .env в GitHub: в нём хранится секретный ключ. Список переменных опишите в README.md.
  • Резервные копии создаются ночью раз в сутки и хранятся семь дней. Если файлы пропали, обратитесь к преподавателю.

9. Частые ошибки#

Симптом Причина и решение
port is already allocated В .env указан чужой APP_PORT. Выполните newproject <имя> и возьмите первый порт диапазона этого проекта.
По внешнему домену отображается 502 Bad Gateway Контейнер не запущен, в .env осталось APP_BIND_IP=127.0.0.1 или преподавателю передан неправильный APP_PORT.
Bad Request (400) Адрес отсутствует в DJANGO_ALLOWED_HOSTS. Исправьте .env и выполните docker compose up -d.
CSRF verification failed Для IP проверьте адрес с портом в DJANGO_CSRF_TRUSTED_ORIGINS; для внешнего домена укажите полный адрес с https://.
Не выполняется вход по IP Убедитесь, что в .env указано DJANGO_USE_HTTPS=False, затем выполните docker compose up -d.
no such table: … Проверьте вывод docker compose logs web и docker compose exec web python manage.py showmigrations. Если после изменения моделей не хватает миграций, создайте их локально, отправьте на GitHub и пересоберите приложение.
No module named 'learning_log' Проверьте наличие каталога learning_log с файлами settings.py и wsgi.py, а также написание имени пакета в Dockerfile и compose.yaml.
No module named 'bootstrap4' django-bootstrap4 отсутствует в requirements.txt. Обновите зависимости и пересоберите проект.
Контейнер имеет статус Restarting или unhealthy Django завершается при старте. Причина находится в выводе docker compose logs web.
Изменения не появились на сайте Код копируется в образ при сборке. Выполните docker compose up -d --build.