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 use latest so they continue to follow the newest published image without needing a version-specific edit. Browse the published image versions when you need to select a fixed release or image digest instead.
Then start Presenton:
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.
Stop the existing container:
Remove the stopped container:
Run the container again with the same volume and environment options. When you use latest, pulling and recreating the container moves it to the newest published image. When you use a fixed version or digest, update it 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

Open the cloned 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.Optionally, list the available release tags:
To pin a revision, replace TAG_OR_COMMIT with the tag or commit you want:
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:
Then rebuild the deployment:
If you pin a tag or commit, fetch the available revisions, check out the one you want, and rebuild:
Check out the new tag or commit:
Then rebuild the deployment:
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:
Stop the container:
Start it again:
Check its status:
For a source deployment:
Stop the service:
Start it again:
Check its status:
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.