{"id":20329281,"url":"https://github.com/whisperpine/minio-compose","last_synced_at":"2026-05-29T20:31:13.376Z","repository":{"id":214740874,"uuid":"737251478","full_name":"whisperpine/minio-compose","owner":"whisperpine","description":"MinIO docker compose.","archived":false,"fork":false,"pushed_at":"2024-10-11T13:54:39.000Z","size":21,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-14T14:59:48.595Z","etag":null,"topics":["docker-compose","minio"],"latest_commit_sha":null,"homepage":"","language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/whisperpine.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-30T10:55:03.000Z","updated_at":"2024-10-11T13:54:42.000Z","dependencies_parsed_at":"2025-01-14T14:48:17.720Z","dependency_job_id":"547fe6d7-d58a-4649-8ba8-864e6a337729","html_url":"https://github.com/whisperpine/minio-compose","commit_stats":null,"previous_names":["whisperpine/minio-compose"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whisperpine%2Fminio-compose","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whisperpine%2Fminio-compose/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whisperpine%2Fminio-compose/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whisperpine%2Fminio-compose/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/whisperpine","download_url":"https://codeload.github.com/whisperpine/minio-compose/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241844308,"owners_count":20029615,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker-compose","minio"],"created_at":"2024-11-14T20:09:56.549Z","updated_at":"2026-05-29T20:31:13.371Z","avatar_url":"https://github.com/whisperpine.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MinIO Docker Compose\n\n[![minio](https://img.shields.io/badge/MinIO-C72E49?logo=minio\u0026logoColor=white)](https://min.io/)\n[![license](https://img.shields.io/github/license/whisperpine/minio-compose)](https://github.com/whisperpine/minio-compose/blob/main/LICENSE)\n[![checks](https://img.shields.io/github/actions/workflow/status/whisperpine/minio-compose/checks.yml?logo=github\u0026label=checks)](https://github.com/whisperpine/minio-compose/actions/workflows/checks.yml)\n[![infra-default](https://img.shields.io/github/deployments/whisperpine/minio-compose/infra-default?logo=github\u0026label=infra-default)](https://github.com/whisperpine/minio-compose/deployments/infra-default)\n[![release](https://img.shields.io/github/v/release/whisperpine/minio-compose?logo=github)](https://github.com/whisperpine/minio-compose/releases)\n\nDeploy [MinIO](https://min.io/) by docker compose.\nGet proxied by [Nginx](https://github.com/nginx/nginx),\nwith TLS certificates auto renewed by [Certbot](https://github.com/certbot/certbot).\n\nIf you want to self-host an AWS S3-compatible object storage service in your\noffice or home lab, and access from anywhere, with zero cloud cost, you come to\nthe right place. While this repository is opinionated and tailored for my use\ncases, it may help you get started as a heuristic reference.\n\n```mermaid\nflowchart LR\n  pub(\"Access from WAN\")\n  private(\"Access from LAN\")\n  cf(\"Cloudflare edge nodes\")\n\n  pub -.-\u003e cf\n  cf ---|tunnel| cloudflared\n\n  subgraph Docker Compose\n    cloudflared(\"Cloudflared\")\n    nginx(\"Nginx\")\n    minio(\"MinIO\"):::red_stroke\n    certbot(\"Certbot\")\n\n    cloudflared --- nginx\n    nginx --- minio\n    nginx -.- certbot\n  end\n\n  private -...-\u003e nginx\n\n  classDef red_stroke stroke: #f66\n  style certbot stroke-dasharray: 2\n```\n\n## Get Started\n\n- Setup infrastructure by [Terraform](https://github.com/hashicorp/terraform)\n  or [OpenTofu](https://github.com/opentofu/opentofu).\n- Config environment variables in `.env` file (referto [example.env](./example.env)).\n- Run `docker compose up -d` to spin up services.\n- Run `sh helper.sh apply` to apply tls certs for the first time.\n- Run `sh helper.sh renew` to check if renewal works.\n- Config cron to automatically renew tls certs (see [below](#certbot)).\n\n## Docker Compose\n\nEdit `.env` to configure env vars available in `compose.yaml`.\nDuplicate [example.env](./example.env) as `.env` to get started.\n\nDue to historical reasons, the command for docker compose differs.\nIt can be either `docker compose` (new) or `docker-compose` (old).\nThus specify the command by `DOCKER_COMPOSE` env var in `.env` file.\n\n## Services\n\n### Cloudflare Tunnel\n\n[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)\nprovides a secure way to host without a publicly IP address.\nIt's recommended to set up infrastructures like Cloudflare Tunnel by [Terraform](https://www.terraform.io/).\nSee [infra/README.md](./infra/README.md) for more details.\n\n### Nginx\n\nBy default, template files in `/etc/nginx/templates/*.template` will be read\nand the result of executing `envsubst` will be output to `/etc/nginx/conf.d/`.\nRefer to [Using environment variables in nginx configuration (new in 1.19)](https://hub.docker.com/_/nginx#:~:text=Using%20environment%20variables%20in%20nginx%20configuration%20(new%20in%201.19)).\n\nScripts under `/docker-entrypoint.d` are automatically executed by nginx\ncontainer. [dummy-tls.sh](./scripts/dummy-tls.sh) is mounted there for creating\ndummy tls certs to prevent nginx crash loop. The dummy tls certs will be\nreplaced by eligible ones after running `sh helper.sh apply`.\n\nNginx is also used in conjunction with [certbot](#certbot)\nto apply and renew tls certificates.\n\n### Certbot\n\n[apply-tls.sh](./scripts/apply-tls.sh) and [renew-tls.sh](./scripts/renew-tls.sh)\nare helper scripts to simplify TLS certs management.\nBoth of them will source the environment variables defined in `.env` file.\n\n[apply-tls.sh](./scripts/apply-tls.sh) will probably be executed only once\n(if everything's ok in [Get Started](#get-started)).\n\n[renew-tls.sh](./scripts/renew-tls.sh) should be executed repeatedly before tls\ncerts expire (no more than 3 months). To reduce manual work, it's recommended to\nconfig `crontab` in the host OS:\n\n```sh\n# run the following command in the root path of this repo.\nsudo tee /etc/cron.d/minio-compose \u003c\u003c EOF\n# renew every 2 months (on the first day of the month).\n0 0 1 */2 * root cd $(pwd) \u0026\u0026 sh helper.sh renew\nEOF\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhisperpine%2Fminio-compose","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwhisperpine%2Fminio-compose","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhisperpine%2Fminio-compose/lists"}