S3 Panel is a self-service web panel for S3-compatible object storage (Ceph RGW): authenticate with S3 credentials and manage buckets and objects — list, upload, download, delete and share — and view quotas.
This is a monorepo:
- Backend (
cmd/,internal/) — a Go HTTP API in front of the Ceph RADOS Gateway. - Frontend (
frontend/) — a Vite + React + TypeScript UI, embedded into and served by the backend binary (internal/web), so there is a single image. - Deploy (
deploy/helm/) — thes3-panelHelm chart.
Run the backend with a config file:
go run ./cmd/s3-panel s3-panel --configPath=./configs/sample-config.tomlConfiguration is TOML, loaded with koanf (defaults
< config file < s3panel_-prefixed environment variables). See
configs/sample-config.toml for the format and frontend/README.md for the UI.
A Helm chart lives in deploy/helm (chart name s3-panel). On each
semver tag the release workflow publishes it as an OCI artifact alongside the
single image (which serves both the API and the embedded frontend):
| Artifact | Reference |
|---|---|
| Image (API + UI) | ghcr.io/snapp-incubator/s3-panel:<version> |
| Helm chart (OCI) | oci://ghcr.io/snapp-incubator/charts/s3-panel |
Install from the OCI registry:
helm install s3-panel oci://ghcr.io/snapp-incubator/charts/s3-panel \
--version <version> -n snappcloud-unified-panel -f my-values.yamlGitHub Actions (.github/workflows):
- CI (
ci.yml) — lint (golangci-lint, Biome,helm lint --strict) and test (go test, plus chart manifest validation with kubeconform), then build the single image. The build job runs only after lint and test pass. - Release (
release.yml) — on a semver tag, builds and pushes the image and the Helm chart (OCI) to GHCR.
The HTTP API is documented with Swagger/OpenAPI. With the server running, browse the
interactive docs at /docs/ (e.g. http://127.0.0.1:8080/docs/); the generated spec lives
in docs/swagger.yaml.