Storyteller в self‑hosting: установка и генерация контента
Storyteller для self-hosting: установка через 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Установка и настройка Storyteller: практическое руководство
Введение
Этот гайд содержит пошаговые инструкции по установке Storyteller — системы для создания интерактивных narratives. Мы будем использовать официальную версию проекта, написанную на Python и Django.
Предварительные требования:
- Сервер с Linux (Ubuntu 20.04/22.04 или Debian 11/12)
- Доступ к командной строке с правами
sudo - Разрешение на входящие соединения по порту 8000 (для разработки) или 80/443 (для продакшена)
- Минимум 2 ГБ оперативной памяти и 20 ГБ свободного места
1. Подготовка системы
1.1. Обновление системы и установка базовых зависимостей
# Обновление списка пакетов и их версий
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
1.2. Настройка PostgreSQL (рекомендуется для продакшена)
# Вход в консоль PostgreSQL под пользователем postgres
sudo -u postgres psql
# Внутри 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 # Выход из psql
1.3. Создание системного пользователя (для безопасности)
sudo adduser --system --group --disabled-password --home /srv/storyteller storyteller
2. Установка Storyteller из исходного кода
2.1. Клонирование репозитория
# Переключаемся на системного пользователя
sudo su - storyteller
# Клонируем репозиторий (замените URL на актуальный)
git clone https://github.com/имя-разработчика/storyteller.git
cd storyteller
# Создаем виртуальное окружение Python
python3 -m venv venv
source venv/bin/activate
2.2. Установка Python-зависимостей
# Установка базовых зависимостей
pip install --upgrade pip setuptools wheel
# Установка основных пакетов
pip install -r requirements.txt
# Если файл requirements.txt отсутствует, установите основные компоненты вручную:
pip install django djangorestframework psycopg2-binary redis gunicorn
2.3. Конфигурация проекта
# Создаем файл конфигурации из шаблона
cp .env.example .env
# Редактируем конфигурационный файл
vim .env
Пример содержимого файла .env:
# Настройки базы данных
DATABASE_ENGINE=django.db.backends.postgresql
DATABASE_NAME=storyteller_db
DATABASE_USER=storyteller_user
DATABASE_PASSWORD=StrongPassword123!
DATABASE_HOST=localhost
DATABASE_PORT=5432
# Настройки безопасности
SECRET_KEY=Сгенерируйте_секретный_ключ_для_Django
DEBUG=False
ALLOWED_HOSTS=ваш_домен,127.0.0.1
# Настройки Redis
REDIS_URL=redis://localhost:6379/0
# Настройки медиа и статики
MEDIA_ROOT=/srv/storyteller/media
STATIC_ROOT=/srv/storyteller/static
Генерация секретного ключа Django:
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
3. Настройка базы данных и миграций
3.1. Применение миграций
# Находясь в виртуальном окружении и директории проекта
python manage.py migrate
3.2. Создание суперпользователя
python manage.py createsuperuser
Следуйте инструкциям на экране для ввода имени, email и пароля.
3.3. Сбор статических файлов
python manage.py collectstatic --noinput
4. Настройка Gunicorn для обработки запросов
4.1. Создание systemd- службы
sudo vim /etc/systemd/system/storyteller.service
Содержимое файла службы:
[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
4.2. Запуск и активация службы
# Перезагрузка systemd и запуск службы
sudo systemctl daemon-reload
sudo systemctl start storyteller
sudo systemctl enable storyteller
# Проверка статуса
sudo systemctl status storyteller
5. Настройка Nginx как reverse proxy
5.1. Создание конфигурационного файла
sudo vim /etc/nginx/sites-available/storyteller
Содержимое конфигурации:
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;
}
# Настройки SSL (опционально, для HTTPS)
# ssl_certificate /etc/letsencrypt/live/ваш-домен.example.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/ваш-домен.example.com/privkey.pem;
# include /etc/letsencrypt/options-ssl-nginx.conf;
# ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
5.2. Активация конфигурации и проверка
# Создаем симлинк
sudo ln -s /etc/nginx/sites-available/storyteller /etc/nginx/sites-enabled/
# Проверяем конфигурацию Nginx
sudo nginx -t
# Перезапускаем Nginx
sudo systemctl restart nginx
6. Настройка HTTPS с Let's Encrypt (рекомендуется)
6.1. Установка Certbot
sudo apt install -y certbot python3-certbot-nginx
6.2. Получение и настройка SSL-сертификата
sudo certbot --nginx -d ваш-домен.example.com -d www.ваш-домен.example.com
Важные моменты:
- При запросе выбрать опцию "Redirect" для автоматического перенаправления HTTP → HTTPS
- Сертификат автообновляется через cron-задачу
7. Дополнительные настройки
7.1. Настройка регулярного резервного копирования
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/
# Удаление старых резервных копий (старше 30 дней)
find $BACKUP_DIR -name "*.sql" -mtime +30 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
# Даем права на выполнение
sudo chmod +x /etc/cron.daily/storyteller-backup
7.2. Настройка мониторинга (опционально)
Для отслеживания работы Storyteller можно использовать простые скрипты проверки:
sudo vim /usr/local/bin/check-storyteller
#!/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
# Проверка доступности через curl
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 chmod +x /usr/local/bin/check-storyteller
# Добавить в crontab: */15 * * * * /usr/local/bin/check-storyteller
8. Обновление системы
8.1. Процедура обновления
# Переключаемся на пользователя storyteller
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
9. Решение распространенных проблем
9.1. Ошибки при запуске Gunicorn
Симптом: Служба не запускается, в логах ошибка Permission denied.
Решение:
# Проверьте права на директорию проекта
sudo chown -R storyteller:storyteller /srv/storyteller
# Убедитесь, что виртуальное окружение создано
sudo su - storyteller
cd /srv/storyteller
source venv/bin/activate
which python # Должен показывать путь в /srv/storyteller/venv/bin/
9.2. Проблемы с подключением к базе данных
Симптом: Ошибки psycopg2.OperationalError.
Решение:
# Проверьте доступность PostgreSQL
sudo -u postgres psql -c "\l"
# Убедитесь, что пользователь имеет права
sudo -u postgres psql -c "\du storyteller_user"
# Проверьте файл pg_hba.conf
sudo vim /etc/postgresql/14/main/pg_hba.conf
# Убедитесь, что есть строка: local all storyteller_user peer
9.3. Ошибки статических файлов в Nginx
Симптом: 404 при загрузке CSS/JS.
Решение:
# Проверьте права на директорию static
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
9.4. Проблемы с Redis
Симптом: Ошибки при работе с кэшированием или задачами.
Решение:
# Проверьте статус Redis
sudo systemctl status redis-server
# Проверьте подключение
redis-cli ping
# Должен вернуть: PONG
# В файле .env убедитесь, что REDIS_URL указан правильно
# Для локального Redis: redis://localhost:6379/0
10. Дополнительные рекомендации
10.1. Настройка кэширования
Для улучшения производительности рекомендуется использовать Redis для кэширования:
# В settings.py проекта убедитесь, что включено кэширование
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://localhost:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
10.2. Ограничение доступа
Если нужно ограничить доступ только для авторизованных пользователей:
# В Nginx конфигурации добавьте блок ограничения
location / {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
# ... остальные настройки
}
Создайте файл паролей:
sudo sh -c "echo -n 'username:' >> /etc/nginx/.htpasswd"
sudo sh -c "openssl passwd -apr1 'password' >> /etc/nginx/.htpasswd"
10.3. Логирование
Настройте отдельные логи для отладки:
sudo vim /etc/logrotate.d/storyteller
/srv/storyteller/logs/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 storyteller storyteller
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
Заключение
Вы успешно настроили Storyteller на своем сервере. Теперь система готова к использованию для создания интерактивных narratives.
Важные замечания:
- Регулярно обновляйте зависимости и применяйте патчи безопасности
- Настройте мониторинг и резервное копирование
- Рассмотрите возможность использования Docker для упрощения развертывания
- Следите за обновлениями в официальном репозитории
Для получения поддержки обратитесь к документации проекта или сообществу разработчиков. Удачи в создании интерактивных историй!