Saltar al contenido principal
Comprar ahora

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 .env

3. 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=off

Añ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:latest

Fija 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 -d

El 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.

Resolución de problemas
ErrorCause / SebepFix / Çözüm
PAPYRO_LICENSE_KEY is not setFalta 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 envelopeEl 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 signatureVersió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 revokedLa 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 userEl 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 app

Soporte

Correo: [email protected]

Respuesta en un plazo de 48 horas. Usa el prefijo «URGENT» en el asunto para emergencias.