JuiceFS

JuiceFS

Docker app from junkerderprovinz's Repository

Overview

JuiceFS keeps file metadata in a database and file contents in an object store. This template runs its S3 gateway, so anything on your server that speaks S3 can talk to it. The official binary, unmodified, verified against the upstream SHA256 at build time. Why this template exists: upstream publishes no image meant to be installed as a container. Their Docker volume plugin is not a container at all and cannot be installed from a template, and their juicedata/mount image expects you to write the whole command line yourself, with the file system created by hand in a console first. Here every setting is a field below, and the file system is created on first boot. No manual CLI setup: • The file system is created the first time the container starts. On every later start it finds the existing one and leaves it alone, because formatting twice would orphan every object already stored. • Leave the Secret Key empty and one is generated for you and written to /config/.s3_root_password. The container log points you at it. • Defaults are a SQLite file in /config and a plain directory in /data, so a fresh install needs no second container and no external database. READ THIS BEFORE YOU INSTALL: JuiceFS splits files into chunks, so the Data folder is NOT browsable. You will see JuiceFS's own layout there, not your file names. Everything goes in and comes out through the S3 gateway. If you want an S3 API in front of a share you can still read normally in a file browser, install VersityGW instead. BACKUP: back up the Config and Data folders together, from the same point in time if you can. The chunks in Data are unreadable without the database in Config. A backup of only Data is not a backup. First start: watch the container log for "JUICEFS IS READY".
JuiceFS

Build  Upstream JuiceFS  Unraid  License

JuiceFS keeps file metadata in a database and file contents in an object store. This container runs its S3 gateway, so everything on your server that speaks S3 can talk to it. The official binary, unmodified, supervised by s6-overlay. The file system is created on first boot, so there is no console step between installing the template and using it.

Install from Unraid's Community Applications   Install from the MOS Hub   Download the docker-compose file   Download the source archive


A one-knight job: I build it, keep it running, work through the issues and add what people ask for, until nothing is missing. It is free, with no accounts, no telemetry, no ads and no paid tier. No asterisk anywhere. Nothing readable ever leaves your own walls. Forged on evenings and weekends, with heart and stubbornness.

If it has earned a place on your server or computer, toss a coin to your knight: it helps cover the costs and keeps the project alive. It also makes this knight's heart beat a little faster. Three ways below, whichever suits you.

Buy me a coffee   PayPal   Donate with crypto


Table of Contents

  1. What it looks like
  2. What it does
  3. Getting started
  4. How AI is used here
  5. Support this project

1. What it looks like

The buckets and files in these pictures are made up.

The gateway's object browser in a browser, showing the files in a bucket named backups
The gateway's own object browser on port 9000, after signing in with the S3 keys

The end of the container log: the banner, then JUICEFS IS READY and a note about the generated secret key
The end of the log after a first start, with the ready line and where the generated key is


2. What it does

  • JuiceFS as an ordinary container. Upstream offers a Docker volume plugin, which Unraid cannot install from a template, and the juicedata/mount image, which wants the whole command line written by hand. Here every setting is an environment variable, so every setting is a field in the template.
  • No console step. The file system is created on the first start. Every later start finds it and leaves it alone, so a volume is never formatted twice.
  • S3 on port 9000, without FUSE. The gateway needs neither --privileged nor shared mount propagation. Clients can create as many buckets as they like; set MULTI_BUCKETS=false for upstream's single bucket named after the volume.
  • Metadata where you want it. SQLite under /config by default, so a fresh install needs nothing else. A Redis or Postgres URL in META_URL moves it to a database several machines can share.
  • Chunks, not files. JuiceFS stores contents as chunks, so /data shows its own layout and not your file names. If you want an S3 API in front of a share you can still browse, VersityGW is the better fit.
  • The official binary. It comes from the upstream release and is checked against the published SHA256 during the build.

3. Getting started

On Unraid, install JuiceFS from Community Applications and start it. Nothing else is required. Anywhere else, one container is enough:

docker run -d --name juicefs -p 9000:9000 \
  -v /path/to/config:/config \
  -v /path/to/data:/data \
  junkerderprovinz/juicefs:latest

The log says JUICEFS IS READY once the gateway is up. The access key is juicefs. Without S3_ROOT_PASSWORD the container generates a secret key and writes it to /config/.s3_root_password; one you set yourself needs at least 8 characters. Then point any S3 client at it:

aws --endpoint-url http://<server>:9000 s3 mb s3://backups
aws --endpoint-url http://<server>:9000 s3 cp ./file.txt s3://backups/

STORAGE, BUCKET and VOLUME_NAME are read only when the file system is created, so choose them before the first start. They accept every backend JuiceFS supports, such as another S3 server or Backblaze B2 instead of the local disk.

Back up the metadata and the object store together, which with the defaults means /config and /data. The chunks are unreadable without the metadata, so a backup of /data alone is not a backup.

Other Docker hosts

compose.yaml runs JuiceFS on any Linux server with Docker. Put it in a folder of its own and start it with docker compose up -d. The folders are created next to the file.

  • Synology: in Container Manager, create a project from the file (DSM 7.2 or newer).
  • Proxmox: run it in a VM or an LXC container that has Docker.
  • MOS: install JuiceFS from the MOS Hub.

4. How AI is used here

One knight builds this, and AI is one of the tools I work with, the same way I work with an editor or a compiler. It helps me write code and documentation and it checks my work, and that saves me a good many evenings. It does not make the decisions, though. I read and understand everything before it ships, and if something here breaks, that is on me and not on the tool.

