Руководство по созданию самоустанавливающегося сайта на Django с использованием Ubuntu сервера и моего репозитория

Кому подойдет?

Прежде всего тем, кто способен зайти на Ubuntu сервер по SSH, создать пользователя и прописать ему sudo права. Если вы сейчас не поняли, о чем я сказал, то дальнейший текст можно не читать.

Кому пригодится?

Думаю, полезно будет изучающим Python и особенно Django, а также тем, кому нужен быстрый, личный сайт с блогом и другими функциональными модулями без глючных-тормознутых-бесплатных CMS. Категории создаются через панель управления, наполняются материалами через редактор в админ разделе. Код и URL-адреса править из коробки не нужно — все работает через re_path и базу данных. Добавил категорию, закинул в нее статьи, и новый раздел на сайте готов. Неправильные пути в запросах, админская часть или исключения обслуживаются через тот же re_path, поэтому 404, 403, 401, 503, 500 работают без исключений и хендлеров, просто выводя сообщение на сайте.

Роут-функция build_main построения страниц в зависимости от пути, возможно, будет сложна для понимания обучающимся, поэтому постарался все подробно закомментировать. Да вообще, где не забыл, везде комменты через строку.

Кастомный тег url_with_timestamp в шаблонах добавляет к пути CSS и JS файлам время создания, поэтому, когда вы закинули обнову в скриптах или стилях, нет нужды очищать кэши или еще что-то. Новый файл юзер сразу загрузит.

Что тут можно почерпнуть:

  • Как запустить Django полностью асинхронно.
  • Как не использовать ORM Django, которое не дружит с асинхронностью.
  • Как связать сайт и Telegram-бота, чтобы они взаимодействовали.
  • Как добавить Svelte в Django-проект.
  • Как использовать более легкий posix_ipc вместо Redis.
  • Как могут помочь bash-скрипты в развертывании проекта.

Подробности

1. Параметры Gunicorn

Параметры Gunicorn нужно подбирать под ваше оборудование. Тестирование проводилось на Ubuntu 22 Server с 2 ядрами и 2 ГБ памяти. Для работы достаточно 1 ГБ памяти, но желательно иметь 2 ядра, особенно если вы используете Fail2Ban, Telegram-бота или другие дополнительные сервисы.

2. Аутентификация

На личном сайте я не использовал Django-аутентификацию, да и не работает она с async как надо. Все управление происходит через проверку статичного IP-адреса, который обрабатывает декоратор. Ответы на сайте можно отправлять через бота. Можно добавить SSL-аутентификацию для админ панели, но это необязательно. Для формы чата есть кастомная капча.

3. Взаимодействие с ботом

Если пользователь пишет сообщение на сайте, оно автоматически приходит в бота. Через бота можно ответить, и пользователь получит сообщение на сайте.

4. Использование Svelte

Это первая моя попытка интеграции Svelte в Django-проект. Все работает корректно. Позже планирую расширить использование функционала Svelte, но для текущих задач этого достаточно.

5. Замена Redis на posix_ipc

Redis может быть слишком тяжелым для минимальной конфигурации сервера. Вместо него используется posix_ipc с простейшим функционалом для хранения разделов сайта и содержимого в памяти. Как работает. Запускается при старте из systemd помещая таблицы по списку имен pandas датафреймами в память, после обновляет из по запросу при изменении.

6. Управление сервером

Тут скрипт для установки и настройки всего — system_setup.sh. У себя обычно использую для управления удаленными серверами Python-скрипты через paramiko. Можно выбирать команды через меню и обновлять все необходимое. Набор команд примерно тот же, что и в sh.

Создание пользователя

Создайте пользователя site_user:

sudo adduser site_user

Чтобы пользователь мог выполнять команды sudo без ввода пароля, отредактируйте файл /etc/sudoers:

sudo visudo

Добавьте следующую строку в конец файла:

site_user ALL=(ALL) NOPASSWD: ALL

Добавьте пользователя в группу sudo:

sudo usermod -aG sudo site_user

Выйдите из текущей SSH-сессии и войдите снова как site_user. Затем запретите вход по SSH для root:

sudo nano /etc/ssh/sshd_config

Найдите строку:

PermitRootLogin

Измените ее на:

PermitRootLogin no

Установка сайта

В домашней директории пользователя (по умолчанию это /home/site_user):

git clone https://gitverse.ru/DADementr/sfx_site.git

Установите права на выполнение скрипта:

chmod 775 system_setup.sh

Настройка файла .env

Откройте файл .env и настройте параметры под себя:

  • USER — должно быть site_user
  • SITE_DIR_NAMEsfx_site

С другими именами не тестировал. Остальное точно поменять под себя! Домен, IP-адрес, пароли, почта, ID и токен Telegram-бота также нужно настроить внимательно.

Создайте бота через @BotFather в Telegram. Чтобы узнать свой ID, можно использовать Telegram Plus или веб-версию.

Сгенерируйте новый или измените существующий SECRET_KEY Django и пароль к базе данных.

Мониторинг сервера через бота

Через бота можно мониторить состояние сервера. Команда /stat покажет:

  • Да, вакуум логов и ограничение их размера снизят потребление на диске до 3 ГБ.

Запуск проекта

Запустите скрипт system_setup.sh без использования sudo:

./system_setup.sh

Введите пароль и дождитесь завершения. Проверьте, работает ли сайт по домену или IP-адресу.

Если сайт не отображается, проверьте следующие службы:

sudo systemctl status gunicorn
sudo systemctl status gunicorn.socket
sudo systemctl status nginx

Все службы должны быть активны. Если это не так, проверьте логи и настройки.

Настройка домена

Убедитесь, что A-запись домена указывает на IP вашего сервера. Удалите AAAA-запись (IPv6), если она есть, чтобы избежать конфликтов.

Настройка сайта

Измените заголовок и описание главной страницы через панель управления. Категории и статьи можно изменять и удалять.

Цвета сайта находятся в файле /myspa/src/lib/site/global.css. Чтобы применить изменения, выполните:

cd myspa
npm install
npm run build

Подключение HTTPS и Fail2Ban

После успешного развертывания сайта выполните скрипт certbot_fb.sh для подключения HTTPS и настройки Fail2Ban.

Поздравляю, вы великолепны!

Ссылка на репозиторий: https://gitverse.ru/DADementr/sfx_site.git

Назад