Sign inSign up

asdfinit/rock-cloudprint

By asdfinit

Updated 1 day ago

Docker Rock Cloud Print

Image
0

1.4K

asdfinit/rock-cloudprint repository overview

Rock Cloud Print — Docker

A community-maintained Docker port of the Rock RMS Cloud Print proxy service.

The original application is Windows-only. This image runs as a headless Linux container with a browser-based admin UI and is designed to run on any Linux server — including a Raspberry Pi or TrueNAS SCALE — on the same network as your label printers.

Rock RMS Server  ──WebSocket──▶  This container  ──TCP:9100──▶  Local Printer

Commonly used for Rock Check-in label printing where printers are on a local church network but the Rock server is cloud-hosted.


Quick start (Linux server / Raspberry Pi)

# 1. Create a config folder (settings are written here by the web UI)
mkdir -p rock-cloudprint/config

# 2. Create docker-compose.yml
cat > rock-cloudprint/docker-compose.yml <<'EOF'
services:
  rock-cloudprint:
    image: asdfinit/rock-cloudprint:latest
    network_mode: host
    volumes:
      - ./config:/app/config
    restart: unless-stopped
EOF

# 3. Start the container
cd rock-cloudprint
docker compose up -d

# 4. Open the web UI
# Navigate to http://<server-ip>:8080

Open the web UI, go to Settings, enter your Rock server URL and Proxy ID, and click Save & Reconnect.


TrueNAS SCALE

TrueNAS SCALE 25.10 supports Docker Compose via the Install via YAML path in the Apps section.

1. Create a dataset

In TrueNAS → Datasets, create a new dataset named rock-cloudprint under your pool (e.g. tank/rock-cloudprint, path /mnt/tank/rock-cloudprint).

2. Install via YAML

Go to Apps → Discover → ⋮ (top right) → Install via YAML, name the app rock-cloudprint, and paste:

services:
  rock-cloudprint:
    image: asdfinit/rock-cloudprint:latest
    ports:
      - "8080:8080"
    volumes:
      - /mnt/tank/rock-cloudprint:/app/config
    restart: unless-stopped

Adjust the host path if your pool is named differently.

3. Configure

Open http://<truenas-ip>:8080Settings → enter your Rock server URL and Proxy ID → Save & Reconnect.

Settings persist in the dataset and survive container updates.


Portainer

Deploy as a Stack — Portainer's equivalent of a Compose file.

Go to Stacks → Add stack → Web editor, name it rock-cloudprint, and paste:

services:
  rock-cloudprint:
    image: asdfinit/rock-cloudprint:latest
    container_name: rock-cloudprint
    ports:
      - "8080:8080"
    volumes:
      - rock-cloudprint-config:/app/config
    restart: unless-stopped

volumes:
  rock-cloudprint-config:

Click Deploy the stack, then open http://<server-ip>:8080Settings → enter your Rock server URL and Proxy ID → Save & Reconnect.

Use a named volume, not a bind mount. The container runs as UID 1000 (appuser). A fresh named volume inherits that ownership and stays writable; a host directory Docker auto-creates comes up root-owned and saving settings will fail. For a bind mount, chown -R 1000:1000 the host path first and use an absolute path — ./config does not resolve predictably in Portainer web-editor stacks.

Updating: Portainer will not re-pull latest on its own. Use Stacks → rock-cloudprint → Editor → Update the stack with Re-pull image ticked.


Configuration

Settings can be provided two ways. Environment variables take precedence over the web UI.

Open http://<server-ip>:8080, go to Settings, and fill in:

FieldDescription
Rock Server URLFull URL of your Rock instance, e.g. https://origin.church.com
Proxy IDThe IdKey (e.g. da0BJR0Bpz) from Rock's Cloud Print Proxy device record
Proxy NameOptional friendly name; defaults to the container hostname
Environment variables
environment:
  - Url=https://origin.church.com
  - Id=da0BJR0Bpz
  - Name=Office Proxy
  - Password=mypin        # optional PIN to protect the web UI

PIN / password protection

