Skip to content

Instantly share code, notes, and snippets.

@stephdl
Last active December 17, 2025 08:37
Show Gist options
  • Select an option

  • Save stephdl/5e6ab6740eab32680fae3e356836e70a to your computer and use it in GitHub Desktop.

Select an option

Save stephdl/5e6ab6740eab32680fae3e356836e70a to your computer and use it in GitHub Desktop.
install garage with garage-ui with docker-compose for tests

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: local

FIXME

AUTH_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
97965a6655f94af7c090e22cd1841078ef4990ad85c5b95955b1e51ad11a5e9e

start 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.0

then 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

@mrmarkuz
Copy link

mrmarkuz commented Dec 17, 2025

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

[s3_api]
s3_region = "us-east-1"
api_bind_addr = "[::]:3900"
root_domain = "garagebucket.your.domain.tld"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment