Instalación en 15 minutos
Instalar Papyro
Esta guía explica cómo instalar Papyro en tu propio servidor. Se asumen conocimientos básicos de Docker.
1. Requisitos
- Docker 24+ y docker compose v2
- Mínimo 2 GB de RAM, 10 GB de disco
- Proxy inverso con HTTPS (Cloudflare, Traefik, nginx)
- Un dominio o subdominio (p. ej. papyro.yourcompany.com)
- Tu PAPYRO_LICENSE_KEY adquirida (enviada por correo)
- Tu token de GHCR (para descargar la imagen, enviado por correo)
2. Preparar el directorio de trabajo
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. Rellenar el archivo .env
Pega los valores del correo de tu compra:
# 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=Ejecuta los comandos openssl rand en tu terminal y pega los resultados. No los pierdas: son necesarios para acceder a la base de datos.
Check-in de licencia (y cómo desactivarlo)
Papyro envía una pequeña baliza de licencia a admin.papyro.dev aproximadamente cada 12 horas y recibe a cambio un derecho de uso firmado, de modo que los cambios de plan, usuarios y caducidad llegan a tu instalación sin un nuevo archivo de clave. Envía el identificador de tu licencia, un hash de un solo sentido de BETTER_AUTH_URL, los usuarios en uso, la versión de Papyro y un nonce de un solo uso — nunca el contenido del espacio de trabajo, nombres de usuario ni direcciones de correo.
PAPYRO_LICENSE_CHECKIN_URL=offAñade esta línea a .env para una instalación totalmente aislada (air-gapped). Tu clave firmada sigue funcionando sin conexión al nivel que compraste; los cambios de plan llegan entonces como una clave reemitida en su lugar.
Módulos opcionales y ajustes
El .env descargado incluye más interruptores que el bloque anterior. Todo aquí está comentado por defecto — descomenta solo lo que necesites:
- Salas de reunión — descomenta el servicio livekit y define LIVEKIT_URL y LIVEKIT_API_SECRET. ROOMS_MAX_CONCURRENT limita los participantes simultáneos en todas las salas.
- Subtítulos en vivo de sala (50 idiomas hablados → 51 idiomas de subtítulos) — añade el servicio translator, define ROOMS_TRANSLATION_ENABLED=true junto con tu propia DEEPGRAM_API_KEY y OPENAI_API_KEY. El uso se factura a tus propias cuentas. Los idiomas ofrecidos en los selectores los eliges tú con ROOMS_SPOKEN_LANGUAGES (por defecto: los siete idiomas de la interfaz).
- Copias de seguridad externas — descomenta el servicio r2-sync y rellena los valores R2_* para reflejar cada noche los volcados de la base de datos y los archivos subidos en Cloudflare R2.
- Retención — TRASH_RETENTION_DAYS, BOARD_TRASH_RETENTION_DAYS, ACTIVITY_RETENTION_DAYS, AUTH_EVENTS_RETENTION_DAYS y el resto anulan cuánto tiempo se conserva cada tipo de registro.
- Notificaciones de Helpdesk — NETGSM_* envía un SMS cuando una llamada se marca como no localizable; RESEND_API_KEY y RESEND_FROM activan los informes de actividad por correo. En blanco desactiva ambos.
- Seguimiento de errores — ERROR_AI_ENABLED=0 desactiva el análisis de causa raíz con IA (las trazas de pila se envían a OpenAI cuando está activado). WEBHOOK_ALLOW_PRIVATE=1 permite que los webhooks de tablero lleguen a receptores de red privada.
- Operaciones — DB_POOL_MAX, SHUTDOWN_DRAIN_MS, REALTIME_MAX_* y UPLOAD_MIN_FREE_BYTES ajustan el tamaño de los pools, el tiempo de vaciado, los límites de conexión en tiempo real y la protección de espacio libre.
Cada valor está documentado en línea en el .env que descargaste. En blanco significa que se aplica el valor predeterminado.
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. Descargar la imagen de Docker
Usa el token de GHCR que te enviamos por correo para iniciar sesión y descargar la imagen:
echo "ghp_xxxxxxxxxxxx" | docker login ghcr.io \
-u egebilge --password-stdin
docker pull ghcr.io/egebilge/papyro:latestFija una etiqueta de versión (por ejemplo :v0.2.0) en docker-compose.yml para producción, de modo que una actualización sea algo que eliges tú y no algo que ocurre en el siguiente reinicio.
5. Ejecutarlo
docker compose up -dEl arranque inicial tarda entre 30 y 60 segundos (se ejecutan las migraciones y se levantan los contenedores).
6. Crear el primer administrador
Abre https://papyro.yourdomain.com en un navegador. Aparece el asistente de configuración: introduce los datos de tu primer usuario. Este primer usuario se crea con el rol de superadministrador y el asistente se ejecuta una sola vez.
7. Verificar el estado de la licencia
Ve a Administración → Licencia (barra lateral). Deberían aparecer el nombre del cliente, la edición, el número de usuarios y la fecha de caducidad.
| Error | Cause / Sebep | Fix / Çözüm |
|---|---|---|
| PAPYRO_LICENSE_KEY is not set | Falta la variable de entorno o se copió de forma incorrecta. | Pega la línea exacta del correo de tu compra en .env. Reinicia: docker compose up -d --force-recreate app |
| PAPYRO_LICENSE_KEY is invalid: malformed envelope | El sobre se copió de forma incompleta (pegado truncado). | Selecciona y copia la línea PAPYRO_LICENSE_KEY=... completa del correo. El valor debe contener un punto (.) que separe la carga útil y la firma. |
| PAPYRO_LICENSE_KEY is invalid: invalid signature | Versión de imagen incorrecta, o el sobre pertenece a otro binario de proveedor. | Comprueba la etiqueta de la imagen en tu comando docker pull. Para obtener ayuda, contacta con [email protected]. |
| PAPYRO_LICENSE_KEY is invalid: license revoked | La licencia fue revocada en el panel del proveedor y la instalación lo detectó en su último check-in. | Contacta con [email protected]. Si es un error, se aplica una restauración en el siguiente check-in — sin necesidad de una nueva clave. |
| LICENSE_OVER_SEAT — Cannot add new user | El límite de usuarios de tu licencia está completo. Los usuarios baneados no ocupan un puesto. | Escribe a [email protected] para aumentar el número de usuarios, o banea a quienes ya no estén. |
Renovación
Te enviamos un correo 30 días antes de la caducidad. Tras el pago, llega una nueva PAPYRO_LICENSE_KEY por correo. Sustituye el valor en .env y reinicia:
docker compose up -d --force-recreate appSoporte
Correo: [email protected]
Respuesta en un plazo de 48 horas. Usa el prefijo «URGENT» en el asunto para emergencias.