The web UI is open by default. To require a login:

  • Via web UI: Settings → Security → Set PIN
  • Via env var: Add - Password=mypin to your docker-compose.yml environment block

Tokens are in-memory only. Users must log in again after a container restart.


Networking

On a standard Linux server this image uses network_mode: host so the container can reach printers at their local IP addresses (port 9100) and the web UI is available on port 8080 with no port mapping needed.

On TrueNAS SCALE, host networking is not available in the Apps system. Use explicit port mapping (ports: - "8080:8080") instead — the container can still reach LAN printers through the host's network.

macOS / Windows Docker Desktop: Host networking is not supported. This image is intended for Linux servers only.


CDN / origin URL note

If your Rock site sits behind Cloudflare or another CDN, use the origin server URL rather than the primary domain. CDNs typically do not forward WebSocket upgrade requests, causing connection failures with the error:

The server returned status code '400' when status code '101' was expected.

Your origin URL is often https://origin.yourdomain.com or the direct IP/hostname of your web server.


Printer addressing

Printers are configured in Rock — not in this app. In Rock's check-in printer settings, set the printer address to the printer's local IP:

  • 192.168.1.50 — uses default port 9100
  • 192.168.1.50:9100 — explicit port

Auto-start on reboot (Linux / Raspberry Pi)

sudo bash -c 'cat > /etc/systemd/system/rock-cloudprint.service <<EOF
[Unit]
Description=Rock Cloud Print Proxy
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/rock-cloudprint
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=300

[Install]
WantedBy=multi-user.target
EOF'
sudo systemctl daemon-reload
sudo systemctl enable rock-cloudprint

Updating

docker compose pull
docker compose up -d

Settings are stored in the config/ directory outside the container and are unaffected by updates.


Web UI reference

TabDescription
DashboardConnection status, uptime, labels printed counter
LogsLive service log (last 300 entries), color-coded by level
PrintersTest whether a printer can be reached, using the same connection a print uses. Nothing is printed
Settings → ConnectionRock server URL, Proxy ID, Proxy Name
Settings → NotificationsTell Rock when a printer fails. Needs Rock-side setup first — see below
Settings → SecuritySet, change, or remove web UI PIN

Print failure notifications

The proxy can tell your Rock server when a printer fails, or when a print finishes too slowly to be any use, so somebody can be told. Off by default.

This needs setting up in Rock first

The container only posts to a web address. On its own that does nothing. Someone has to create three things in Rock, and the container cannot create any of them:

  1. A Lava webhook to receive the message.
  2. A workflow for that webhook to launch.
  3. The communications inside that workflow — who gets told, and how.

Until those exist, turning notifications on only records problems in the log.

An importable workflow and full setup steps are in the repository, under docs/rock/. It imports inert and notifies nobody until you set the groups.

Once Rock is ready, configure it in Settings → Notifications: the webhook URL, the shared secret, and a quiet period. Then press Send test notification — it sends a real request and reports exactly what came back, so the URL, the secret, the webhook and the workflow are all proved at setup time rather than during an outage.

If Rock is configured correctly, pressing it may message people. That is how you know it worked.

A few things worth knowing:

  • The webhook URL must be https — the shared secret travels in a request header. A plain http URL is refused rather than sent.
  • Use the same host as your Rock server URL. Behind a CDN the webhook sees the CDN's address rather than your proxy's, and rejects it.
  • Notifications are debounced per printer, per kind of problem, defaulting to a five minute quiet period. One printer failing ten times produces one notification; ten printers failing produce ten, because that is ten things to check.
  • If a notification cannot be delivered, the dashboard shows a banner naming the actual fault — a rejected secret, a URL matching no webhook — rather than saying the request failed. It clears on the next success.

Useful commands

docker compose pull          # pull latest image
docker compose up -d         # start / apply updates
docker compose logs -f       # live logs
docker compose restart       # restart container
docker compose down          # stop

Source

github.com/The-Ark-Church/rock-cloud-print-docker

Based on Rock RMS — licensed under the Rock Community License.

Tag summary

Content type

Image

Digest

sha256:ee0208fb5

Size

89.6 MB

Last updated

2 days ago

docker pull asdfinit/rock-cloudprint