Web UI for Garage S3 storage: manage buckets, objects, access keys and clusters, with built-in metrics history, OIDC and team-based access control.
  • Go 57.5%
  • TypeScript 40.9%
  • CSS 1.1%
  • JavaScript 0.2%
  • Shell 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
mimic_8 f150610346
Merge pull request #1 from Mimic890/feat/demo-quickstart
feat(demo): one-command quick start with a bundled Garage
2026-11-08 09:59:50 +03:00
.github fix(deps): bump Go to 1.26.10 and golang.org/x/net to v0.60.0 2026-10-21 17:30:26 +03:00
backend refactor(auth): remove the unused bootstrap token 2026-11-08 09:40:24 +03:00
demo feat(demo): assign the layout so buckets work right after start 2026-11-08 09:56:21 +03:00
docs fix(compose): store Kuraban data in a bind mount owned by the host user 2026-11-08 09:44:40 +03:00
frontend fix(dashboard): skip bucket metrics until the cluster has a layout 2026-11-08 09:56:21 +03:00
scripts feat: initial import of Kuraban 2026-10-21 17:07:13 +03:00
.dockerignore feat: initial import of Kuraban 2026-10-21 17:07:13 +03:00
.gitignore feat: initial import of Kuraban 2026-10-21 17:07:13 +03:00
ARCHITECTURE.md feat(buckets): add and remove local aliases 2026-11-06 23:04:41 +03:00
CONTRIBUTING.md feat: initial import of Kuraban 2026-10-21 17:07:13 +03:00
docker-compose.example.yml fix(compose): set the root URL to the address the quick start opens 2026-11-08 09:50:49 +03:00
docker-entrypoint.sh feat: initial import of Kuraban 2026-10-21 17:07:13 +03:00
Dockerfile fix(deps): bump Go to 1.26.10 and golang.org/x/net to v0.60.0 2026-10-21 17:30:26 +03:00
LICENSE feat: initial import of Kuraban 2026-10-21 17:07:13 +03:00
Makefile feat: initial import of Kuraban 2026-10-21 17:07:13 +03:00
README.md feat(demo): assign the layout so buckets work right after start 2026-11-08 09:56:21 +03:00

Kuraban

License: AGPL v3 Go

Kuraban (蔵番) is Japanese for the keeper of a storehouse: the one who guards what is stored and decides who gets in. It is a web interface for Garage, the S3-compatible distributed object storage. It manages buckets, objects and access keys, shows cluster state, and keeps its own metrics history, so you don't need a separate Prometheus and Grafana stack.

Dashboard

Cluster status

Features

  • Buckets and objects. Create and configure buckets, set quotas, website hosting, and global and local aliases, browse objects with prefix and recursive search, upload with drag and drop, preview, download and bulk-delete files and folders.
  • Access keys. Create keys, edit a key's read, write and owner permissions across all buckets in one table, reveal secrets.
  • Cluster. Node status, health, per-node statistics. Layout management: assign zones and capacity, preview the result, apply or discard, follow a migration and skip dead nodes.
  • Dashboard. S3 traffic, latency percentiles, error rates, storage growth, disk usage, block I/O, resync and RPC metrics. History is stored in a local SQLite database with automatic 5-minute and hourly rollups.
  • Multiple clusters. Add several Garage clusters and switch between them from the header.
  • Authentication. Local admin account, login with the Garage admin token, or OIDC (Keycloak, Authentik, etc.).
  • Team-based access control. Optional, for OIDC users. See docs/access-control.md.
  • Runtime settings. Monitoring interval and retention, dashboard thresholds, log level and IP allowlists are changed in the UI without a restart.
  • Interface. English and Russian, several color themes with light and dark variants, command palette (Ctrl+K).

Garage admin API v1 and v2 are both supported. Some cluster statistics are only available on v2.

Garage 2.5.0 or newer is recommended. Older versions work, but without its batch requests lists and metrics ask about each bucket and key separately, which gets slow at around a thousand of them.

Quick start

Try it with a bundled Garage

You need Docker with Compose v2 and Git.

git clone https://github.com/Mimic890/kuraban.git
cd kuraban
./demo/up.sh

The script generates secrets in demo/.env, starts a single-node Garage with Kuraban already connected to it, assigns the node a layout (zone dc1, capacity 1 GB), and prints the URL, username and password. You can create buckets right away. Running it again keeps the existing secrets, layout and data.

This setup is for evaluation only. Stop it with docker compose -f demo/compose.yml down. To start over, also delete demo/.env, demo/data, demo/garage/meta and demo/garage/data.

Use your own Garage

You need Docker with Compose v2 and a running Garage cluster. To set up a local one by hand, see docs/garage-setup.md.

  1. Download the example Compose file:

    curl -o compose.yml https://raw.githubusercontent.com/Mimic890/kuraban/main/docker-compose.example.yml
    
  2. Create the data directory and start the container:

    mkdir -p data
    printf 'UID=%s\nGID=%s\n' "$(id -u)" "$(id -g)" > .env
    docker compose up -d
    
  3. Open http://127.0.0.1:8080 and create the admin account (password of at least 12 characters).

  4. Add a cluster: enter the S3 endpoint (for example http://garage:3900), the admin endpoint (http://garage:3903) and the admin_token from your garage.toml.

Important

The first person to open the UI creates the admin account. Keep the port closed to the outside until setup is done, or provision the account up front with KURABAN_AUTH_ADMIN_USERNAME and KURABAN_AUTH_ADMIN_PASSWORD.

The example binds to 127.0.0.1 and runs in development mode. For a public deployment, put the UI behind a reverse proxy with HTTPS and set KURABAN_SERVER_ENVIRONMENT=production and KURABAN_SERVER_ROOT_URL=https://your-domain.

Configuration

The basics are set with environment variables:

Variable Default Description
KURABAN_SERVER_HOST :: Listen address.
KURABAN_SERVER_PORT 8080 Listen port.
KURABAN_SERVER_ENVIRONMENT production production or development. Production enforces secure cookie and OIDC settings.
KURABAN_SERVER_ROOT_URL External URL of the UI. Required for OIDC.
KURABAN_DATA_DIR data Persistent state directory (/app/data in Docker). Mount a volume here.
KURABAN_LOGGING_LEVEL info trace, debug, info, warn, error.

Everything else (first-run provisioning, OIDC, CORS, the /metrics endpoint, request limits, the YAML config file and secrets from files) is covered in docs/configuration.md.

Garage metrics

The S3, block and RPC charts read Garage's /metrics endpoint using the cluster admin token. If metrics_token in garage.toml differs from admin_token, make them equal or remove metrics_token. Cluster, disk and bucket charts work either way.

Documentation

Not planned

Garage admin tokens (Kuraban itself runs on one), PurgeBlocks (irreversible data loss), ImportKey, InspectObject, worker variables. Per-key/per-bucket request stats are not possible: Garage metrics only carry api_endpoint.

License

Copyright (C) 2026 Mimic890

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License, version 3. See LICENSE for the full text.