A self-hosted cloud storage solution.
10K+
Self-hosted file infrastructure in Rust for small teams that need storage control, reliable large-file uploads, WebDAV/WOPI, and operations visibility — without adopting a full private-cloud suite.
Route files across local, S3-compatible, Azure Blob, Tencent COS, Alibaba OSS, Qiniu Kodo, OneDrive/SharePoint, SFTP, and remote-node backends with one dual-licensed (MIT / Apache 2.0) Rust + React service.
ghcr.io/astercommunity/asterdrive (identical builds).The container runs as the non-root user aster (UID/GID 10001:10001). If you bind mount a host directory, create it first and align ownership:
mkdir -p ./data
sudo chown -R 10001:10001 ./data
docker run -d \
--name asterdrive \
-p 3000:3000 \
-e ASTER__DATABASE__URL="sqlite:///data/asterdrive.db?mode=rwc" \
-v "$(pwd)/data:/data" \
e1saps/asterdrive:latest
Then open http://localhost:3000, create the administrator account, and create the first storage policy — the instance reports ready only after both exist.
Why is
ASTER__DATABASE__URLrequired? The built-in default SQLite path is relative to the working directory (/), which the non-root container user cannot write to. Point the database (and everything else) at the/datavolume.
Named volumes (docker volume create) are owned by the in-container user automatically and do not need chown.
All tags are multi-arch manifests for linux/amd64 and linux/arm64.
| Channel | Full image | Slim image |
|---|---|---|
| Stable release | latest, stable, vX.Y.Z | latest-slim, stable-slim, vX.Y.Z-slim |
| Stable + metrics | latest-metrics, stable-metrics, vX.Y.Z-metrics | latest-metrics-slim, stable-metrics-slim, vX.Y.Z-metrics-slim |
| Prerelease (alpha / beta / rc) | edge, vX.Y.Z-rc.N | edge-slim, vX.Y.Z-rc.N-slim |
| Prerelease + metrics | edge-metrics, vX.Y.Z-rc.N-metrics | edge-metrics-slim, vX.Y.Z-rc.N-metrics-slim |
Full vs slim: the full image bundles vips, ffmpeg, and ffprobe for HEIC/AVIF/PDF covers, video thumbnails, and video metadata. Slim images omit those external media tools for a smaller download and software bill of materials; built-in image/audio processing and every other capability (databases, storage backends, WebDAV, WOPI, remote nodes) are unchanged. If an existing instance uses those media processors (Admin → System Settings → File Processing → Media Processing), stay on the full image.
Metrics: -metrics builds compile in the Prometheus metrics feature. See Monitoring and Grafana.
services:
asterdrive:
image: e1saps/asterdrive:stable
ports:
- "3000:3000"
volumes:
- ./data:/data
- /etc/localtime:/etc/localtime:ro
environment:
- ASTER__DATABASE__URL=sqlite:///data/asterdrive.db?mode=rwc
stop_grace_period: 45s
restart: unless-stopped
Prepare the bind mount first: mkdir -p ./data && sudo chown -R 10001:10001 ./data.
An optional aria2 profile for link import is available in the repository's docker-compose.yml; see Single-Instance Docker Deployment.
AsterDrive generates /data/config.toml on first startup. Edit it on the host and restart the container, or override any key with an environment variable: prefix ASTER__, with __ as the section separator.
| Variable | Default | Purpose |
|---|---|---|
ASTER__SERVER__HOST | 0.0.0.0 (set in image) | HTTP bind address |
ASTER__SERVER__PORT | 3000 | HTTP port |
ASTER__DATABASE__URL | sqlite://asterdrive.db?mode=rwc | SQLite, or postgres://… / mysql://… |
ASTER__AUTH__JWT_SECRET | change-me-in-production | Change before production |
ASTER__CACHE__BACKEND | memory | memory or redis |
ASTER__CACHE__ENDPOINT | empty | e.g. redis://redis:6379/0 |
ASTER__DEPLOYMENT__PROFILE | single | single or cluster |
ASTER__LOGGING__LEVEL | info | trace / debug / info / warn / error |
ASTER__LOGGING__FORMAT | text | text or json |
Full reference: config.example.toml and the configuration docs.
| Item | Value |
|---|---|
| User | aster (UID/GID 10001:10001), non-root |
| Exposed port | 3000 (HTTP) |
| Volume | /data — config.toml, SQLite database, uploads, avatars, temp dirs |
| Healthcheck | GET /health/ready on port 3000 |
| Entrypoint | /usr/local/bin/aster_drive (the same binary provides the ops CLI, e.g. docker compose exec asterdrive aster_drive config …) |
3000 directly to the public internet. See Reverse Proxy.change-me-in-production secrets in config.toml before launch./data first, and do not roll back to an older version after a minor-version upgrade. See Upgrade and Version Migration.cluster profile) deployments require shared PostgreSQL/MySQL, Redis, and object storage. See Load Balancing and Multi-Instance Deployments and Kubernetes Deployment.config.toml, the database, and uploads/ (plus avatar/ if used). .tmp/ and .uploads/ are disposable. See Backup and Restore.Dual-licensed under MIT or Apache 2.0. No paid edition, no feature wall.
Content type
Image
Digest
sha256:651671635…
Size
106.9 MB
Last updated
about 5 hours ago
docker pull e1saps/asterdrive