Air-Gapped Install
For servers without internet access, Presswerk provides an air-gapped installation method.
Overview
Section titled “Overview”- On an internet-connected machine: Create a bundle containing all Docker images and configuration
- Transfer the bundle to the air-gapped server (USB drive, internal file share, etc.)
- On the air-gapped server: Load images and install
Step 1: Create Bundle
Section titled “Step 1: Create Bundle”On a machine with Docker and internet access:
curl -fsSL https://presswerk.app/install.sh | bash -s -- --bundleTo bundle a specific version:
APP_VERSION=1.2.3 curl -fsSL https://presswerk.app/install.sh | bash -s -- --bundleThis 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
Step 2: Transfer
Section titled “Step 2: Transfer”Copy the bundle to the target server using your preferred method:
# USB drivecp presswerk-bundle-latest.tar.gz /media/usb/
# SCP to bastion hostscp presswerk-bundle-latest.tar.gz bastion:/tmp/
# Internal file sharecp presswerk-bundle-latest.tar.gz /mnt/fileshare/Step 3: Install
Section titled “Step 3: Install”On the air-gapped server:
tar xzf presswerk-bundle-latest.tar.gzcd presswerk-bundle-latest./install.sh --offlineThe installer will:
- Load Docker images from the bundle
- Generate configuration (prompts for domain)
- Start all services
Manual Air-Gapped Install
Section titled “Manual Air-Gapped Install”If you prefer not to use the install script, you can prepare images manually.
Save images (internet-connected machine)
Section titled “Save images (internet-connected machine)”docker pull ghcr.io/fs2-software/presswerk:1.2.3docker pull ghcr.io/fs2-software/presswerk-keycloak:1.2.3docker 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.gzLoad images (air-gapped machine)
Section titled “Load images (air-gapped machine)”docker load < <(gzip -dc presswerk-images.tar.gz)Then follow the Manual Install steps.
Air-Gapped Updates
Section titled “Air-Gapped Updates”To update an air-gapped installation:
- Create a new bundle with the target version on an internet-connected machine
- Transfer to the air-gapped server
- Load the new images:
Terminal window docker load < <(gzip -dc images.tar.gz) - Update
APP_VERSIONin.env - Restart:
Terminal window docker compose up -d
Container Registry Mirroring
Section titled “Container Registry Mirroring”For organizations with many air-gapped servers, consider setting up an internal container registry:
# On a registry server accessible from the air-gapped networkdocker pull ghcr.io/fs2-software/presswerk:1.2.3docker tag ghcr.io/fs2-software/presswerk:1.2.3 registry.internal:5000/presswerk:1.2.3docker push registry.internal:5000/presswerk:1.2.3Update 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}