You do not have to take my word for it. The code is open and every release note is written by hand. The issue tracker shows how problems actually get handled, including the ones I got wrong the first time. If you find something that is not right, open an issue and I will look at it.


5. Support this project

Questions? Check the support thread. Bugs, ideas or feature requests? Please open a GitHub issue.

A one-knight job: I build it, keep it running, work through the issues and add what people ask for, until nothing is missing. It is free, with no accounts, no telemetry, no ads and no paid tier. No asterisk anywhere. Nothing readable ever leaves your own walls. Forged on evenings and weekends, with heart and stubbornness.

If it has earned a place on your server or computer, toss a coin to your knight: it helps cover the costs and keeps the project alive. It also makes this knight's heart beat a little faster. Three ways below, whichever suits you.

Buy me a coffee   PayPal   Donate with crypto

JuiceFS is made by Juicedata and ships here unmodified under the Apache-2.0 licence.

Requirements

Map both Config and Data, and back them up together. The chunks in Data cannot be read without the database in Config.

Download Statistics

76
Total Downloads

Related apps

Details

Repository
junkerderprovinz/juicefs:latest
Last Updated2026-09-14
First Seen2026-09-17

Runtime arguments

Network
bridge
Shell
sh
Privileged
false
Extra Params
--restart=unless-stopped

Template configuration

S3 Gateway PortPorttcp

The S3 endpoint every client (rclone, restic, aws-cli, ...) connects to.

Target
9000
Default
9000
Value
9000
ConfigPathrw

Holds the metadata database when the default SQLite engine is used, and the generated secret key. This MUST be mapped. Lose it and the objects in Data become unreadable, because nothing says which chunks made up which file.

Target
/config
Default
/mnt/user/appdata/juicefs/config
Value
/mnt/user/appdata/juicefs/config
DataPathrw

The object store, when the default local backend is used. Not browsable: JuiceFS stores files as chunks under its own layout.

Target
/data
Default
/mnt/user/appdata/juicefs/data
Value
/mnt/user/appdata/juicefs/data
CachePathrw

The local read cache. Optional, but worth mapping: unmapped it lives in the container's own layer, and the cache grows to whatever free space allows.

Target
/cache
Default
/mnt/user/appdata/juicefs/cache
Value
/mnt/user/appdata/juicefs/cache
Access KeyVariable

The access key your S3 clients use to connect to this container.

Target
S3_ROOT_USER
Default
juicefs
Value
juicefs
Secret KeyVariable

The secret key your S3 clients use. At least 8 characters: anything shorter is refused at startup with one clear line in the log. Leave empty and one is generated on first boot and stored in /config/.s3_root_password. Use a real generated secret (e.g. openssl rand -hex 24), not a short password.

Target
S3_ROOT_PASSWORD
Metadata URLVariable

Where the metadata lives. The default is a SQLite file in Config: one server, no extra container, and a backup of Config captures it. For several machines writing at once, put a Redis or Postgres URL here instead, for example redis://:password@192.168.20.10:6379/1 or postgres://user:password@192.168.20.10:5432/juicefs?sslmode=disable. This is read every start, but the file system is only created once.

Target
META_URL
Default
sqlite3:///config/juicefs.db
Value
sqlite3:///config/juicefs.db
Storage BackendVariable

Where the file contents go. 'file' means the Data folder above. Every backend JuiceFS supports works here too, e.g. s3, minio, b2. READ ONLY WHEN THE FILE SYSTEM IS CREATED: changing it later has no effect on an existing volume.

Target
STORAGE
Default
file
Value
file
BucketVariable

The path or URL of the object store. With the 'file' backend this is a path inside the container, so leave it at /data/ unless you know why you are changing it. READ ONLY WHEN THE FILE SYSTEM IS CREATED.

Target
BUCKET
Default
/data/
Value
/data/
Volume NameVariable

The name of the file system. Set once, when it is created; changing it later has no effect on an existing volume.

Target
VOLUME_NAME
Default
juicefs
Value
juicefs
Allow Several BucketsVariable

Whether S3 clients can create buckets. Leave this on unless you know why you are turning it off: with it off, the whole file system is a single bucket named after the volume and creating one is refused, which is the first thing most backup clients do.

Target
MULTI_BUCKETS
Default
true
Value
true
Object Store Access KeyVariable

Only needed if Storage Backend is not 'file': the access key of the remote object store. READ ONLY WHEN THE FILE SYSTEM IS CREATED.

Target
ACCESS_KEY
Object Store Secret KeyVariable

Only needed if Storage Backend is not 'file': the secret key of the remote object store. READ ONLY WHEN THE FILE SYSTEM IS CREATED.

Target
SECRET_KEY
Trash DaysVariable

How many days deleted files stay recoverable. Applied when the file system is created, so it has no effect on an existing volume. Leave empty for the JuiceFS default.

Target
TRASH_DAYS
Cache SizeVariable

Local read cache limit in MiB. Leave empty for the JuiceFS default.

Target
CACHE_SIZE
Cache DirectoryVariable

Where the local read cache goes. Leave empty to use /cache inside the container. Point it at a mapped fast disk if you want the cache on specific storage.

Target
CACHE_DIR
Extra ArgumentsVariable

Passed to 'juicefs gateway' as is, for anything not covered by the fields above.

Target
EXTRA_ARGS
PUIDVariable

User ID the gateway runs as. Default 99 = 'nobody' on Unraid.

Default
99
Value
99
PGIDVariable

Group ID the gateway runs as. Default 100 = 'users' on Unraid.

Default
100
Value
100