Руководство по созданию самоустанавливающегося сайта на 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_NAME
—sfx_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