Skip to content

Air-Gapped Install

For servers without internet access, Presswerk provides an air-gapped installation method.

  1. On an internet-connected machine: Create a bundle containing all Docker images and configuration
  2. Transfer the bundle to the air-gapped server (USB drive, internal file share, etc.)
  3. On the air-gapped server: Load images and install

On a machine with Docker and internet access:

Terminal window
curl -fsSL https://presswerk.app/install.sh | bash -s -- --bundle

To bundle a specific version:

Terminal window
APP_VERSION=1.2.3 curl -fsSL https://presswerk.app/install.sh | bash -s -- --bundle

This creates presswerk-bundle-<version>.tar.gz containing:

  • Docker images for PostgreSQL, Keycloak, and Presswerk (~800 MB compressed)
  • Docker Compose file
  • Install script
  • Database init script

Copy the bundle to the target server using your preferred method:

Terminal window
# USB drive
cp presswerk-bundle-latest.tar.gz /media/usb/
# SCP to bastion host
scp presswerk-bundle-latest.tar.gz bastion:/tmp/
# Internal file share
cp presswerk-bundle-latest.tar.gz /mnt/fileshare/

On the air-gapped server:

Terminal window
tar xzf presswerk-bundle-latest.tar.gz
cd presswerk-bundle-latest
./install.sh --offline

The installer will:

  1. Load Docker images from the bundle
  2. Generate configuration (prompts for domain)
  3. Start all services

If you prefer not to use the install script, you can prepare images manually.

Terminal window
docker pull ghcr.io/fs2-software/presswerk:1.2.3
docker pull ghcr.io/fs2-software/presswerk-keycloak:1.2.3
docker pull postgres:16-alpine
docker save \
ghcr.io/fs2-software/presswerk:1.2.3 \
ghcr.io/fs2-software/presswerk-keycloak:1.2.3 \
postgres:16-alpine \
| gzip > presswerk-images.tar.gz
Terminal window
docker load < <(gzip -dc presswerk-images.tar.gz)

Then follow the Manual Install steps.

To update an air-gapped installation:

  1. Create a new bundle with the target version on an internet-connected machine
  2. Transfer to the air-gapped server
  3. Load the new images:
    Terminal window
    docker load < <(gzip -dc images.tar.gz)
  4. Update APP_VERSION in .env
  5. Restart:
    Terminal window
    docker compose up -d

For organizations with many air-gapped servers, consider setting up an internal container registry:

Terminal window
# On a registry server accessible from the air-gapped network
docker pull ghcr.io/fs2-software/presswerk:1.2.3
docker tag ghcr.io/fs2-software/presswerk:1.2.3 registry.internal:5000/presswerk:1.2.3
docker push registry.internal:5000/presswerk:1.2.3

Update docker-compose.yml to reference your internal registry:

services:
app:
image: registry.internal:5000/presswerk:${APP_VERSION:-latest}
keycloak:
image: registry.internal:5000/presswerk-keycloak:${APP_VERSION:-latest}