Skip to content

Data Server

Docker Hub

Host your own OME-ZARR data server on your lab network. Your data never leaves your infrastructure. The browser streams ZARR chunks directly from your server.

Why Use a Data Server?

  • Keep data on-site: no cloud upload, no transfer costs
  • Access control: JWT tokens scoped to specific datasets
  • Works with the viewer: just paste a URL and go
  • Simple setup: one Docker command

The whole progression

Share Your Microscopy Data With Your Team Without Sending Anyone a Hard Drive walks it end to end: open a local file, put it behind this server for colleagues on the network, then add a token once the data is sensitive. It also covers when you do not need this server at all, which is any time the data already sits on S3 or MinIO.

Install

bash
mkdir -p ~/.findnuclei

docker run -d \
  -p 3333:3333 \
  -p 3334:3334 \
  -v /path/to/your/zarr/data:/data/storage \
  -v ~/.findnuclei:/data/config \
  -e FN_ADMIN_PASSWORD=changeme \
  fn0000/fn-data-server
PortWhat
3333Data server. S3-compatible, serves ZARR chunks
3334Admin console. Manage tokens, browse buckets

Two mount points:

  • /data/storage: your ZARR data directory (read-only is fine)
  • /data/config: token database and signing key (persists across restarts)

Organize Your Data

Each top-level directory in your storage becomes a bucket:

/your/zarr/data/
├── project-alpha/
│   ├── sample1.zarr/
│   └── sample2.zarr/
└── project-beta/
    └── experiment.zarr/

View Your Data

Once the server is running, open the viewer with a direct link:

https://find-nuclei.github.io?url=http://localhost:3333/project-alpha/sample1.zarr

Or paste the URL into the Open Image dialog.

Authentication

By default, the data server requires JWT tokens for all data access. This is the recommended mode for any network that isn't fully trusted.

Create a Token

  1. Open the admin console at http://localhost:3334/admin
  2. Log in with your admin password
  3. Set a label (e.g., "Alice's token") and scope (bucket name or * for all)
  4. Click Create Token
  5. Copy the token. It won't be shown again

Use the Token in the Viewer

Option 1: URL parameter

https://find-nuclei.github.io?url=http://localhost:3333/project-alpha/sample.zarr&token=YOUR_JWT

Option 2: Auth prompt

If you open a URL without a token, the viewer detects the 401 response and shows a 🔑 token prompt. Paste your token and the image loads.

Token Scoping

Tokens can be restricted to specific buckets:

  • project-alpha: only access /project-alpha/ and its contents
  • *: wildcard, access everything

Additional restrictions (optional):

  • TTL: token expires after a set time
  • Host: only works from specific domains (supports wildcards: *.lab.internal)
  • IP: only works from specific client IPs (supports wildcards: 192.168.1.*)

Open Mode

For fully trusted networks (isolated lab VLAN, localhost only), you can disable authentication:

bash
docker run -d \
  -e FN_AUTH_ENABLED=false \
  ...
  fn0000/fn-data-server

All data endpoints are open. No tokens needed.

Scaling

The data server runs multiple worker processes by default:

UsersConfig
1–5Default (4 workers)
5–20-e FN_DATA_WORKERS=8
20–50Multiple containers behind a load balancer

Network Setup

The data server only needs to be reachable from the user's browser, not from the internet:

┌─────────────┐          ┌─────────────┐          ┌──────────────┐
│  Viewer     │  ZARR    │   User's    │  ZARR    │ Data Server  │
│  (github.io)│  metadata│   Browser   │  chunks  │ (your LAN)   │
│             │◄────────►│             │◄────────►│              │
└─────────────┘          └─────────────┘          └──────────────┘

Common setups:

  • Localhost: viewer and data server on the same machine
  • Lab network: data server on a NAS or shared workstation
  • VPN: users connect to the lab network remotely

CORS

The data server allows all origins by default (FN_CORS_ORIGINS=*). To restrict:

bash
-e FN_CORS_ORIGINS=https://find-nuclei.github.io,http://localhost:8080

Troubleshooting

Image loads but appears dark

Auto-contrast needs pixel data to calculate display range. Try adjusting the channel contrast sliders manually, or click the auto-contrast button after the image has loaded.

401 / 403 errors

  • 401: no token provided. Add &token=YOUR_JWT to the URL or enter it in the auth prompt.
  • 403: token is invalid, expired, or scoped to a different bucket. Create a new token in the admin console.

Can't connect from browser

  • Check that the data server is reachable from your browser (not just the server machine)
  • If using Docker Desktop on Mac/Windows, localhost works from the host but not from other machines on the network. Use the machine's LAN IP instead.
  • Check CORS settings if you see network errors in the browser console.

Docker networking

In Docker, the client IP seen by the server is the Docker gateway (e.g., 192.168.65.1), not 127.0.0.1. Check http://localhost:3334/health. The your_ip field shows what IP the server sees for your requests.

Free. Private. Browser-based.