Instalação em 15 minutos
Instalar o Papyro
Este guia conduz você pela instalação do Papyro no seu próprio servidor. Pressupõe-se conhecimento básico de Docker.
1. Requisitos
- Docker 24+ e docker compose v2
- Mínimo de 2 GB de RAM, 10 GB de disco
- Reverse proxy com HTTPS (Cloudflare, Traefik, nginx)
- Um domínio ou subdomínio (ex.: papyro.yourcompany.com)
- O seu PAPYRO_LICENSE_KEY adquirido (enviado por e-mail)
- Seu token GHCR (para baixar a imagem, enviado por e-mail)
2. Configurar o diretório de trabalho
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. Preencher o arquivo .env
Cole os valores do seu e-mail de 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=Execute os comandos openssl rand no seu terminal e cole as saídas. Não as perca — são necessárias para acessar o banco de dados.
Check-in de licença (e como desativá-lo)
O Papyro envia um pequeno beacon de licença para admin.papyro.dev aproximadamente a cada 12 horas e recebe de volta um direito assinado, para que alterações de plano, assentos e expiração cheguem à sua instalação sem um novo arquivo de chave. Ele envia o ID da sua licença, um hash unidirecional de BETTER_AUTH_URL, os assentos em uso, a versão do Papyro e um nonce de uso único — nunca conteúdo do espaço de trabalho, nomes de usuários ou endereços de e-mail.
PAPYRO_LICENSE_CHECKIN_URL=offAdicione esta linha ao .env para uma instalação totalmente isolada da rede (air-gapped). Sua chave assinada continua funcionando offline no nível que você adquiriu; as alterações de plano então chegam como uma chave reemitida.
Módulos opcionais e ajustes
O .env baixado traz mais opções do que o bloco acima. Tudo aqui vem comentado por padrão — descomente apenas o que você precisar:
- Salas de reunião — descomente o serviço livekit e defina LIVEKIT_URL e LIVEKIT_API_SECRET. ROOMS_MAX_CONCURRENT limita os participantes simultâneos em todas as salas.
- Legendas de sala ao vivo (50 idiomas falados → 51 idiomas de legenda) — adicione o serviço translator, defina ROOMS_TRANSLATION_ENABLED=true e informe seus próprios DEEPGRAM_API_KEY e OPENAI_API_KEY. O uso é cobrado nas suas próprias contas. Os idiomas oferecidos nos seletores são escolha sua via ROOMS_SPOKEN_LANGUAGES (padrão: os sete idiomas da interface).
- Backups externos — descomente o serviço r2-sync e preencha os valores R2_* para espelhar dumps do banco de dados e uploads para o Cloudflare R2 todas as noites.
- Retenção — TRASH_RETENTION_DAYS, BOARD_TRASH_RETENTION_DAYS, ACTIVITY_RETENTION_DAYS, AUTH_EVENTS_RETENTION_DAYS e os demais substituem por quanto tempo cada tipo de registro é mantido.
- Notificações do Helpdesk — NETGSM_* envia um SMS quando uma chamada é marcada como inacessível; RESEND_API_KEY e RESEND_FROM enviam por e-mail os relatórios de atividade em campo. Em branco desativa os dois.
- Rastreamento de erros — ERROR_AI_ENABLED=0 desativa a análise de causa raiz por IA (os stack traces são enviados à OpenAI quando está ativado). WEBHOOK_ALLOW_PRIVATE=1 permite que os webhooks do quadro alcancem receptores em rede privada.
- Operações — DB_POOL_MAX, SHUTDOWN_DRAIN_MS, REALTIME_MAX_* e UPLOAD_MIN_FREE_BYTES ajustam o tamanho do pool, o tempo de drenagem, os limites de conexões em tempo real e a proteção de espaço livre.
Cada valor está documentado inline no .env que você baixou. Em branco significa que o padrão embutido se aplica.
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. Baixar a imagem Docker
Use o token GHCR que enviamos por e-mail para fazer login e baixar a imagem:
echo "ghp_xxxxxxxxxxxx" | docker login ghcr.io \
-u egebilge --password-stdin
docker pull ghcr.io/egebilge/papyro:latestFixe uma tag de versão (por exemplo, :v0.2.0) no docker-compose.yml para produção, para que uma atualização seja algo que você escolhe, e não algo que acontece na próxima reinicialização.
5. Executar
docker compose up -dA inicialização leva de 30 a 60 segundos (migrações são executadas, contêineres sobem).
6. Criar o primeiro administrador
Abra https://papyro.yourdomain.com em um navegador. O assistente de configuração aparece — informe os dados do seu primeiro usuário. Esse primeiro usuário é criado com o papel de super-admin e o assistente roda exatamente uma vez.
7. Verificar o status da licença
Vá em Admin → Licença (barra lateral). Seu nome de cliente, edição, número de assentos e data de expiração devem aparecer.
| Error | Cause / Sebep | Fix / Çözüm |
|---|---|---|
| PAPYRO_LICENSE_KEY is not set | Variável de ambiente ausente ou copiada incorretamente. | Cole a linha exata do seu e-mail de compra no .env. Reinicie: docker compose up -d --force-recreate app |
| PAPYRO_LICENSE_KEY is invalid: malformed envelope | O envelope foi copiado de forma incompleta (colagem truncada). | Selecione e copie a linha PAPYRO_LICENSE_KEY=... inteira do e-mail. O valor deve conter um ponto (.) separando o payload e a assinatura. |
| PAPYRO_LICENSE_KEY is invalid: invalid signature | Versão de imagem errada, ou o envelope pertence a um build de outro fornecedor. | Verifique a tag da imagem no seu comando docker pull. Para ajuda, entre em contato com [email protected]. |
| PAPYRO_LICENSE_KEY is invalid: license revoked | A licença foi revogada no painel do fornecedor, e a instalação percebeu isso no seu último check-in. | Entre em contato com [email protected]. Se isso for um engano, uma restauração é aplicada no próximo check-in — sem necessidade de uma nova chave. |
| LICENSE_OVER_SEAT — Cannot add new user | O limite de assentos da sua licença está cheio. Usuários banidos não ocupam um assento. | Envie um e-mail para [email protected] para aumentar o número de assentos, ou baneie os usuários que saíram. |
Renovação
Enviamos um e-mail 30 dias antes da expiração. Após o pagamento, um novo PAPYRO_LICENSE_KEY chega por e-mail. Substitua o valor no .env e reinicie:
docker compose up -d --force-recreate appSuporte
E-mail: [email protected]
Resposta em até 48 horas. Use o prefixo de assunto "URGENT" para emergências.