Papyro
15-minute setup

Install Papyro

This guide walks through installing Papyro on your own server. Basic Docker knowledge is assumed.

1. Requirements

  • Docker 24+ and docker compose v2
  • Minimum 2 GB RAM, 10 GB disk
  • Reverse proxy with HTTPS (Cloudflare, Traefik, nginx)
  • A domain or subdomain (e.g. papyro.yourcompany.com)
  • Your purchased LICENSE_KEY (emailed)
  • Your GHCR token (for image pull, emailed)

2. Set up the working directory

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. Fill in the .env file

Paste the values from your purchase email:

# 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)
LICENSE_KEY=eyJ2IjoxLCJjdXN0b21lciI6...

# R2 backup (optional)
R2_ACCOUNT_ID=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_BUCKET=

Run the openssl rand commands in your terminal and paste the outputs. Don't lose these — they're required to access the DB.

4. Pull the Docker image

Use the GHCR token we emailed you to log in and pull the image:

echo "ghp_xxxxxxxxxxxx" | docker login ghcr.io \
  -u egebilge --password-stdin

docker pull ghcr.io/egebilge/papyro:v1.0.0

5. Run it

docker compose up -d

Initial startup takes 30–60 seconds (migrations run, containers come up).

6. Create the first admin

Open https://papyro.yourdomain.com in a browser. The setup wizard appears — enter your first-user details. This first user is created with the super-admin role and the wizard runs exactly once.

7. Verify license status

Go to Admin → License (sidebar). Your customer name, edition, seat count and expiry date should appear.

Troubleshooting

LICENSE_KEY is not set
Cause / Sebep: Env var missing or copied incorrectly.
Fix / Çözüm: Paste the exact line from your purchase email into .env. Restart: docker compose up -d --force-recreate app
LICENSE_KEY is invalid: malformed envelope
Cause / Sebep: Envelope was copied incompletely (truncated paste).
Fix / Çözüm: Select and copy the entire LICENSE_KEY=... line from the email. It must contain a period (.) within the value.
LICENSE_KEY is invalid: invalid signature
Cause / Sebep: Wrong image version, or the envelope belongs to a different vendor binary.
Fix / Çözüm: Check the image tag in your docker pull command. For help, contact [email protected].
LICENSE_OVER_SEAT — Cannot add new user
Cause / Sebep: Your license seat limit is full.
Fix / Çözüm: Email [email protected] to upgrade your tier, or delete banned/inactive users.

Renewal

We email you 30 days before expiry. After payment a new LICENSE_KEY arrives via email. Replace the value in .env and restart:

docker compose up -d --force-recreate app

Support

Email: [email protected]

Response within 48 hours. Use subject prefix "URGENT" for emergencies.