Storyteller в self-hosting: Как установить и использовать для генерации контента
Что такое Storyteller и почему его игнорируют в self-hosted сообществе? Установка через Docker, настройка LLM, сценарии использования для контент-маркетинга и личной продуктивности.
Обновление системы и установка базовых зависимостей
Обновление списка пакетов и их версий, а также установка системных зависимостей, необходимых для работы Python, Django, PostgreSQL, Nginx и Redis.
sudo apt update && sudo apt upgrade -y
sudo apt install -y git python3-venv python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx redis-server build-essential libssl-dev libffi-dev curl wget vimНастройка PostgreSQL
Создание базы данных, пользователя базы данных и установка необходимых параметров (кодировка, изоляция, часовой пояс).
sudo -u postgres psql
CREATE DATABASE storyteller_db;
CREATE USER storyteller_user WITH PASSWORD 'StrongPassword123!';
ALTER ROLE storyteller_user SET client_encoding TO 'utf8';
ALTER ROLE storyteller_user SET default_transaction_isolation TO 'read committed';
ALTER ROLE storyteller_user SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE storyteller_db TO storyteller_user;
\qСоздание системного пользователя
Создание отдельного системного пользователя для запуска Storyteller в целях безопасности.
sudo adduser --system --group --disabled-password --home /srv/storyteller storytellerКлонирование репозитория и настройка окружения
Переключение на созданного пользователя, клонирование репозитория Storyteller и создание виртуального окружения Python.
sudo su - storyteller
git clone https://github.com/имя-разработчика/storyteller.git
cd storyteller
python3 -m venv venv
source venv/bin/activateУстановка Python-зависимостей
Обновление pip и установка всех необходимых Python-пакетов, перечисленных в requirements.txt или вручную.
pip install --upgrade pip setuptools wheel
pip install -r requirements.txt
# Если requirements.txt отсутствует:
pip install django djangorestframework psycopg2-binary redis gunicornКонфигурация проекта
Создание файла конфигурации .env на основе примера и его редактирование (замена настроек БД, секретного ключа и домена).
cp .env.example .env
vim .envГенерация секретного ключа Django
Генерация криптографически стойкого секретного ключа для использования в настройках Django.
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"Настройка базы данных и миграций
Применение миграций для создания таблиц в базе данных и создание суперпользователя администратора.
python manage.py migrate
python manage.py createsuperuserСбор статических файлов
Сбор статических файлов (CSS, JS, изображения) в одну директорию для последующей отдачи через Nginx.
python manage.py collectstatic --noinputСоздание systemd-службы Gunicorn
Создание файла службы для управления Gunicorn через systemd, что обеспечивает автоматический запуск при загрузке системы и перезапуск в случае сбоев.
sudo vim /etc/systemd/system/storyteller.serviceСодержимое службы Gunicorn
Конфигурационный файл службы, который запускает Gunicorn и привязывает его к Unix-сокету.
[Unit]
Description=Gunicorn instance for Storyteller
After=network.target postgresql.service
[Service]
User=storyteller
Group=storyteller
WorkingDirectory=/srv/storyteller
Environment="PATH=/srv/storyteller/venv/bin"
ExecStart=/srv/storyteller/venv/bin/gunicorn --workers 3 --bind unix:/srv/storyteller/storyteller.sock storyteller.wsgi:application
[Install]
WantedBy=multi-user.targetЗапуск и активация службы Gunicorn
Перезагрузка конфигурации systemd, запуск службы и её включение в автозагрузку. Проверка статуса выполнения.
sudo systemctl daemon-reload
sudo systemctl start storyteller
sudo systemctl enable storyteller
sudo systemctl status storytellerСоздание конфигурационного файла Nginx
Создание файла конфигурации для Nginx, который будет работать как reverse proxy, обрабатывать статические файлы и передавать запросы приложению через сокет.
sudo vim /etc/nginx/sites-available/storytellerСодержимое конфигурации Nginx
Настройка блока server для прослушивания порта 80, обработки статики, медиафайлов и проксирования динамических запросов к Gunicorn.
server {
listen 80;
server_name ваш-домен.example.com;
location /static/ {
alias /srv/storyteller/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}
location /media/ {
alias /srv/storyteller/media/;
expires 7d;
}
location / {
include proxy_params;
proxy_pass http://unix:/srv/storyteller/storyteller.sock;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
}Активация конфигурации Nginx
Создание символической ссылки для активации сайта, проверка синтаксиса конфигурации и перезапуск веб-сервера.
sudo ln -s /etc/nginx/sites-available/storyteller /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginxУстановка Certbot
Установка утилиты Certbot и плагина для Nginx для автоматического получения и обновления SSL-сертификатов Let's Encrypt.
sudo apt install -y certbot python3-certbot-nginxПолучение SSL-сертификата
Запуск Certbot для получения сертификата, настройки HTTPS и автоматического перенаправления трафика с HTTP на HTTPS.
sudo certbot --nginx -d ваш-домен.example.com -d www.ваш-домен.example.comСоздание скрипта резервного копирования
Создание bash-скрипта для ежедневного бэкапа базы данных и медиафайлов с удалением старых копий (старше 30 дней).
sudo vim /etc/cron.daily/storyteller-backupСодержимое скрипта резервного копирования
Логика скрипта: дамп базы данных, архивация медиа, удаление старых файлов.
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/srv/backups/storyteller
mkdir -p $BACKUP_DIR
sudo -u postgres pg_dump storyteller_db > $BACKUP_DIR/db_backup_$DATE.sql
tar -czf $BACKUP_DIR/media_backup_$DATE.tar.gz /srv/storyteller/media/
find $BACKUP_DIR -name "*.sql" -mtime +30 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -deleteНастройка мониторинга
Создание скрипта для проверки работоспособности сервиса (статус systemd и HTTP-код ответа) и логирование результатов.
sudo vim /usr/local/bin/check-storytellerСодержимое скрипта мониторинга
Скрипт проверяет активность службы Storyteller и доступность сайта, отправляя сообщения в системный лог (logger).
#!/bin/bash
if systemctl is-active --quiet storyteller; then
echo "Storyteller service: ACTIVE" | logger -t storyteller_monitor
else
echo "Storyteller service: INACTIVE" | logger -t storyteller_monitor
sudo systemctl restart storyteller
fi
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://ваш-домен.example.com)
if [ "$HTTP_STATUS" -eq 200 ]; then
echo "Website: OK" | logger -t storyteller_monitor
else
echo "Website: ERROR (Status: $HTTP_STATUS)" | logger -t storyteller_monitor
fiПроцедура обновления системы
Пошаговая инструкция для безопасного обновления кода проекта, зависимостей и применения миграций с минимальным временем простоя.
sudo su - storyteller
cd /srv/storyteller
source venv/bin/activate
sudo systemctl stop storyteller
git pull origin main
pip install -r requirements.txt --upgrade
python manage.py migrate
python manage.py collectstatic --noinput
sudo systemctl start storyteller
sudo journalctl -u storyteller -fРешение проблем с Gunicorn (Permission denied)
Исправление прав доступа к директории проекта и проверка корректности пути в виртуальном окружении при ошибках запуска службы.
sudo chown -R storyteller:storyteller /srv/storyteller
sudo su - storyteller
cd /srv/storyteller
source venv/bin/activate
which pythonРешение проблем с подключением к БД
Проверка доступности PostgreSQL, прав пользователя и файла конфигурации pg_hba.conf при ошибках psycopg2.
sudo -u postgres psql -c "\l"
sudo -u postgres psql -c "\du storyteller_user"
sudo vim /etc/postgresql/14/main/pg_hba.confРешение проблем со статическими файлами
Установка прав на директорию static и пересборка статики при возникновении ошибок 404 (CSS/JS не загружаются).
sudo chown -R storyteller:storyteller /srv/storyteller/static
sudo chmod -R 755 /srv/storyteller/static
sudo su - storyteller
cd /srv/storyteller
source venv/bin/activate
python manage.py collectstatic --noinput --clear
sudo systemctl restart nginx