> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pup.run/llms.txt
> Use this file to discover all available pages before exploring further.

# Self-host pup

> Run the portable image-only bundle with your own Discord application.

The release's `self-host/` bundle runs without application source or cloud
accounts on the server. Images and corresponding source currently require
authorized private-beta access.

1. Obtain the bundle from the exact release. Verify its signed manifest using
   the supplied publisher public key. Set the four image references to the
   manifest's immutable digests, never a moving tag.
2. Copy `config.env.example` to `config.env`. Use separate random migration and
   runtime database passwords and set your public HTTPS origin.
3. Copy each application's `*.env.sample` to its own `*.env`. Fill your Discord
   application identity, bot token, OAuth secret and session secret. Restrict
   populated files to mode `0600`; do not create a repository-root `.env`.
4. Enable Guild Members and Message Content intents. Register your HTTPS origin
   followed by `/api/auth/callback/discord` and `/api/internal/install/callback`.
   Install with the bot and application-command scopes.
5. Authenticate to the private image registry using read-only package access.
   From `self-host/`, start the bundle:

```sh theme={null}
docker compose --env-file config.env -f compose.yml up -d --wait
```

Route your HTTPS reverse proxy to `127.0.0.1:3000`. Database and backend services
stay internal. Telemetry is disabled by default. Retain the PostgreSQL 18 volume
mount at `/var/lib/postgresql`.

For the first intended account, temporarily enable API signups, restart the API,
and sign in through Discord. Close the signup window and restart the API again.
Account creation does not grant an application administrator role. Validate
Modules, Health, Cases and authorization in a disposable guild before enforcement.

Configuration password values initialize database roles; editing them does not
rotate existing database credentials. Follow [backup and recovery](/backup-recovery)
before upgrading or changing persistent state.

## Optional public progress snapshot

Without extra configuration, the roadmap uses its bundled public catalog.
An operator may mount an atomically updated, validated snapshot file and set
`PUP_ROADMAP_SNAPSHOT_PATH` in the API environment. No planning-service account
or credential is required by the application. Invalid snapshots are rejected.
