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