Storyteller в self‑hosting: установка и генерация контента

Storyteller для self-hosting: установка через Docker, настройка LLM и сценарии использования для контент-маркетинга и личной продуктивности.

Не указано
Алексей Кузнецов
Алексей Кузнецов
Системный администратор23 января 2026 г.

Обновление системы и установка базовых зависимостей

Обновление списка пакетов и их версий, а также установка системных зависимостей, необходимых для работы 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.

Важные замечания:

  1. Регулярно обновляйте зависимости и применяйте патчи безопасности
  2. Настройте мониторинг и резервное копирование
  3. Рассмотрите возможность использования Docker для упрощения развертывания
  4. Следите за обновлениями в официальном репозитории

Для получения поддержки обратитесь к документации проекта или сообществу разработчиков. Удачи в создании интерактивных историй!

Поделиться:TelegramX / TwitterVK