3 горизонтальные линии, бургер
3 горизонтальные линии, бургер
3 горизонтальные линии, бургер
3 горизонтальные линии, бургер

3 горизонтальные линии, бургер
Удалить все
ЗАГРУЗКА ...

Содержание



    Как развернуть Django сайт на хостинге (или VPS) от beget. Полная инструкция

    Часы
    12.05.2024
    /
    Часы
    02.10.2025
    /
    Часы
    25 минут
    Глазик
    5618
    Сердечки
    3
    Соединённые точки
    1
    Соединённые точки
    2
    Соединённые точки
    0

    Введение или про что будет эта статья

    В этой статье я расскажу и покажу, как можно разместить сайта на серверах от beget (хостинг-провайдер). Данный провайдер предоставляет широкий выбор платформ разработки/CMS, которые используются для создания сайта. Но в этой статье я расскажу только о том, как развернуть сайт написанный на Django, ибо разбираюсь в этом.
    В дополнение того, что было сказано ранее, я хочу ещё показать, как можно настроить ваш проект/сайт таким образом, чтобы при необходимости внедрения новых фич, или их исправление), это было не сложнее чем нажатие одной кнопки. Делать это будем через bash, git и ssh.
    Кроме предоставления обычного хостинга, beget предоставляет такую услугу как VPS.
    VPS(Virtual Private Server) - такой сервер размещён вместе с другими на одном железе(компьютере), от сюда и virtual server, так же доступ к такому серверу есть только у его владельца, от сюда и private.
    Так вот, на бегете, можно разместить сайт двумя способами. Первый - простой, но ограниченный, второй - сложный, но и от того куда более интересный. Первый заключается в том, чтобы использовать готовое решение от самого хостинга и немного поколдовать в докере. Суть второго способа, заключается в том, чтобы создать свой VPS и настроить сервер в ручную.
    Я продемонстрирую оба, объясню в чём особенности и нюансы обоих, и почему лучше, по моему мнению, именно VPS. Сразу к сравнению можно перейти сюда.

    Особенности данной статьи

    Для демонстрации я буду использовать специально сделанное для этого django-приложение. Это приложение было специально сделано со всеми фишками, которые возможно потребуются сайту в будущем:
    1. работа и настройка с БД
    2. отправка почты
    3. получение статики
    4. загрузка на сайт различных медиа
    5. переводы
    6. тесты
    Я постоянно работаю над этим приложением, ибо собираюсь тестировать его и на других хостингах (не только beget). В конце концов, я вижу его как один, большой интерактивный тест хостингов, на то насколько они дружелюбны к Django-сайтам. Его исходный код и репозиторий можно найти тут -> ГитХаб.
    Так же, я сторонник такого подхода в разработке приложений как TDD (Test Driven Development).
    TDD (Test Driven Development) - такой подход в разработке программ, при котором сначала пишутся тесты, а потом сам код программы. Если быть более конкретным, сначала функциональные тесты, потом модульные и только потом сам код.
    Для чего тебе это знать? А знать следует, ибо я вместо быстрого деплоя одного сайта, на одну машину, с одним доменом, я буду деплоить уже два сайта (один тестовый, максимально приближенный к боевому - staging.bddt.space, другой боевой - bddt.space), на одну машину, с одним доменом и одним поддоменом, для тестового сайта.
    Но только для VPS. Для обычного хостинга это мало применимо.
    Зачем так усложнять ? Наверное, задаёшь ты себе вопрос. Я тоже задавал такой вопрос, и тут сложно как-то уговаривать или убеждать, что так ты сэкономишь себе нервы и время, так автоматизировать процесс разработки легче, так внедрять новое и улучшать старое гораздо легче и безболезненней. Тебе просто придётся это пройти. Создать свой проект, вырастить его до определённого масштаба и почувствовать всю его тяжесть и неповоротливость и то, что TDD могло бы тебе помочь.
    И ещё, если тебе не нужна тестовая составляющая для сайта можешь просто прочитать главу предварительной подготовки + развёртывание сайта на хостинге (или развёртывание сайта на VPS до главы развёртывания боевого сервера ( исключительно). Так же, если в названии главы присутствует - опционально, можешь смело её пропускать.

    Предварительная подготовка

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

    Приобретаем домен и создаём поддомен

    С самого начала тебе потребуется уже оплаченный хостинг бегет, плюс приобрести домен. На странице по адресу https://cp.beget.com/domains/register введи любое название домена, которое тебе понравится и нажми продолжить:
    После, вас перенаправят на страницу с настройками домена. Вот что тебе нужно знать:
    1. Это имя твоего домена
    2. Ни куда не направляем
    3. После нам потребуется отредактировать несколько DNS-записей для корректной работы домена
    4. В качестве бонуса получим бесплатный SSL-сертификат, это потребуется для перехода от протокола http к https.
    Я получил свой второй домен бесплатно - bddt.space. На нём я и буду демонстрировать, то как добавить поддомен для него и как привязать его к сайту (будь он на VPS или на основном хостинге)
    Давай добавим поддомен для тестового сайта. Если ты помнишь, я собираюсь иметь как боевой сервер, так и тестовый, размещённый на поддомене. Давай добавим staging поддомен:
    Теперь у нас есть домен и поддомен для развёртывания. Помним, если тебе не нужна тестовая составляющая сайта - не добавляй поддомен.

    Создаём базу данных

    Зайди на страницу управления базами данных и создай одну:
    1. Имя твоей базы данных (У меня это будет timachuduk_bddt)
    2. Пароль, запомни или запиши (Не скажу)
    3. Добавляем
    4. Необходим для подключений сайтов созданных для VPS
    Всё, база данных готова для использования через хостинг, но не через VPS. Дело в том, что нужно ещё разрешить подключение удалённых адресов. Чтобы это сделать:
    Теперь к ней можно подключиться и из удалённого адреса, а не только с той же машины на которой эта база данных размещена. Когда мы дойдём до раздела по написанию файла конфигурации, там, нам пригодятся данные, которые были сгенерированы в этой главе.

    Создаём почтовый сервер

    Зайди на страницу управления почтовыми ящиками. Там ты увидишь адреса твоих сайтов, нажми на свой:
    После, необходимо будет добавить новый ящик.
    1. Вводишь желаемое имя (без @., и прочего)
    2. Генерируешь пароль (сохрани)
    3. Запомни полное название своего ящика, он пригодиться
    На этом базовое создание и почтового ящика закончено. Дальше я покажу куда и что писать при конфигурации почты сайта.

    Разворачиваем сайт на хостинге

    Подготовка или связываем домен с сайтом

    Хочу начать с простого способа. Предварительно нам потребуется создать сайт и привязать к нему домен. Всё делается на странице https://cp.beget.com/sites:
    Так же, после создания сайта, в настройках укажи редирект с HTTP на HTTPS. Мы ведь хотим, чтобы у нас было защищённое соединение. Я создам 2 сайта один для bddt.space другой для staging.bddt.space. Опять же, если тебе не нужен тестовый функционал, можешь создать только один.

    Подключение к хостингу через SSH

    Чтобы иметь возможность работать с удалённым сервером, нам необходимо подключиться к нему. Есть несколько способов это сделать, самый простой это использовать встроенные команды и утилиты самого хостинга. Но я буду использовать более олдскульный способ - SSH.
    SSH (Secure SHell) - это интернет-протокол по которому осуществляется безопасное, зашифрованное общение между клиентом и сервером. Есть SSH-клиент (он необходим для тех машин, с которых будет осуществлено подключение), а есть SSH-сервер (он необходим, если вы хотите предоставить удалённый доступ к своей машине). Все сервера имеют SSH-сервер установленным по умолчанию.
    Чтобы это сделать, используй следующую команду в терминале:
    ssh USERNAME_PLACEHOLDER@USERNAME_PLACEHOLDER.beget.tech
    Где вместо USERNAME_PLACEHOLDER используй имя созданного пользователя (или логин). После чего, нужно будет ещё войти в докер:
    ssh localhost -p222
    После того как мы успешно вошли в докер, создадим и зайдём в tmp директорию, где и будем устанавливать необходимые пакеты:
    mkdir ~/.beget/tmp cd ~/.beget/tmp

    Устанавливаем OpenSSL

    Для корректной работы Django приложений начиная от 4.4 версии, необходимо использовать версию OpenSSL 1.1.1 и выше. Давай её установим и разархивируем полученный архив:
    wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz && tar -xzvf openssl-1.1.1l.tar.gz
    wget -это утилита командной строки для загрузки файлов из интернета по протоколам HTTP, HTTPS и FTP. Она позволяет скачивать как отдельные файлы, так и целые сайты, поддерживает возобновление загрузки, работу через прокси и многое другое
    tar - предназначена для создания, извлечения, модификации и просмотра архивов. Она часто используется для объединения нескольких файлов и/или каталогов в один архивный файл (называемый tarball), а также для работы с уже существующими архивами. tar также может использоваться с утилитами сжатия, такими как gzip, bzip2 или xz, для создания сжатых архивов
    Теперь, когда данный архив у нас есть, нужно будет сначала сконфигурировать файл для компиляции (make файл), а потом, непосредственно, скомпилировать и установить (используя ранее сгенерированный make файл):
    make - инструмент автоматизации сборки, который считывает Makefile (или GNUmakefile), чтобы определить, как скомпилировать и скомпоновать программу или набор программ.
    cd openssl-1.1.1l ./config --prefix=$HOME/.local --openssldir=$HOME/.local/ssl '-Wl,--enable-new-dtags,-rpath,$(LIBRPATH)' make -j$((`nproc`/4)) && make install
    Чтобы проверить, успешно ли был установлен openssl, выполни следующую команду(она должна вернуть версию openssl, т.е. 1.1.1l:
    openssl version

    Устанавливаем Python

    После того как openssl установлен можно перейти к установке python. Важно отметить что python версии 2.7 уже установлен на систему. Но, так как я лично не люблю данную версию, а ещё она сильно устарела, и её уже почти никто не использует, мы установим python версии 3.11.0.
    Теперь очередь за Python. Вернёмся обратно в ~/.beget/tmp, скачаем, а после и разархивируем:
    cd ~/.beget/tmp wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz tar -xvzf Python-3.11.0.tgz
    Мы успешно скачали и разархивировали Python приложение, теперь нужно будет сгенерировать файл make для последующей установки в систему:
    cd ~/.beget/tmp/Python-3.11.0 ./configure --prefix=$HOME/.local --with-openssl=$HOME/.local --with-openssl-rpath=auto --enable-optimizations --enable-loadable-sqlite-extensions LDFLAGS="-Wl,-rpath /usr/local/lib" make -j$((`nproc`/4)) && make install
    Чтобы проверить, всё ли установленно и установленно правильно, можно выполнить следующую команду:
    python3 --version

    Готовим файловую структуру сайта, переносим проект на сервер

    У нас есть всё необходимое, чтобы развернуть сайт на хостинг. Для этого обратимся к git репозиторию и скачаем наш сайт в директорию source. Но сначала зайдём в нужную директорию. У тебя дома(~), должна была появиться соответствующая директория под названием того домена, который ты закрепил за сайтом в самом начале. В моём случае это будет staging.bddt.space, зайдём туда и клонируем его:
    cd ~/staging.bddt.space git clone https://github.com/DmRafaule/DjangoDeploymentTest source
    Теперь создадим виртуальное окружение для данного сайта и установим туда все необходимые пакеты для работы сайта(предварительно активировав его):
    python3 -m venv venv source ./venv/bin/activate
    Перед тем как устанавливать какие бы то ни было пакеты, лучше убедиться что ты активировал нужное виртуальное окружение, делается это используя команду which, которая укажет путь исполняемой команды. Так, мы узнаем какой питон мы используем:
    which python
    И если, например (/home/t/timachuduk/staging.bddt.space/venv/bin/python) , ты получил путь который содержит имя виртуального окружения, то всё гуд и ты успешно активировал виртуальное окружение. Можешь с уверенностью устанавливать необходимые пакеты:
    pip install -r source/requirements.txt

    Конфигурация файлов работы сервера (.htaccess, passenger_wsgi.py, settings.py)

    Теперь нужно настроить некоторые особые файлы для корректной работы (и вообще работы) сайта. Начну с файла passenger_wsgi.py.
    .htaccess — это локальный конфигурационный файл веб-сервера Apache, который позволяет управлять настройками сайта.
    passenger_wsgi.py - служит точкой входа для вашего приложения, обеспечивая взаимодействие между веб-сервером (например, Apache или Nginx) и вашим WSGI-совместимым веб-фреймворком (например, Django или Flask)

    Файл passenger_wsgi.py

    Этот файл свяжет твоё django-приложение с сервером apache. Этот файл необходим для Passenger - программа для развёртывания Python-приложений на сервере (Ближайший аналог - Gunicorn).
    Его нужно ещё создать в корневой директории сайта т.е. ~/staging.bddt.space:
    touch ~/staging.bddt.space/passenger_wsgi.py
    И его необходимо ещё настроить:
    import os, sys # 1 sys.path.insert(0, '/home/t/timachuduk/staging.bddt.space/source/Website') # 2 sys.path.insert(1, '/home/t/timachuduk/staging.bddt.space/venv/lib/python3.11/site-packages') # 3 os.environ['DJANGO_SETTINGS_MODULE'] = 'Website.settings' from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
    1. Где под первым комментарием указывается путь до корня твоего проекта ( это там где manage.py файл находится).
    2. Где под вторым комментарием указывается путь до установленных пакетов через виртуальное окружение.
    3. Где под третьим комментарием указывается путь до файла settings.py относительно указанного первого путя.

    Файл settings.py

    Когда ты закончил с созданием и конфигурацией файла для Passenger, можно заняться редактированием файла settings.py. Нам необходимо будет только добавить домен staging.bddt.space в ALLOWED_HOSTS.
    Я не меняю файлы конфигурации в settings.py непосредственно. Делаю я это через файл settings.json, который после читается на старте самого приложения. Значения которых и добавляются в необходимые мне константы.
    { "SECRET_KEY": "django-insecure-4#-wrp_(53^0_9$%p8lq+qf43z0dx0ji6bh!sa1mfn^l)4-lq@", "DEBUG": true, "ALLOWED_HOSTS": ["staging.bddt.space"], "DATABASES": { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "timachuduk_bddt", "USER": "timachuduk_bddt", "PASSWORD": "xW%exys3ORGS", "HOST": "localhost", "PORT": 3306 } }, "EMAIL": { "DEFAULT_FROM_EMAIL": "bddt@bddt.space", "DEFAULT_TO_EMAIL": "chedrden@gmail.com", "EMAIL_HOST": "smtp.beget.com", "EMAIL_PORT": 25, "EMAIL_HOST_USER": "bddt@bddt.space", "EMAIL_HOST_PASSWORD": "Li9kYCBx*i!!" }, "STAGING_SERVER": "http://staging.bddt.space" }
    Как я переношу, данные из settings.json в Website/settings.py? В файле settings.py я открываю файл settings.json и читаю от туда данные, вот так:
    from django.utils.translation import gettext_lazy as _ from pathlib import Path import os import json import sys # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Read the settings file with open(os.path.join(BASE_DIR,"settings.json"), 'r') as settings_file: settings = json.load(settings_file) # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = settings["SECRET_KEY"] # SECURITY WARNING: don't run with debug turned on in production! DEBUG = settings["DEBUG"] ALLOWED_HOSTS = settings["ALLOWED_HOSTS"] STAGING_SERVER = settings["STAGING_SERVER"] # More code bellow # ...
    Использую JSON-формат, ибо просто очень удобно с ним работать через Python. Таким образом я могу спокойно пушить данный файл (settings.py) в коммит не опасаясь, что я могу случайно поместить туда чувствительные данные.

    Файл .htaccess

    Необходимо сказать веб-серверу Apache, как и через что вообще запускать наше Django-приложение. Делается это через файл .htaccess. Мы укажем, что хотим использовать Passenger и укажем, какую именно версию питона будет использовать:
    PassengerEnabled On PassengerPython /home/t/timachuduk/staging.bddt.space/venv/bin/python
    Данный файл должен быть в корневой директории сайта, т.е. там где public_html директория.

    Конфигурация статических и медиа файлов

    Последнее, что осталось настроить это места, где будут располагаться статические и медиа файлы. Дело в том, что apache-сервер имеет доступ только к директории public_html, но не к директории Django-приложения. Верно и обратное Django-приложение не имеет доступ к public_html директории ...
    По этому, когда твой сайт будет обрабатывать статику и пытаться загрузить на сервер медиа файлы, ему нужно помочь. Это легко можно сделать при помощи создания мягких ссылок, вот так:
    cd ~/staging.bddt.space/source/Website ln -s ../../public_html/static static ln -s ../../public_html/media media
    И конечно же нужно создать соответствующие директории в public_html:
    mkdir ~/staging.bddt.space/public_html/static mkdir ~/staging.bddt.space/public_html/media

    Завершаем развёртывание сайта

    И последними штрихами для завершения развёртывания сайта являются следующие команды:
    1. Миграция базы данных [./manage.py migrate]
    2. Сбор статических файлов [./manage.py collectstatic]
    3. Компиляция переводов (если есть) [./manage.py compilemessages]
    4. Проверка тестов (если есть) [./manage.py test]
    Хотя запустить тесты на хостинге от бегет тебе не удастся. Отсутствуют необходимые библиотеки для этого. Ну или я не понял как это обойти.
    После успешного выполнения каждой из них, можно считать, что сайт успешно развёрнут.

    Дополнительно (опционально, хотя не очень)

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

    Как перезагрузить сайт на Django если внёс изменения на нём ?

    Сервер почти готов, но сначала нужно обновить сервер, вернее сказать, перезапустить наше Django-приложение. Чтобы заставить Passenger это сделать, нужно создать ещё одну директорию tmp и создать там файл restart.txt:
    mkdir ~/staging.bddt.space/tmp && touch ~/staging.bddt.space/tmp/restart.txt
    Теперь, чтобы перезапустить Passenger, нужно только пересоздать файл restart.txt.

    Как перенести локальную базу данных на сервер ?

    Иногда, хочется держать сервер в продакшене и в разработке синхронизированными. То есть, чтобы они оперировали одной и той же базой данных. А иногда хочется сохранить свой труд и обезопасить его от сбоев и неожиданных потерях.
    Для этого можно сделать дамп базы данных и загрузить его, уже на сервере. У Django есть такая встроенная функция, которая позволяет сделать всё выше описанное.
    ./manage.py dumpdata --exclude auth.permission --exclude contenttypes > data.json
    Будет создан дамп базы данных (data.json), который можно будет переместить на сервер при помощи команды scp(не путать с фондом w(°o°)w ). Флаг --exclude необходим для исключения некоторых таблиц при экспорте.
    scp data.json timachuduk@timachuduk.beget.tech:~/staging.bddt.space/source/Website
    Для того чтобы успешно передать файл с локальной машины на сервер, тебе потребуется знать адрес сервера и место, куда ты бы хотел отправить файл. Где timachuduk это твой логин при создании, а timachuduk.beget.tech, это адрес твоего сервера на beget. Всё это можно найти на главной странице хостинга.
    Уже на сервере, нужно будет запустить команду загрузки базы данных, предварительно зайдя в директорию с manage.py файлом внутри.)
    ./manage.py loaddata data.json
    Хочу подчеркнуть, что кроме дампа базы данных тебе ещё потребуются и вся директория медиа-файлов. БД не хранит файлы, но только ссылки на них. По этому, не забудь переместить на сервер ещё и все свои медиа файлы

    Как перенести сайт на HTTPS протокол?

    Ты наверняка заметил, что твой сайт сейчас работает на HTTP протоколе, что в наше время не очень поощряется - ни пользователями, ни браузерами, ни поисковиками. Давай исправим это.
    На домен bddt.space мы уже выпустили сертификат, но на поддомен нет:
    1. Выбираем тип сертификата, бесплатный нам подойдёт.
    2. Выбираем поддомен на который хотим распространить работу сертификата.
    Потребуется подождать некоторое время. На самом сайте говорят, что это может занять от 15 минут до 2 дней. Так что дааа ... У меня всё установилось за 10 минут, кстати.
    После этого, нужно настроить редирект с http на https. Для этого, на странице управлениями сайтами https://cp.beget.com/sites нужно:
    1. Выбрать сайт, для которого настроить редирект
    2. Включить редирект
    Это опять же может занять некоторое время, около 15 минут. Но если все предыдущие шаги были сделаны правильно, переход на https версию не должен быть проблемой.

    Разворачиваем сайт на VPS

    Я рад, что ты решил пойти может не самым простым, но точно самым интересным путём. Даже более, если смог научиться разворачивать сайт на VPS от beget, то ты сможешь развернуть сайт и на других VPS, в независимости от хостинг провайдера.
    Давай сделаю небольшой обзор того, что ты должен знать или что ты узнаешь в ходе прочтения данной главы:
    1. Работа в Linux-терминале
    2. Работа через оболочку SSH
    3. Работа с сервисами и демонами через systemctl
    4. Настройка и работа с Nginx сервером
    5. Настройка и работа с Gunicorn
    6. Написание и выполнение Bash-скриптов

    Создаём VPS на beget

    Первым делом создадим VPS и настроим его. В личном кабинете, на табе с облачком, нажми создать VPS.
    Дальше вас ждёт, страница конфигурации в которой следует выбрать Ubuntu и настроить параметры сервера (ко-во ядер, место на диске, оперативку). Можно так же добавить свой SSH-ключ для доступа без пароля. О том как такой ключ можно сделать и как его использовать я написал отдельную статью.
    Мы успешно создали виртуальную машину, теперь нужно чтобы с этой машиной ассоциировался купленный нами домен bddt.space. Для этого нужно отредактировать А-запись в DNS. Скопируй IP адрес своего VPS и отредактируй A-запись.
    A-запись отвечает за возвращение 32-битного числ, более известного как IPv4. Используется для соединения IPv4 адресов с доменными именами.
    Копируем IP-адрес
    Выбираем свой домен, после чего редактируем А-записи в необходимых доменах и поддоменах
    Ты можешь ещё изменить A-записи в сайтах с поддоменом www, например.
    Я нашёл вот такую вот, классную инфографику DNS-записей, которая вкратце показывает для чего каждая запись используется. Здесь представлены не все записи, только самые используемые:
    Чтобы изменения вступили в силу надо подождать минут 10-15 минут.

    Подключаемся к VPS

    После создания сервера нужно будет его немного настроить. Совсем чуть-чуть. Установить необходимый минимум пакетов, плюс создать пользователя от лица которого будет запускаться сайт.
    Чтобы всё это сделать надо сначала попасть на него. Сделаем мы это через SSH.
    SSH (Secure SHell ) - это интернет-протокол по которому осуществляется безопасное, зашифрованное общение между клиентом и сервером. Есть SSH-клиент (он необходим для тех машин, с которых будет осуществлено подключение), а есть SSH-сервер (он необходим, если вы хотите предоставить удалённый доступ к своей машине). Все сервера имеют SSH-сервер установленным по умолчанию.
    Вообще, можно обойтись и встроенными средствами на самом сайте. Там есть и файловый менеджер, и эмулятор терминала, через которые тоже можно работать. Может кому-то это будет удобнее.
    Я буду использовать PowerShell, в качестве терминальной оболочки, через которую подключусь к серверу. Вообще не имеет значение через что ты подключишься к серверу. Это может быть Git Bash, PowerShell, PuTTy или что-то ещё. Главное чтобы был установлен SSH-клиент на вашей машине.
    PowerShell, Git Bash, PyTTy - все они являются терминальными эмуляторами. Суть которых состоит в том, чтобы получить на входе текст(команду), а на выходе выполнить некое действие, взаимодействие с той или иной программной частью машины.
    На Linux машинах SSH-клиент установлен по умолчанию, но на Windows нет. Чтобы активировать SSH-клиент, потребуется просто активировать такую "Фичу". Вот замечательная статья об этом.
    Чтобы подключиться к удалённому серверу открой свой любимый терминал и введи следующую команду:
    ssh root@192.168.1.1
    Или, если ты загрузил при создании VPS, ключ аутентификации, можно использовать его (нужен именно приватный):
    ssh root@192.168.1.1 -i .ssh/rsa_key
    1. Где root - это имя пользователя, через которого ты хочешь иметь доступ к серверу.
    2. Где 192.168.1.1 - это адрес сервера к которому ты хочешь подключиться.
    3. Где .ssh/rsa_key - это путь к приватному ключу для подключения без пароля
    Всё это, можно найти на странице, ранее созданного VPS. Ну кроме ключа, при его создании, ты должен был запомнить, где его сохранил :). Обычно это .ssh директория.

    Устанавливаем необходимые пакеты

    Теперь время для Ctrl-C, Ctrl-V. Сейчас будет немного команд, которые установят на ваш сервер необходимые пакеты:
    apt-get update apt-get upgrade apt-get install gettext libgettextpo-dev apt-get install pkg-config default-libmysqlclient-dev build-essential apt-get install nginx apt-get install gunicorn apt-get install python3.12-venv python3-dev
    Теперь давай поговорим о том, для чего я всё это установил, и что сделала каждая из этих команд:
    1. apt-get update - всегда выполняй её первой, при установке любого пакета. Она синхронизирует индекс пакетов приложений и обновляет все зависимости, при необходимости.
    2. apt-get upgrade - устанавливает самые последние версии установленных пакетов на системе.
    3. apt-get install gettext libgettextpo-dev - она устанавливает зависимости необходимые для генерации переводов для твоих сайтов (которые используют утилиту gettext)
    4. apt-get install pkg-config default-libmysqlclient-dev build-essential - необходимые зависимости для работы с базами данных на MySQL.
    5. apt-get install nginx - для запуска веб-сервера
    6. apt-get install gunicorn - для переадресации запросов от nginx-сервера к нашему django-приложению
    7. apt-get install python3-dev python3.12-venv - для возможности создания виртуального окружения при работе python-приложений
    С установкой необходимых пакетов на сервер мы закончили. Остались только "не необходимые". Можешь пропустить до начала следующей главы, если у тебя нет функциональных тестов в приложении.
    nginx - это легко конфигурируемый веб-сервер и прокси для запросов направляемые на сервер.
    gunicorn - это сервер для python-приложений который связывает веб-сервера (такие, как nginx и apache) и python приложение
    Мой "не необходимый" пакет - это selenium. Чтобы мои функциональные тесты отработали, мне он необходим. И чтобы он работал, ему потребуется браузер Firefox, который мы и установим как .deb пакет. О бой, это то ещё приключение ヽ(°〇°)ノ. Всех интересующихся приглашаю посетить официальный сайт мозилы и выполнить одну команду за другой.
    В дополнение к firefox, потребуется ещё установить geckodriver. Версии последних релизов можно найти здесь: https://github.com/mozilla/geckodriver/releases . И теперь, команда для установки этого geckodriver:
    wget https://github.com/mozilla/geckodriver/releases/download/v0.36.0/geckodriver-v0.36.0-linux64.tar.gz tar -xzvf geckodriver-v0.36.0-linux64.tar.gz sudo mv geckodriver /usr/local/bin/
    Скачав (wget) и разархивировав geckodriver (tar -xzvf), мы после поместили его в /usr/local/bin/ директорию, чтобы у всех приложений был доступ к драйверу.

    Создаём пользователя

    Этот шаг обязателен и не думай делать сайт на root-правах. Сейчас необходимо будет создать пользователя с root привилегиями и домашней директорией.
    useradd -m -s /bin/bash site passwd site usermod -aG sudo site
    Первая команда создаст пользователя по имени "site", создаст для него домашнюю директорию (флаг -m) и установит командную оболочку по умолчанию т.е. bash. Вторая команда задаст пароль для нового пользователя. Третья добавит пользователя "site" в sudo группу, которая способна выполнять все команды, только с использованием команды sudo.
    sudo - это команда(программа) выполняемая в терминале на Unix-like операционных системах (Linux, MacOS), которая позволяет запускать другие программы с разрешениями выполнять административные и потенциально опасные команды.

    Перенос проекта

    База для нашего сервера готова, теперь давай займёмся файлами самого сайта. Я собираюсь создать простую файловую структуру, где при помощи git получу файлы своего проекта и скопирую их в source директорию. А так же, создам виртуальное окружение:
    Все дальнейшие команды я выполнял от лица новосозданного пользователя "site". Если, что-то изменится, я дам знать.
    mkdir ~/staging.bddt.space cd ~/staging.bddt.space git clone https://github.com/DmRafaule/DjangoDeploymentTest source python -m venv venv
    После выполнения всех этих команд, у тебя должна будет получиться следующая структура проекта:
    1. staging.bddt.space <- Ты тут
    2. venv
    3. source
    Теперь, активируем виртуальное окружение и установим необходимые пакеты из source/requirements.txt:
    source ./venv/bin/activate pip install -r source/requirements.txt
    Здесь не должно возникнуть ни каких проблем, но если всё таки возникли прочитайте внимательно логи ошибок. Зачастую, это просто не установленные зависимости на сервере, которые легко исправить при помощи пакетного менеджера apt. Давай попробуем запустить установленное Django-приложение (предварительно зайдя в директорию с файлом manage.py:
    cd ./source/Website python manage.py runserver

    Настройка базы данных mysql и почты (опционально, хотя не очень)

    Тебе выдаст ошибку, что файл settings.json не был найден. Это файл конфигурации, который я использую как прокси, вместо того чтобы писать непосредственно в settings.py. Сделал я это с той целью, чтобы можно было безопасно добавлять файл settings.py в git репозиторий и для упрощения развёртывания.
    Вот пример такого файла(settings.json), создай его в source/Website директории:
    { "SECRET_KEY": "django-insecure-4#-wrp_(53^0_9$%p8lq+qf43z0dx0ji6bh!sa1mfn^l)4-lq@", "DEBUG": true, "ALLOWED_HOSTS": ["staging.bddt.space"], "DATABASES": { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "timachuduk_bddt", "USER": "timachuduk_bddt", "PASSWORD": "xW%exys3ORGS", "HOST": "timachuduk.beget.tech", "PORT": 3306 } }, "EMAIL": { "DEFAULT_FROM_EMAIL": "bddt@bddt.space", "DEFAULT_TO_EMAIL": "chedrden@gmail.com", "EMAIL_HOST": "smtp.beget.com", "EMAIL_PORT": 25, "EMAIL_HOST_USER": "bddt@bddt.space", "EMAIL_HOST_PASSWORD": "Li9kYCBx*i!!" }, "STAGING_SERVER": "http://staging.bddt.space" }
    Как ты видишь, я уже использую MySQL в качестве базы данных. Что нужно знать для подключения к базе данных из VPS:
    1. Во-первых нужно знать какой бекенд подключать - django.db.backends.mysql
    2. Во-вторых имя пользователя и базы данных, они будут совпадать - timachuduk_bddt
    3. В-третьих, пароль от базы данных - xW%exys3ORGS
    4. В-четвёртых, имя хоста базы данных - его можно найти на странице настройки баз данных
    5. И в пятых порт подключения - он всегда один и тот же - 3306
    Все эти данные можно получить при создании своей базы данных, процесс которого я описал в соответствующей главе в начале.
    Так же, у меня ещё настроенна почта. Давай я расскажу для чего существует каждая их этих переменных:
    1. DEFAULT_FROM_EMAIL - это адрес почты от имени которого мы отправляем сообщения. Необязательно
    2. DEFAULT_TO_EMAIL - это адрес почты на имя которой отправляется сообщение. Необязательно
    3. EMAIL_HOST - это константа, smtp.beget.com
    4. EMAIL_PORT - это константа, 25
    5. EMAIL_HOST_USER - имя ранее созданного почтового ящика, bddt@bddt.space в моём случае
    6. EMAIL_HOST_PASSWORD - ранее заданный пароль
    Как я переношу, данные из settings.json в Website/settings.py? В файле settings.py я открываю файл settings.json и читаю от туда данные, вот так:
    from django.utils.translation import gettext_lazy as _ from pathlib import Path import os import json import sys # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Read the settings file with open(os.path.join(BASE_DIR,"settings.json"), 'r') as settings_file: settings = json.load(settings_file) # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = settings["SECRET_KEY"] # SECURITY WARNING: don't run with debug turned on in production! DEBUG = settings["DEBUG"] ALLOWED_HOSTS = settings["ALLOWED_HOSTS"] STAGING_SERVER = settings["STAGING_SERVER"] # More code bellow # ...
    Использую JSON-формат, ибо просто очень удобно с ним работать через Python.

    Заканчиваем перенос проекта

    Уже, кстати, можно запустить тесты и посмотреть, что работает, а что нет. Всё должно отработать:
    Итак, мы успешно закинули наш сайт на сервер и даже прошли все тесты. А это значит, что пора настроить nginx, после чего свяжем наш сайт с nginx веб-сервером через gunicorn.

    Настраиваем Nginx

    Вместе с файлами проекта, ты ещё получишь дефолтные файлы конфигурации для настройки nginx - nginx-server-http_only.conf, nginx-server-https_301.conf, nginx-server-https.conf. Пока открой файл nginx-server-http_only.conf, ты увидишь следующую конфигурацию для нашего сайта:
    server { listen 80; server_name HOST_PLACE_SETUP; location /static { root /home/USER_PLACE_SETUP/HOST_PLACE_SETUP; } location /media { root /home/USER_PLACE_SETUP/HOST_PLACE_SETUP; } location / { proxy_set_header Host HOST_PLACE_SETUP; proxy_pass http://unix:/tmp/HOST_PLACE_SETUP.socket; } }
    1. В этой конфигурации мы настраиваем порт на котором мы будем слушать входящие запросы.
    2. Имя для нашего сервера (доменное имя). В моём случае это должно быть staging.bddt.space.
    3. Папки, которые этот сервер будет обслуживать. Как минимум нужно настроить корневой каталог "/". Но этим всё не ограничивается, на моём сайте используется различная статика в виде картинок и иконок. Плюс медиа файлы, которые загружаются непосредственно пользователем.
    Что за непонятные переменные USER_PLACE_SETUP и HOST_PLACE_SETUP? Всё дело в том, как работает мой кастомный скрипт по настройке сервера. Если в кратце, то он, используя sed команду заменяет две вышеуказанные переменные и заменяет их на необходимые администратору значения. Всё это делается через специальный скрипт server-setup.sh, о котором через главу.
    Итак, финальная версия этой конфигурации будет выглядеть вот так:
    server { listen 80; server_name staging.bddt.space; location /static { root /home/site/staging.bddt.space; } location /media { root /home/site/staging.bddt.space; } location / { proxy_set_header Host staging.bddt.space; proxy_pass http://unix:/tmp/staging.bddt.space.socket; } }
    Чтобы не забыть, давай сразу создадим директории media и static в ~/staging.bddt.space директории и мягкие ссылки на них. Мягкие ссылки на них создаются с тем, чтобы предоставить серверу доступ к ним.
    cd ~/staging.bddt.space mkdir static mkdir media cd source/Website
    Мягкая ссылка, также известная как символическая ссылка или симлинк (symlink), - это специальный вид ссылки в файловой системе, который указывает на другой файл или каталог, но не содержит данных файла-оригинала.
    Все необходимые директории были созданны и теперь мы готовы создать мягкие ссылки, на эти директории:
    ln -s ../../static static ln -s ../../media media
    Теперь у проекта следующая структура:
    1. staging.bddt.space
    2. venv
    3. media
    4. static
    5. source
    6. Website
    7. Backend
    8. Frontend
    9. Website
    10. media -> ../../media
    11. static -> ../../static
    12. manage.py
    13. settings.json
    14. deploy.sh
    15. server-setup.sh
    16. requirements.txt
    17. gunicorn.service
    18. nginx-server-http_only.conf
    19. nginx-server-on_https-301.conf
    20. nginx-server-on_https.conf
    При работе с медиа файлами, сервер может дать 413 ответ - 413 Request Entity Too large. Связано это с тем, что максимальный размер тела в запросе по умолчанию может быть не больше 1 Мегабайта. Что бы изменить это, в файле /etc/nginx/nginx.conf, в раздел http добавь: ```client_max_body_size 50M;```
    Теперь, любой файл который будет создан в директории ~/staging.bddt.space/source/Website/static или ~/staging.bddt.space/source/Website/media будет доступен и в директориях ~/staging.bddt.space/static и ~/staging.bddt.space/media.
    Чтобы это проверить, можешь запустить команду collectstatic и убедиться что все файлы, хоть и были скопированы в ~/staging.bddt/source/Website/static, так же доступны и в ~/staging.bddt.space/static.

    Решаем проблему с 403 ошибкой - запрещено

    Ещё одна, очень часто возникающая проблема, это то что сервер может возвращать 403 ответ на запрос какого-нибудь статического файла. Зачастую это связано с тем что у пользователя www-data, нет разрешения на чтение определённых файлов. В файле настройки nginx указан пользователь от лица которого и запускается веб-сервер.
    Чтобы это исправить есть три способа:
    1. Заменить пользователя в файле /etc/nginx/nginx.conf
    2. Дать доступ всем к чтению файлов
    3. Добавить пользователя www-data в группу пользователя, который запускает приложение.
    Я опишу 3-й ибо это, на мой взгляд самый простой и правильный способ. И нужно всего лишь выполнить одну команду:
    sudo usermod -aG site www-data
    1. site - имя группы к которому хотите добавить пользователя (оно будет совпадать с именем пользователя)
    2. www-data - имя пользователя, которого хотите присоединить к группе.
    Теперь вся статика, и все медиа файлы на сайте должны быть доступны.

    Заканчиваем настройку Nginx

    Давай закончим настраивать веб-сервер и скопируем созданный файл конфигурации в /etc/nginx/sites-available:
    sudo cp ~/staging.bddt.space/source/nginx-server.conf /etc/nginx/sites-available/staging-nginx-server.conf
    Теперь сделаем то же самое что и с директориями static и медиа, создадим мягкую ссылку на этот файл конфигурации. Но сначала перейди в директорию где должна быть эта ссылка:
    sudo cd /etc/nginx/sites-enabled sudo ln -s ../sites-available/staging-nginx-server.conf staging-nginx-server.conf
    Перезапустим nginx-службу при помощи systemctl, чтобы изменения вошли в силу:
    sudo systemctl restart nginx
    Я думаю, сейчас стоит попробовать посетить наш сайт - staging.bddt.space.
    И да, ты должен увидеть что-то вроде этого. Почему так происходит, что за "Плохой шлюз"? А дело всё в одной строке, в файле конфигурации сайта /etc/nginx/sites-available/staging-nginx-server.conf.
    ... proxy_pass http://unix:/tmp/staging.bddt.space.socket; ...
    По факту, nginx-сервер перенаправил мой GET-запрос по указанному сокету, но к нему ещё ничего не подключено. Вот на этом моменте в роль вступает gunicorn.

    Настраиваем Gunicorn

    Почти готовый файл конфигурации, находится там же где и файл конфигурации nginx-сервера - ~/staging.bddt.space/source/gunicorn.service. Это файл описывающий работу linux-демона, вот его содержимое:
    [Unit] Description=Gunicorn server for HOST_PLACE_SETUP [Service] Restart=on-failure User=USER_PLACE_SETUP WorkingDirectory=/home/USER_PLACE_SETUP/HOST_PLACE_SETUP/source/Website ExecStart= /home/USER_PLACE_SETUP/HOST_PLACE_SETUP/venv/bin/gunicorn --bind unix:/tmp/HOST_PLACE_SETUP.socket Website.wsgi:application [Install] WantedBy=multi-user.target
    Данный скрипт имеет подстановочные переменные HOST_PLACE_SETUP И USER_PLACE_SETUP. Я заменяю их на необходимые мне значения через специальный скрипт server-setup.sh. О нём подробнее в следующей главе.
    Данный сервис(демон), запущенный пользователем site и с его привилегиями, будет перезагружаться каждый раз при возникновении какой-либо ошибки (Restart=on-failure). Работать данный демон будет в директории указанной в WorkingDirectory. А делать он будет то, что указано в ExecStart, то есть запускать gunicorn сервер.
    При запуске gunicorn мы так же указали к какому сокету подключаться и куда перенаправлять запросы - в наше Django-приложение.
    Создай такой же файл в /etc/systemd/system/ и отредактируй вставив своего пользователя, свой домен и свой сокет. Теперь запустим службу и сделаем так, чтобы она запускалась на сервере при загрузке.
    sudo cp ~/staging.bddt.space/source/gunicorn.service /etc/systemd/system/staging-gunicorn.service sudo vim /etc/systemd/system/staging-gunicorn.service sudo systemctl start staging-gunicorn sudo systemctl enable staging-gunicorn
    Теперь всё будет работать. Мы создали специальный сервис, который запускает gunicorn-сервер при старте, а он в свою очередь запускает наше django-приложение. Обновив вкладку, ты должен будешь увидеть следующее:

    Переходим на HTTPS (опционально, хотя не очень)

    Вообще, изначально, я думал, что есть какой-то способ получить(переместить) сгенерированный сертификат от Beget на VPS. Но я такого способа не нашёл.
    Поэтому, решил получить сертификат от LetsEncrypt непосредственно. Он бесплатный, но что более классно, всё можно сделать через командную строку, а значит автоматизировать. Смотри, для того чтобы, настроить nginx веб-сервер потребуется сертификат и ключ к нему.
    Команда LetsEncrypt, сделала специальную утилиту, которая очень крутая в плане поддерживаемых стеков технологий для сертификации. Вот, например страница для генерации, подписи и издания сертификатов для сайтов на nginx и использующий pip. Просто чума) И не нужно этой мозгоебли с самоподписанными сертификатами, которым никто не доверяет, и как результат, никто не заходит на сайт.
    Активируем виртуальное окружение и установим программу:
    source ~/staging.bddt.space/venv/bin/activate pip install certbot certbot-nginx
    Теперь генерируем и подписываем сертификаты:
    sudo ~/staging.bddt.space/venv/bin/certbot certonly --nginx -d staging.bddt.space
    Данная команда сгенерирует и подпишет сертификаты, которые расположит в /etc/letsencrypt/live/staging.bddt.space. Ты увидишь вот такой вот интерактивный промпт:
    1. Просит ввести почту
    2. Согласись на продажу своей души и души своего сайта)
    3. Регистрация, по желанию
    4. Выбор доменов(поддоменов) для который будет действовать данный сертификат. Если просто нажать ENTER, сертификат будет применён ко всем.
    5. Путь до сертификата (для настройки nginx)
    6. Путь до ключа (для настройки nginx)
    Можно так же задать cron-задачу на обновление сертификата, каждый месяц:
    echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
    Осталось только поменять конфигурации в sites-available, делается это так:
    server { listen 443 ssl; server_name HOST_PLACE_SETUP; ssl_certificate /etc/letsencrypt/live/staging.bddt.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/staging.bddt.space/privkey.pem; location /static { root /home/USER_PLACE_SETUP/HOST_PLACE_SETUP; } location /media { root /home/USER_PLACE_SETUP/HOST_PLACE_SETUP; } location / { proxy_set_header Host HOST_PLACE_SETUP; proxy_pass http://unix:/tmp/HOST_PLACE_SETUP.socket; } }
    Отличие от предыдущей конфигурации состоит в том, что мы поменяли порт и добавили ssl_certificate и ssl_certificate_key. Пути для которых вам скажет certbot. Вот собственно и всё, по тому как добавить https на ваш сайт.
    Но ты мог заметить, что при попытке получить свой сайт через обычный http, уже не получиться. Нужно будет сделать отдельную конфигурацию для 80 порта и сделать 301 редирект на https версию. Это считается хорошей практикой. Для этого создайте ещё один файл конфигурации в /etc/nginx/sites-available, например http_301_redirect-staging.bddt.space, и создайте файл со следующей конфигурацией:
    server { listen 80; server_name HOST_PLACE_SETUP; location / { return 301 https://HOST_PLACE_SETUP$request_uri; } }
    Где HOST_PLACE_SETUP, это домен вашего сайта, например staging.bddt.space. Данная конфигурация делает 301 редирект с любых страниц с протоколом http на страницы с протоколом https.
    301 код сервера - Его ещё называют перманентный редирект, ответ сервера при котором происходит перенаправление с одного URL на другой.
    Есть ещё и 302 код сервера и это тоже редирект. Так в чём их отличие? Отличие в значении которое передаёт 302 код. Если 301, то он как бы говорит: УРЛ на который ты попал, всегда будет доступен только по новому адресу. А 302, в свою очередь говорит: УРЛ на который ты попал сейчас доступен по этому адресу, но возможно так будет не всегда.

    Деплой боевого сервера (опционально)

    Самая тяжёлая часть пройдена. И если ты хотел просто развернуть сайт без каких-либо тестовых версий и поддоменов, то тут ты можешь остановиться. Ведь мне больше нечего сказать по этому поводу. Сайт развернули, почтовый сервис и базы данных подключили, сервера nginx и gunicorn настроили, HTTPS протокол подключили.
    Ну а если ты, как и я хотел развернуть сначала тестовый сайт, давай продолжим.
    По сути, чтобы развернуть уже боевой сервер, нужно проделать всё то же самое что и с тестовым, только выбрать соответствующий домен. Как ты уже понял это не самое весёлое занятие по этому я написал 2 bash скрипта, которые помогут в настройке сервера - server-setup.sh и в подготовке файловой системы и проекта в целом - deploy.sh.
    Я не буду расписывать, особенности работы этих скриптов, ибо написал о них отдельно, смотри ссылки. По факту, скрипт deploy.sh описывает главу "Перенос проекта" с некоторыми особенностями работы git. А скрипт server-setup.sh описывает главы: Настраиваем Nginx, Настраиваем Gunicorn и Переходим на HTTPS.
    Сначала запустим скрипт server-setup.sh:
    cd ~/staging.bddt.space/source ./server-setup.sh bddt.space on_https
    1. bddt.space - это домен боевого сервера
    2. on_https - это флаг, который указывает скрипту разместить сайт сразу на протоколе HTTPS
    Запустив, ты увидишь, что-то вроде этого:
    Теперь деплой. Скрипт deploy.sh как раз этим и занимается. Он работает в тандеме с git, по этому желательно его иметь установленным. Если указанного сайта ещё нет на сервере он его клонирует с репозитория и соответственно настроит. А если он уже есть он обновит его до последнего совершённого комита.
    cd ~/staging.bddt.space/source ./deploy.sh bddt.space --skip-tests
    1. Где bddt.space - домен твоего боевого сервера.
    2. Где --skip-tests - пропуск тестов
    Вот что выдаст скрипт deploy.sh, при запуске:
    Всё, мы закончили разворачивать боевой сервер. И теперь наш рабочий процесс будет выглядеть следующим образом, по крайней мене, я так его вижу:
    1. Мы делаем некоторые изменения в проекте на локальном сервере на ноутбуке(например)
    2. Делаем коммит
    3. Подключаемся к серверу и тащим(git pull) обновления на тестовый сервер - staging.bddt.space
    4. Запускаем тесты (Функциональные, Модульные). Сами, в конце концов, обозреваем не сломали ли чего
    5. Если всё ок, запускаем deploy.sh и изменения, которые были сделаны на локальном сервере применяются на боевом сервере - bddt.space.

    Сравнение запуска сайта через Хостинг и через VPS

    Я решил написать сравнение в форме таблицы, где явно покажу что и где лучше делать.
    Возможность тестированияНет или ограниченаБез ограничений
    Кастомная структура проектаОграничена Без ограничений
    Автоматизация, деплоя, настроек и пр.ОграниченаБез ограничений
    WSGI серверPassengerБез ограничений
    Веб серверApacheБез ограничений
    Переход на HTTPSПочти незамтенаСложно
    Настройка базы данныхЛекгоЧуть сложнее
    Настройка почтыЛегкоЛегко
    Подключение доменаПочти незаметнаСложно
    ЦенаДёшевоДороже
    ПоказателиBeget HostingBeget VPS
    Могу сказать, что мой выбор это всё-таки разворачивание сайта на VPS. Это даёт мне больше свободы, но и ответственности тоже. Для меня лично, очень большим минусом является отсутствие тестирование как такового на хостинге. Они чего-то не до установили и теперь TDD тут не сделаешь, а я очень хочу (╥_╥)

    Заключение

    Надеюсь, что я просто ошибаюсь и просто чего-то не знаю и запускать тесты всё-таки можно и даже функциональные. Но, если тебе не нужна тестовая прослойка или просто хочется установить сайт, чтобы его видели, то beget хорошо подходит для этого. Просто, понятно, наглядно.
    А так, я надеюсь, что данная статья помогла тебе разобраться с тем как и где разворачивать твой сайт написанный на Django. Ещё я надеюсь на твой благой комментарий и тем, что ты можешь захотеть поделиться этой статьёй с другом или подругой. В любом случае до встречи в следующей статье (⌒‿⌒)


    Не забудь поделиться, лайкнуть и оставить комментарий)

    Комментарии

    (1)

    captcha
    Отправить
    ЗАГРУЗКА ...
    Часы
    24 мая 2025 г. 17:41
    Человек
    Илья
    Добрый день! спасибо за статью - много полезной информации. Но можно ее сделать чуть более развернутой - для чайников, кто пишет на питон часто, а вот сайты написанные на питон размещает раз в десять лет. Хотелось бы более подробной информации о том как при развертывании сайта использовать имеющиеся инструменты конкретного хостинга (в нашем случае бигет): нужно ли через их CMS предварительно накатывать джанго, более подробно по подключение через терминал (а если его нет, какие клиенты использовать), как использовать и настраивать установленный по умолчанию на сервере питон, как и каким папкам выставлять права, как перетаскивать сайт на хостинг (например у бигет есть свой фтп клиент, как использовать его или аналоги). Понимаю что часть информации заведомо опускается для краткости, но тогда получается статья для тех, кто и так в курсе. А хотелось бы статью для тех кто в танке )) З.Ы. Не сочтите за критику - просто мысли по прочтению и попытке использовать статью для руководства по заливке сайта.
    Все ответы (1)
    Ответить
    ЗАГРУЗКА ...

    Другое

    Похожие статьи


    Причины ошибки err_http2_ping_failed и способ решения задержки ответов сервера

    Часы
    29.09.2024
    /
    Часы
    02.10.2025
    Глазик
    2151
    Сердечки
    1
    Соединённые точки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    В этой статье, я подробно опишу как я решил проблему задержек и постоянных прерываний ответов с сервера. Опишу работу ошибки err http2 ping failed и какие шаги я предпринял чтобы …

    Как разместить django сайт на хостинг(или VPS) от reg.ru Полная инструкция

    Часы
    16.03.2025
    /
    Часы
    02.10.2025
    Глазик
    3730
    Сердечки
    0
    Соединённые точки
    0
    Соединённые точки
    2
    Соединённые точки
    0
    Как развернуть django-сайт на хостинге (или VPS) от reg.ru. Так же, как создать и настроить БД(в том числе и используя кластер в рег облаке). Настроим переадресацию на HTTPS, будет показано …

    Использованные термины


    Релевантные вопросы