create the docker-compose
╰─➤ cat garage.yml
version: '3.8'
services:
# Service Garage S3 compatible
garage:
image: dxflrs/garage:v2.1.0
# network_mode: "host"
restart: unless-stopped
ports:
- "3900:3900"
- "3901:3901"
- "3902:3902"
- "3903:3903"
volumes:
- ./garage.toml:/etc/garage.toml:z
- meta:/var/lib/garage/meta:Z
- data:/var/lib/garage/data:Z
# Interface Web UI pour Garage
garage-webui:
image: khairul169/garage-webui:latest
container_name: garage-webui
restart: unless-stopped
volumes:
- ./garage.toml:/etc/garage.toml:z
ports:
- "3909:3909"
environment:
API_BASE_URL: "http://garage:3903"
S3_ENDPOINT_URL: "http://garage:3900"
AUTH_USER_PASS: "stephdl:$$2y$$10$$bxcMJBaZSfNezuuqwmNmvufFvoyZOyen9oLHMoHvwnkTUcjZ2AMRS"
volumes:
meta:
driver: local
data:
driver: localAUTH_USER_PASS: "stephdl:$$2y$$10$$bxcMJBaZSfNezuuqwmNmvufFvoyZOyen9oLHMoHvwnkTUcjZ2AMRS"
Reading this, you have to create the hash and escap $ by a double $$
here the login is stephdl and the password stephdl
Else generate it : htpasswd -nbBC 10 "YOUR_USERNAME" "YOUR_PASSWORD"
create locally the garage.toml
╰─➤ cat garage.toml
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "lmdb"
replication_factor = 1
compression_level = 2
# idk why rcp_ is needed without replication but ok
rpc_bind_addr = "[::]:3901"
rpc_public_addr = "127.0.0.1:3901"
rpc_secret = "19a4045e042459f77db91e9e52d4a6c53f7e568d9c0b7fba1be4f2a38beb4874"
[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
root_domain = "api.s3.su6.nl"
[s3_web]
bind_addr = "[::]:3902"
root_domain = "web.s3.su6.nl"
index = "index.html"
[admin]
api_bind_addr = "0.0.0.0:3903"
metrics_token = "19a4045e042459f77db91e9e52d4a6c53f7e568d9c0b7fba1be4f2a38beb4874"
admin_token = "19a4045e042459f77db91e9e52d4a6c53f7e568d9c0b7fba1be4f2a38beb4874"you can generate new keys with
╰─➤ openssl rand -hex 32
97965a6655f94af7c090e22cd1841078ef4990ad85c5b95955b1e51ad11a5e9estart the containers
podman-compose -f garage.yml up
In another terminal, we need to initiate the cluster, see quick-start
╰─➤ podman-compose -f garage.yml exec garage /garage status 255 ↵
2025-12-15T15:59:53.971833Z INFO garage_net::netapp: Connected to 127.0.0.1:3901, negotiating handshake...
2025-12-15T15:59:54.013063Z INFO garage_net::netapp: Connection established to 97ba86e7398d68fe
==== HEALTHY NODES ====
ID Hostname Address Tags Zone Capacity DataAvail Version
97ba86e7398d68fe 6ba6a07d0738 127.0.0.1:3901 NO ROLE ASSIGNED v2.0.0then create a cluster of 1GB
╰─➤ podman-compose -f garage.yml exec garage /garage layout assign -z dc1 -c 1G 97ba86e7398d68fe
2025-12-15T16:00:36.292745Z INFO garage_net::netapp: Connected to 127.0.0.1:3901, negotiating handshake...
2025-12-15T16:00:36.334065Z INFO garage_net::netapp: Connection established to 97ba86e7398d68fe
Role changes are staged but not yet committed.
Use `garage layout show` to view staged role changes,
and `garage layout apply` to enact staged changes.apply the configuration
╰─➤ podman-compose -f garage.yml exec garage /garage layout apply --version 1
2025-12-15T16:00:52.010209Z INFO garage_net::netapp: Connected to 127.0.0.1:3901, negotiating handshake...
2025-12-15T16:00:52.052014Z INFO garage_net::netapp: Connection established to 97ba86e7398d68fe
==== COMPUTATION OF A NEW PARTITION ASSIGNATION ====
Partitions are replicated 1 times on at least 1 distinct zones.
Optimal partition size: 3.9 MB
Usable capacity / total cluster capacity: 1000.0 MB / 1000.0 MB (100.0 %)
Effective capacity (replication factor 1): 1000.0 MB
dc1 Tags Partitions Capacity Usable capacity
97ba86e7398d68fe [] 256 (256 new) 1000.0 MB 1000.0 MB (100.0%)
TOTAL 256 (256 unique) 1000.0 MB 1000.0 MB (100.0%)
New cluster layout with updated role assignment has been applied in cluster.
Data will now be moved around between nodes accordingly.now you can reach the UI http://127.0.0.1:3909/
Login stephdl
Password stephdl
I found that you need to use the following s3_region in garage.toml to make the backup from NS8 work, see also https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/700