Cloudreve
Cloud drive for your own files, with share links, WebDAV, previews for documents, photos and video, and offline downloads.
Cloud / File Sharing / Storage
File sharing and screenshot host that works with ShareX, Flameshot and the like, with a link shortener, text pastes, folders, and files that can expire, need a password or delete themselves after so many views.
It isn't in the main Portainer Templates list yet, so use this one. Portainer takes one URL at a time, so it swaps out whatever list you had before.
In Portainer, head to Settings --> App Templates, paste this in as the URL and save.
https://raw.githubusercontent.com/NotAFlightRisk/portainer-templates-extras/main/templates.json http://<your-server>:3200 in a browser.The same file Portainer deploys. It reads its settings from a .env next to it.
services:
zipline:
image: ghcr.io/diced/zipline:latest
restart: unless-stopped
ports:
- "${ZIPLINE_PORT:-3200}:3000"
environment:
CORE_SECRET: ${ZIPLINE_SECRET:?Set a secret of at least 32 characters}
DATABASE_URL: postgres://zipline:${ZIPLINE_DB_PASSWORD:?Set a database password}@postgres:5432/zipline
volumes:
- zipline-uploads:/zipline/uploads
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_DB: zipline
POSTGRES_USER: zipline
POSTGRES_PASSWORD: ${ZIPLINE_DB_PASSWORD:?Set a database password}
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U zipline -d zipline"]
interval: 10s
timeout: 5s
retries: 5
volumes:
zipline-uploads:
postgres-data:
Fill in the blanks, as Zipline won't start without them.
# Secret (required) - At least 32 characters. Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or every login and upload token stops working.
ZIPLINE_SECRET=
# Database password (required) - Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or Zipline can't reach its database.
ZIPLINE_DB_PASSWORD=
# Host port for the web UI
ZIPLINE_PORT=3200 Grab the file and start it.
mkdir zipline && cd zipline
curl -fsSL -o compose.yml https://raw.githubusercontent.com/NotAFlightRisk/portainer-templates-extras/main/apps/zipline/compose.yml
# save the .env tab here as .env first
docker compose up -d Set both secrets before you deploy (openssl rand -hex 32 makes good ones), since the stack won't start without them, and keep them the same when you redeploy. Then open http://<your-host>:3200 (or whichever port you picked) and create the first account, which becomes the super admin. There are no open sign-ups, so you add everyone else under Users. Settings, under your name in the top corner, makes ready-to-use ShareX and Flameshot configs. Links use whatever address you opened it on, and the rest of the settings (domains, HTTPS links, sign-ups, the 100 MB file limit) live in the dashboard under Server Settings. It checks GitHub for new versions, which you can switch off there under Features. Files and thumbnails live in the zipline-uploads volume, everything else in postgres-data. Docs: zipline.diced.sh
What the Portainer form asks for. With compose they go in the .env file instead.
| Variable | What it's for | Default |
|---|---|---|
ZIPLINE_SECRET | Secret (required) At least 32 characters. Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or every login and upload token stops working. | Needs filling in |
ZIPLINE_DB_PASSWORD | Database password (required) Generate one with: openssl rand -hex 32. Keep it the same when you redeploy, or Zipline can't reach its database. | Needs filling in |
ZIPLINE_PORT | Host port for the web UI | 3200 |
The containers this stack runs, with ports as they come out of the box.
| Service | Image | Ports |
|---|---|---|
zipline | ghcr.io/diced/zipline:latest | 3200:3000 |
postgres | postgres:17-alpine | Internal only |