Skip to main content
Presenton can be self-hosted in two ways. Most users should run a published image from the GitHub Container Registry (GHCR). Build from source when you need to inspect, modify, or test the application code.

Run a GHCR release

The recommended path for production. It starts quickly, requires no local build, and uses a versioned image published by the Presenton team.

Build from GitHub source

The flexible path for development and customization. Clone the repository and let Docker Compose build the application on your server.

Option 1: Run a published GHCR release

This is the most stable and straightforward way to self-host Presenton. The image already contains the frontend, API, export tools, and runtime dependencies, so the host only needs Docker. The examples below pin v0.9.3-beta for predictable deployments. Browse the published image versions to choose another release, or replace the version with latest to follow the newest published image automatically.
Open http://localhost:5001 after the container starts. The first port in 5001:80 is the port on your host and can be changed; container port 80 serves the web app, REST API, and /mcp.
Use an explicit version tag in production so upgrades happen when you choose. Use latest when automatically following the newest published release is more important than repeatability.

Configure the release image

Pass settings with --env-file to keep the docker run command readable:
Then add --env-file .env before the image name:
See Environment variables for all supported providers and runtime settings.

Update a GHCR deployment

Pull the new image before replacing the container. Keep the same app_data directory and startup options.
Changing to a newer release is intentional: update the tag in both the docker pull and docker run commands.

Option 2: Build from the GitHub source

Choose this path when you want to change Presenton, review the code before deployment, test unreleased work, or build a specific branch or commit. You need Git, Docker Engine, and the Docker Compose plugin.
1

Clone the repository

2

Choose the source revision

A fresh clone uses main, which contains the newest source. For a repeatable build, check out a Git tag or commit that exists in the repository before continuing.
3

Add your configuration

Create .env beside docker-compose.yml. Compose reads this file and forwards the supported values to Presenton.
4

Build and start Presenton

Compose builds the repository’s production Dockerfile, starts the container, and mounts ./app_data at /app_data.
Open http://localhost:5001 when the build finishes.
The main branch can contain changes that have not reached a published container release. For a more predictable source build, check out a release tag or pin a commit before building.

Update a source build

If you follow main, pull the newest commits and rebuild:
If you pin a tag or commit, fetch the available revisions, check out the one you want, and rebuild:
The repository also provides production-gpu, development, and development-gpu services. Use production for a normal hosted instance. Use production-gpu only after installing the NVIDIA Container Toolkit and confirming that Docker can access the GPU.

Persistence

Both deployment paths store persistent state in /app_data inside the container:
  • The GHCR commands mount the local ./app_data directory explicitly.
  • The repository’s Compose service creates the same mount automatically.
Never replace or upgrade the container without preserving /app_data. It contains presentations, uploads, templates, settings, authentication state, the default database, exports, and local memory.
Back up this directory before upgrades. See Backups and recovery for a complete backup and restore workflow.

Ports and networking

localhost inside a container refers to the container itself. Reach another Compose service by its service name, or reach a service on the host through a supported host gateway such as host.docker.internal.

Operate and verify

For a GHCR container:
For a source deployment:
After deployment, generate a small presentation, restart Presenton, and confirm that the presentation remains available. Then test export and any REST API or MCP integration you plan to expose.