Vaze is a self-hosted, local-first file storage and hosting service built with Next.js. Run it easily as a Docker container on your own server or home network. It provides a clean web interface for managing your files and a powerful API to use as a backend for your other applications.
- Full File & Folder Management: Create, rename, move, and delete files and folders directly from the web UI.
- Simple Uploads: Easily upload files and folders through a drag-and-drop interface.
- Export & Download: Download individual files or entire folders as a zip archive.
- API Key Management: Generate and manage API keys from a dedicated dashboard to securely interact with your storage from other apps.
- Powerful API: Use Vaze as a backend service for any application that needs file hosting or storage, with simple RESTful endpoints.
- Dockerized: Get up and running in minutes with the official Docker image.
All you need is Docker with the Compose plugin.
One command sets up everything — it checks Docker, downloads compose.prod.yaml,
generates your AUTH_SECRET into a .env, and starts the container:
curl -fsSL https://raw.githubusercontent.com/darseen/vaze/main/scripts/install.sh | shThe only thing it asks for is the URL you'll open Vaze on, and it defaults to this machine's LAN address. Pass it in to skip the prompt entirely:
curl -fsSL https://raw.githubusercontent.com/darseen/vaze/main/scripts/install.sh \
| BASE_URL=https://files.example.com shRe-run it from the same directory to upgrade: it refreshes the compose file,
pulls the newer image, and recreates the container — while never overwriting a
value already in your .env and never touching the volume your uploads and
database live in. Skip to Initial setup once
it finishes.
Options: --dir=PATH to choose the install directory (default ./vaze), and
--no-start to write the config without starting. BASE_URL, VAZE_PORT,
VAZE_VERSION, VAZE_BIND_ADDR and TZ can all be set in the environment or
edited in .env afterwards.
Prefer to read a script before piping it to a shell? Download it first, or follow the manual steps below.
Grab compose.prod.yaml, put a .env next to it:
AUTH_SECRET=generate-with-openssl-rand-base64-32
BASE_URL=http://your-server-ip-or-domain:3000
VAZE_PORT=3000
VAZE_VERSION=latestthen start it:
docker compose -f compose.prod.yaml up -ddocker run -d \
-p 3000:3000 \
-v vaze_data:/app/data \
-e BASE_URL="http://your-server-ip-or-domain:3000" \
-e AUTH_SECRET="$(openssl rand -base64 32)" \
--restart unless-stopped \
--name vaze \
darseen/vaze:latest-p 3000:3000maps port 3000 on your host to the container's port 3000.-v vaze_data:/app/datapersists uploads and the SQLite database outside the container, so they survive updates and removals.
- Open
http://<your-server-ip>:3000in your browser. - You will be prompted to register — the first user to register becomes the admin.
- Log in with your new credentials.
That's it! You can now start uploading and managing your files.
Run these from your install directory (./vaze by default):
docker compose -f compose.prod.yaml logs -f # follow logs
docker compose -f compose.prod.yaml ps # status and health
docker compose -f compose.prod.yaml restart # restart
docker compose -f compose.prod.yaml down # stop (keeps your data)To upgrade, re-run the installer from that directory — or do it by hand:
docker compose -f compose.prod.yaml pull && docker compose -f compose.prod.yaml up -dWarning
docker compose -f compose.prod.yaml down -v also deletes the vaze_vaze_data
volume — every uploaded file and account goes with it.
Everything lives in the .env the installer writes next to compose.prod.yaml.
Edit it and apply with docker compose -f compose.prod.yaml up -d.
| Variable | Required | Description |
|---|---|---|
BASE_URL |
Yes | Public base URL of your instance, e.g. https://files.example.com. Public file links are built from it. |
AUTH_SECRET |
Yes | Long random string signing session tokens. Replacing it logs everyone out. |
VAZE_PORT |
No (3000) |
Host port published by the container. |
VAZE_BIND_ADDR |
No (0.0.0.0) |
Host address to bind to. Set 127.0.0.1 when a reverse proxy fronts Vaze. |
VAZE_VERSION |
No (latest) |
Image tag to run — pin it for reproducible deploys. |
TZ |
No (UTC) |
Container timezone. |
The installer generates AUTH_SECRET for you. To make one by hand:
openssl rand -base64 32All data lives at /app/data inside the container, backed by the vaze_data
volume. Keep it on a volume or you will lose every file and account when the
container is removed.
Vaze can be used as a file-hosting backend for your other projects. You can use Vaze's official NPM package to interact with the API.
Here are a few screenshots of the Vaze interface.
Contributions are welcome! If you'd like to help improve Vaze, please feel free to fork the repository, make changes, and submit a pull request.
This project is licensed under the MIT License. See the LICENSE file for details.




