Установка за 15 минут
Установка Papyro
Это руководство проведёт вас через установку Papyro на вашем собственном сервере. Предполагается базовое знание Docker.
1. Требования
- Docker 24+ и docker compose v2
- Минимум 2 ГБ ОЗУ, 10 ГБ диска
- Обратный прокси с HTTPS (Cloudflare, Traefik, nginx)
- Домен или поддомен (например, papyro.yourcompany.com)
- Ваш приобретённый PAPYRO_LICENSE_KEY (отправлен по email)
- Ваш токен GHCR (для загрузки образа, отправлен по email)
2. Настройка рабочего каталога
mkdir papyro && cd papyro
curl -fsSL https://papyro.dev/install/docker-compose.yml -o docker-compose.yml
curl -fsSL https://papyro.dev/install/env.example -o .env3. Заполните файл .env
Вставьте значения из письма о покупке:
# Domain
BETTER_AUTH_URL=https://papyro.yourcompany.com
# Database password (generate randomly)
DB_PASSWORD=$(openssl rand -hex 16)
# Better Auth secret (generate randomly)
BETTER_AUTH_SECRET=$(openssl rand -hex 32)
# Redis password (generate randomly)
REDIS_PASSWORD=$(openssl rand -hex 16)
# Cron secret (generate randomly)
CRON_SECRET=$(openssl rand -hex 32)
# License (from your purchase email)
PAPYRO_LICENSE_KEY=eyJ2IjoxLCJjdXN0b21lciI6...
# License check-in is ON by default. Uncomment to run fully air-gapped:
# PAPYRO_LICENSE_CHECKIN_URL=off
# AG Grid Enterprise license (data-grid block renders watermarked without it)
AG_GRID_LICENSE_KEY=
# OpenAI API key ("ask the grid" feature)
OPENAI_API_KEY=
# R2 backup (optional)
R2_ACCOUNT_ID=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_BUCKET=Выполните команды openssl rand в терминале и вставьте их вывод. Не теряйте эти значения — они нужны для доступа к БД.
Проверка лицензии (и как её отключить)
Примерно раз в 12 часов Papyro отправляет небольшой сигнал проверки лицензии на admin.papyro.dev и получает в ответ подписанное разрешение, поэтому изменения тарифа, количества мест и срока действия доходят до вашей установки без нового файла ключа. Передаются идентификатор лицензии, необратимый хеш BETTER_AUTH_URL, число используемых мест, версия Papyro и одноразовый nonce — никогда содержимое рабочего пространства, имена пользователей или адреса электронной почты.
PAPYRO_LICENSE_CHECKIN_URL=offДобавьте эту строку в .env для полностью изолированной (air-gapped) установки. Ваш подписанный ключ продолжает работать офлайн на уровне, который вы приобрели; изменения тарифа в этом случае приходят в виде переизданного ключа.
Дополнительные модули и настройка
В скачанном .env есть больше переключателей, чем в блоке выше. По умолчанию всё здесь закомментировано — раскомментируйте только то, что вам нужно:
- Комнаты для встреч — раскомментируйте сервис livekit, затем задайте LIVEKIT_URL и LIVEKIT_API_SECRET. ROOMS_MAX_CONCURRENT ограничивает количество одновременных участников во всех комнатах.
- Живые субтитры в комнатах (50 языков речи → 51 язык субтитров) — добавьте сервис translator, задайте ROOMS_TRANSLATION_ENABLED=true, а также собственные DEEPGRAM_API_KEY и OPENAI_API_KEY. Использование оплачивается с ваших аккаунтов. Какие языки предлагают селекторы, решаете вы через ROOMS_SPOKEN_LANGUAGES (по умолчанию — семь языков интерфейса).
- Резервные копии вне площадки — раскомментируйте сервис r2-sync и заполните значения R2_*, чтобы ежедневно зеркалировать дампы базы данных и загрузки в Cloudflare R2.
- Хранение данных — TRASH_RETENTION_DAYS, BOARD_TRASH_RETENTION_DAYS, ACTIVITY_RETENTION_DAYS, AUTH_EVENTS_RETENTION_DAYS и остальные переопределяют, как долго хранится каждый тип записей.
- Уведомления хелпдеска — NETGSM_* отправляет SMS, когда обращение помечено как недозвон; RESEND_API_KEY и RESEND_FROM отправляют по email отчёты об активности. Пустые значения отключают оба варианта.
- Отслеживание ошибок — ERROR_AI_ENABLED=0 отключает AI-анализ первопричины (при включении трассировки стека отправляются в OpenAI). WEBHOOK_ALLOW_PRIVATE=1 позволяет webhook-ам досок обращаться к получателям в приватной сети.
- Эксплуатация — DB_POOL_MAX, SHUTDOWN_DRAIN_MS, REALTIME_MAX_* и UPLOAD_MIN_FREE_BYTES настраивают размер пула соединений, время дренирования, лимиты realtime-подключений и защиту по свободному месту.
Каждое значение задокументировано прямо в скачанном вами .env. Пустое значение означает, что применяется встроенное значение по умолчанию.
Hardening: encryption at rest
Like other self-hosted collaboration tools, Papyro stores workspace content as regular PostgreSQL rows so search and exports work; application-layer secrets (integration credentials) are additionally encrypted. Protecting the data at rest is done at the disk layer of your server:
- Encrypt the disk or volume that holds your Docker volumes — LUKS on bare-metal Linux, or your cloud provider's encrypted block storage.
- Database dumps land in the dbbackups volume on the same disk. If you copy them elsewhere, keep them encrypted in transit and at the destination.
- If you enable the optional R2 backup sync, Cloudflare encrypts stored objects at rest; scope the API token to that single bucket.
HTTPS in front of the app is already required (step 1). Combined with disk encryption and encrypted backups this matches the at-rest baseline that SOC 2 / ISO 27001 questionnaires expect.
4. Загрузите Docker-образ
Используйте токен GHCR, который мы отправили вам по email, чтобы войти и загрузить образ:
echo "ghp_xxxxxxxxxxxx" | docker login ghcr.io \
-u egebilge --password-stdin
docker pull ghcr.io/egebilge/papyro:latestЗафиксируйте тег версии (например, :v0.2.0) в docker-compose.yml для продакшена, чтобы обновление было вашим осознанным выбором, а не тем, что случайно произойдёт при следующем перезапуске.
5. Запустите
docker compose up -dПервоначальный запуск занимает 30–60 секунд (выполняются миграции, поднимаются контейнеры).
6. Создайте первого администратора
Откройте https://papyro.yourdomain.com в браузере. Появится мастер настройки — введите данные первого пользователя. Этот первый пользователь создаётся с ролью super-admin, а мастер запускается ровно один раз.
7. Проверьте статус лицензии
Перейдите в Admin → License (боковая панель). Должны отобразиться имя клиента, редакция, количество мест и дата истечения.
| Error | Cause / Sebep | Fix / Çözüm |
|---|---|---|
| PAPYRO_LICENSE_KEY is not set | Переменная окружения отсутствует или скопирована неверно. | Вставьте точную строку из письма о покупке в .env. Перезапустите: docker compose up -d --force-recreate app |
| PAPYRO_LICENSE_KEY is invalid: malformed envelope | Конверт был скопирован не полностью (обрезанная вставка). | Выделите и скопируйте всю строку PAPYRO_LICENSE_KEY=... из письма. Значение должно содержать точку (.), разделяющую полезную нагрузку и подпись. |
| PAPYRO_LICENSE_KEY is invalid: invalid signature | Неверная версия образа, либо конверт принадлежит другой сборке вендора. | Проверьте тег образа в вашей команде docker pull. За помощью обращайтесь на [email protected]. |
| PAPYRO_LICENSE_KEY is invalid: license revoked | Лицензия была отозвана в панели вендора, и установка получила это при последней проверке. | Свяжитесь с [email protected]. Если это ошибка, восстановление применится при следующей проверке — новый ключ не понадобится. |
| LICENSE_OVER_SEAT — Cannot add new user | Лимит мест по вашей лицензии исчерпан. Заблокированные пользователи не занимают место. | Напишите на [email protected], чтобы увеличить количество мест, или заблокируйте пользователей, которые больше не работают у вас. |
Продление
Мы пишем вам по email за 30 дней до истечения срока. После оплаты новый PAPYRO_LICENSE_KEY приходит по email. Замените значение в .env и перезапустите:
docker compose up -d --force-recreate appПоддержка
Email: [email protected]
Ответ в течение 48 часов. Для срочных вопросов используйте префикс темы «URGENT».