Data Server
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
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| Port | What |
|---|---|
| 3333 | Data server. S3-compatible, serves ZARR chunks |
| 3334 | Admin 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.zarrOr 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
- Open the admin console at
http://localhost:3334/admin - Log in with your admin password
- Set a label (e.g., "Alice's token") and scope (bucket name or
*for all) - Click Create Token
- 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_JWTOption 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:
docker run -d \
-e FN_AUTH_ENABLED=false \
...
fn0000/fn-data-serverAll data endpoints are open. No tokens needed.
Scaling
The data server runs multiple worker processes by default:
| Users | Config |
|---|---|
| 1–5 | Default (4 workers) |
| 5–20 | -e FN_DATA_WORKERS=8 |
| 20–50 | Multiple 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:
-e FN_CORS_ORIGINS=https://find-nuclei.github.io,http://localhost:8080Troubleshooting
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_JWTto 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,
localhostworks 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.