🚀 Деплой на сервер#
| Параметр | Значение |
|---|---|
| Адрес сервера | 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. Обновление проекта#
После изменения кода:
- На своём компьютере создайте миграции, если меняли модели:
python manage.py makemigrations. - Выполните
git commitиgit push. - На сервере перейдите в каталог проекта и выполните
git pull origin main(илиmaster, если так называется ваша основная ветка). - Пересоберите приложение командой
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. |