diff --git a/.github/goreleaser.yml b/.github/goreleaser.yml new file mode 100644 index 000000000..ebeec1d19 --- /dev/null +++ b/.github/goreleaser.yml @@ -0,0 +1,106 @@ +version: 2 + +env: + - CGO_ENABLED=0 + +builds: + - id: minio + main: . + binary: minio + goos: + - linux + - darwin + - windows + goarch: + - amd64 + - arm64 + goamd64: + - v1 + flags: + - -tags=kqueue + - -trimpath + ldflags: + - "{{ .Env.LDFLAGS }}" + +archives: + - id: minio + ids: + - minio + name_template: "minio_{{ .Env.PKG_VERSION }}_{{ .Os }}_{{ .Arch }}" + +dockers: + - id: minio-amd64 + ids: + - minio + goos: linux + goarch: amd64 + dockerfile: Dockerfile.goreleaser + use: buildx + image_templates: + - "pgsty/minio:{{ .Tag }}-amd64" + - "pgsty/minio:latest-amd64" + build_flag_templates: + - "--platform=linux/amd64" + - "--label=org.opencontainers.image.version={{ .Tag }}" + - "--label=org.opencontainers.image.created={{ .Date }}" + - "--label=org.opencontainers.image.revision={{ .FullCommit }}" + extra_files: + - dockerscripts/docker-entrypoint.sh + - LICENSE + - CREDITS + + - id: minio-arm64 + ids: + - minio + goos: linux + goarch: arm64 + dockerfile: Dockerfile.goreleaser + use: buildx + image_templates: + - "pgsty/minio:{{ .Tag }}-arm64" + - "pgsty/minio:latest-arm64" + build_flag_templates: + - "--platform=linux/arm64" + - "--label=org.opencontainers.image.version={{ .Tag }}" + - "--label=org.opencontainers.image.created={{ .Date }}" + - "--label=org.opencontainers.image.revision={{ .FullCommit }}" + extra_files: + - dockerscripts/docker-entrypoint.sh + - LICENSE + - CREDITS + +docker_manifests: + - name_template: "pgsty/minio:{{ .Tag }}" + image_templates: + - "pgsty/minio:{{ .Tag }}-amd64" + - "pgsty/minio:{{ .Tag }}-arm64" + - name_template: "pgsty/minio:latest" + image_templates: + - "pgsty/minio:latest-amd64" + - "pgsty/minio:latest-arm64" + +checksum: + name_template: "minio_{{ .Env.PKG_VERSION }}_checksums.txt" + algorithm: sha256 + +release: + github: + owner: pgsty + name: minio + draft: false + prerelease: false + mode: replace + replace_existing_artifacts: true + name_template: "{{ .Tag }}" + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + - "Merge pull request" + - "Merge branch" + +announce: + skip: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..cd6c5eea6 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,136 @@ +name: Release + +on: + push: + tags: + - "RELEASE.*" + +permissions: + contents: write + packages: write + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + - name: Compute release variables + run: | + set -euo pipefail + TAG="${GITHUB_REF_NAME}" + VERSION_HYPHEN="${TAG#RELEASE.}" + PKG_VERSION="$(echo "${VERSION_HYPHEN}" | sed -E 's/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2})-([0-9]{2})-([0-9]{2})Z$/\1\2\3\4\5\6.0.0/')" + if [ "${PKG_VERSION}" = "${VERSION_HYPHEN}" ]; then + echo "Invalid release tag format: ${TAG}" + exit 1 + fi + VERSION_COLON="$(echo "${VERSION_HYPHEN}" | sed -E 's/T([0-9]{2})-([0-9]{2})-([0-9]{2})Z$/T\1:\2:\3Z/')" + LDFLAGS="$(MINIO_RELEASE=RELEASE go run buildscripts/gen-ldflags.go "${VERSION_COLON}")" + + { + echo "RELEASE_TAG=${TAG}" + echo "PKG_VERSION=${PKG_VERSION}" + echo "LDFLAGS=${LDFLAGS}" + } >> "${GITHUB_ENV}" + + echo "Release tag: ${TAG}" + echo "Package version: ${PKG_VERSION}" + echo "LDFLAGS: ${LDFLAGS}" + + - name: Validate Docker Hub credentials + run: | + set -euo pipefail + if [ -z "${{ secrets.DOCKERHUB_USERNAME }}" ] || [ -z "${{ secrets.DOCKERHUB_TOKEN }}" ]; then + echo "Missing Docker Hub credentials. Set DOCKERHUB_USERNAME and DOCKERHUB_TOKEN repository secrets." + exit 1 + fi + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: arm64 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and publish with GoReleaser + uses: goreleaser/goreleaser-action@v6 + with: + version: "~> v2" + args: release --clean --skip=validate --config .github/goreleaser.yml + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + LDFLAGS: ${{ env.LDFLAGS }} + PKG_VERSION: ${{ env.PKG_VERSION }} + + - name: Install pkger + run: | + go install github.com/minio/pkger/v2@v2.6.18 + echo "$(go env GOPATH)/bin" >> "${GITHUB_PATH}" + + - name: Prepare package layout + run: | + set -euo pipefail + copy_binary() { + local arch="$1" + local pattern="$2" + local src + src="$(find dist -maxdepth 2 -type f -path "dist/${pattern}/minio" | head -n1 || true)" + if [ -z "${src}" ]; then + echo "Missing GoReleaser binary for ${arch} (${pattern})" + exit 1 + fi + mkdir -p "dist/linux-${arch}" + cp "${src}" "dist/linux-${arch}/minio.${RELEASE_TAG}" + } + + copy_binary amd64 "minio_linux_amd64*" + copy_binary arm64 "minio_linux_arm64*" + + - name: Build standard pkger packages + run: | + set -euo pipefail + pkger -r "${RELEASE_TAG}" --appName minio --releaseDir dist --ignore + + # Keep only full package files; drop convenience symlinks (minio.rpm/minio.deb/minio.apk) + find dist/linux-* -maxdepth 1 -type l \ + \( -name 'minio.rpm' -o -name 'minio.deb' -o -name 'minio.apk' \) -delete + + find dist -maxdepth 2 -type f \ + \( -name '*.rpm' -o -name '*.deb' -o -name '*.apk' -o -name '*.sha256sum' -o -name 'downloads-minio.json' \) | sort + + - name: Upload pkger artifacts to GitHub release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -euo pipefail + mapfile -t files < <(find dist -maxdepth 2 -type f \ + \( -name '*.rpm' -o -name '*.deb' -o -name '*.apk' -o -name '*.sha256sum' -o -name 'downloads-minio.json' \) | sort) + if [ "${#files[@]}" -eq 0 ]; then + echo "No packages were generated." + exit 1 + fi + gh release upload "${RELEASE_TAG}" "${files[@]}" --clobber + + - name: Upload dist artifact + if: always() + uses: actions/upload-artifact@v4 + with: + name: dist + path: dist/ diff --git a/.github/workflows/test-release.yml b/.github/workflows/test-release.yml new file mode 100644 index 000000000..fcc6aa101 --- /dev/null +++ b/.github/workflows/test-release.yml @@ -0,0 +1,89 @@ +name: Test Release Pipeline + +on: + workflow_dispatch: + pull_request: + paths: + - ".github/goreleaser.yml" + - "Dockerfile.goreleaser" + - "minio.service" + - ".github/workflows/release.yml" + - ".github/workflows/test-release.yml" + +permissions: + contents: read + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + - name: Compute test variables + run: | + set -euo pipefail + RELEASE_TAG="RELEASE.2026-02-14T12-00-00Z" + VERSION_COLON="2026-02-14T12:00:00Z" + PKG_VERSION="20260214120000.0.0" + LDFLAGS="$(MINIO_RELEASE=RELEASE go run buildscripts/gen-ldflags.go "${VERSION_COLON}")" + echo "RELEASE_TAG=${RELEASE_TAG}" >> "${GITHUB_ENV}" + echo "PKG_VERSION=${PKG_VERSION}" >> "${GITHUB_ENV}" + echo "LDFLAGS=${LDFLAGS}" >> "${GITHUB_ENV}" + echo "PKG_VERSION: ${PKG_VERSION}" + echo "LDFLAGS: ${LDFLAGS}" + + - name: GoReleaser config check + uses: goreleaser/goreleaser-action@v6 + with: + version: "~> v2" + args: check --config .github/goreleaser.yml + + - name: Build snapshot artifacts + uses: goreleaser/goreleaser-action@v6 + with: + version: "~> v2" + args: release --snapshot --clean --skip=publish,docker --config .github/goreleaser.yml + env: + LDFLAGS: ${{ env.LDFLAGS }} + PKG_VERSION: ${{ env.PKG_VERSION }} + + - name: Install pkger + run: | + go install github.com/minio/pkger/v2@v2.6.18 + echo "$(go env GOPATH)/bin" >> "${GITHUB_PATH}" + + - name: Package snapshot binaries with pkger + run: | + set -euo pipefail + copy_binary() { + local arch="$1" + local pattern="$2" + local src + src="$(find dist -maxdepth 2 -type f -path "dist/${pattern}/minio" | head -n1 || true)" + if [ -z "${src}" ]; then + echo "Missing GoReleaser binary for ${arch} (${pattern})" + exit 1 + fi + mkdir -p "dist/linux-${arch}" + cp "${src}" "dist/linux-${arch}/minio.${RELEASE_TAG}" + } + + copy_binary amd64 "minio_linux_amd64*" + copy_binary arm64 "minio_linux_arm64*" + pkger -r "${RELEASE_TAG}" --appName minio --releaseDir dist --ignore + + # Keep only full package files; drop convenience symlinks (minio.rpm/minio.deb/minio.apk) + find dist/linux-* -maxdepth 1 -type l \ + \( -name 'minio.rpm' -o -name 'minio.deb' -o -name 'minio.apk' \) -delete + + find dist -maxdepth 2 -type f \ + \( -name '*.rpm' -o -name '*.deb' -o -name '*.apk' -o -name '*.sha256sum' -o -name 'downloads-minio.json' \) | sort diff --git a/Dockerfile.goreleaser b/Dockerfile.goreleaser new file mode 100644 index 000000000..4273b1189 --- /dev/null +++ b/Dockerfile.goreleaser @@ -0,0 +1,34 @@ +FROM registry.access.redhat.com/ubi9/ubi:latest AS certs +RUN dnf -y install ca-certificates && \ + update-ca-trust && \ + cp /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /tmp/ca-certificates.crt && \ + dnf clean all && \ + rm -rf /var/cache/dnf + +FROM registry.access.redhat.com/ubi9/ubi-micro:latest + +LABEL maintainer="pgsty " \ + description="MinIO community fork, build by pgsty" + +ENV MINIO_ACCESS_KEY_FILE=access_key \ + MINIO_SECRET_KEY_FILE=secret_key \ + MINIO_ROOT_USER_FILE=access_key \ + MINIO_ROOT_PASSWORD_FILE=secret_key \ + MINIO_KMS_SECRET_KEY_FILE=kms_master_key \ + MINIO_UPDATE_MINISIGN_PUBKEY="RWTx5Zr1tiHQLwG9keckT0c45M3AGeHD6IvimQHpyRywVWGbP1aVSGav" \ + MINIO_CONFIG_ENV_FILE=config.env \ + MC_CONFIG_DIR=/tmp/.mc + +COPY --from=certs /tmp/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt +COPY minio /usr/bin/minio +COPY dockerscripts/docker-entrypoint.sh /usr/bin/docker-entrypoint.sh +COPY LICENSE /licenses/LICENSE +COPY CREDITS /licenses/CREDITS + +RUN chmod +x /usr/bin/minio /usr/bin/docker-entrypoint.sh + +EXPOSE 9000 +VOLUME ["/data"] + +ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"] +CMD ["minio"] diff --git a/README.md b/README.md index 37240d9df..262691c9a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ > [!IMPORTANT] > **This is a community-maintained fork of [minio/minio](https://github.com/minio/minio), maintained by [Pigsty](https://pigsty.io).** -> This project is **not** affiliated with, endorsed by, or sponsored by MinIO, Inc. +> This project is **NOT** affiliated with, endorsed by, or sponsored by MinIO, Inc. > "MinIO" is a trademark of MinIO, Inc., used here solely to identify the upstream project. > > Changes from upstream are minimal: @@ -9,122 +9,12 @@ > > Distributed under the original [GNU AGPLv3](LICENSE) license. -# MinIO Quickstart Guide +Documentation mirror: [https://silo.pigsty.io](https://silo.pigsty.io) -[![Website: minio.pigsty.io](https://img.shields.io/badge/website-minio.pigsty.io-slategray?style=flat&logo=cilium&logoColor=white)](https://pigsty.io) [![Slack](https://slack.min.io/slack?type=svg)](https://slack.min.io) [![license](https://img.shields.io/badge/license-AGPL%20V3-blue)](https://github.com/pgsty/minio/blob/master/LICENSE) +Docker Hub mirror: [https://hub.docker.com/r/pgsty/minio](https://hub.docker.com/r/pgsty/minio) `pgsty/minio` -MinIO is a high-performance, S3-compatible object storage solution released under the GNU AGPL v3.0 license. -Designed for speed and scalability, it powers AI/ML, analytics, and data-intensive workloads with industry-leading performance. +Work with the original upstream [mc](https://github.com/minio/mc) CLI. -- S3 API Compatible – Seamless integration with existing S3 tools -- Built for AI & Analytics – Optimized for large-scale data pipelines -- High Performance – Ideal for demanding storage workloads. +APT/YUM repo for `minio` and `mcli` binary: [https://pigsty.io/docs/infra](https://pigsty.io/docs/repo/infra/list/#object-storage) -This README provides instructions for building MinIO from source and deploying onto baremetal hardware. -Use the [MinIO Documentation](https://github.com/minio/docs) project to build and host a local copy of the documentation. - -## Install from Source - -Use the following commands to compile and run a standalone MinIO server from source. -If you do not have a working Golang environment, please follow [How to install Golang](https://golang.org/doc/install). Minimum version required is [go1.24](https://golang.org/dl/#stable) - -```sh -go install github.com/pgsty/minio@latest -``` - -You can alternatively run `go build` and use the `GOOS` and `GOARCH` environment variables to control the OS and architecture target. -For example: - -``` -env GOOS=linux GOARCH=arm64 go build -``` - -Start MinIO by running `minio server PATH` where `PATH` is any empty folder on your local filesystem. - -The MinIO deployment starts using default root credentials `minioadmin:minioadmin`. -You can test the deployment using the MinIO Console, an embedded web-based object browser built into MinIO Server. -Point a web browser running on the host machine to and log in with the root credentials. -You can use the Browser to create buckets, upload objects, and browse the contents of the MinIO server. - -You can also connect using any S3-compatible tool, such as the MinIO Client `mc` commandline tool: - -```sh -mc alias set local http://localhost:9000 minioadmin minioadmin -mc admin info local -``` - -See [Test using MinIO Client `mc`](#test-using-minio-client-mc) for more information on using the `mc` commandline tool. -For application developers, see to view MinIO SDKs for supported languages. - -## Build Docker Image - -You can use the `docker build .` command to build a Docker image on your local host machine. -You must first [build MinIO](#install-from-source) and ensure the `minio` binary exists in the project root. - -The following command builds the Docker image using the default `Dockerfile` in the root project directory with the repository and image tag `myminio:minio` - -```sh -docker build -t myminio:minio . -``` - -Use `docker image ls` to confirm the image exists in your local repository. -You can run the server using standard Docker invocation: - -```sh -docker run -p 9000:9000 -p 9001:9001 myminio:minio server /tmp/minio --console-address :9001 -``` - -Complete documentation for building Docker containers, managing custom images, or loading images into orchestration platforms is out of scope for this documentation. -You can modify the `Dockerfile` and `dockerscripts/docker-entrypoint.sh` as-needed to reflect your specific image requirements. - -## Install using Helm Charts - -There are two paths for installing MinIO onto Kubernetes infrastructure: - -- Use the [MinIO Operator](https://github.com/minio/operator) -- Use the community-maintained [Helm charts](https://github.com/pgsty/minio/tree/master/helm/minio) - -The Community Helm chart has instructions in the folder-level README. - -## Test MinIO Connectivity - -### Test using MinIO Console - -MinIO Server comes with an embedded web based object browser. -Point your web browser to to ensure your server has started successfully. - -> [!NOTE] -> MinIO runs console on random port by default, if you wish to choose a specific port use `--console-address` to pick a specific interface and port. - -### Test using MinIO Client `mc` - -`mc` provides a modern alternative to UNIX commands like ls, cat, cp, mirror, diff etc. It supports filesystems and Amazon S3 compatible cloud storage services. - -The following commands set a local alias, validate the server information, create a bucket, copy data to that bucket, and list the contents of the bucket. - -```sh -mc alias set local http://localhost:9000 minioadmin minioadmin -mc admin info -mc mb data -mc cp ~/Downloads/mydata data/ -mc ls data/ -``` - -Follow the MinIO Client [Quickstart Guide](https://min.io/docs/minio/linux/reference/minio-mc.html#quickstart) for further instructions. - -## Explore Further - -- [MinIO Erasure Code Overview](https://min.io/docs/minio/linux/operations/concepts/erasure-coding.html) -- [Use `mc` with MinIO Server](https://min.io/docs/minio/linux/reference/minio-mc.html) -- [Use `minio-go` SDK with MinIO Server](https://min.io/docs/minio/linux/developers/go/minio-go.html) -- [MinIO V3 Metrics Reference](docs/metrics/v3.md) - -## Contribute - -Please follow MinIO [Contributor's Guide](https://github.com/minio/minio/blob/master/CONTRIBUTING.md) for guidance on making new contributions to the repository. - -## License - -- MinIO source is licensed under the [GNU AGPLv3](LICENSE). -- MinIO [documentation](docs/) is licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). -- [License Compliance](COMPLIANCE.md) +[![Website: silo.pigsty.io](https://img.shields.io/badge/website-silo.pigsty.io-slategray?style=flat&logo=cilium&logoColor=white)](https://silo.pigsty.io) [![license](https://img.shields.io/badge/license-AGPL%20V3-blue)](https://github.com/pgsty/minio/blob/master/LICENSE) diff --git a/minio.service b/minio.service new file mode 100644 index 000000000..34f8ca662 --- /dev/null +++ b/minio.service @@ -0,0 +1,43 @@ +[Unit] +Description=MinIO +Documentation=https://docs.min.io +Wants=network-online.target +After=network-online.target +AssertFileIsExecutable=/usr/local/bin/minio + +[Service] +Type=notify + +WorkingDirectory=/usr/local + +User=minio-user +Group=minio-user +ProtectProc=invisible + +EnvironmentFile=-/etc/default/minio +ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES + +# Let systemd restart this service always +Restart=always + +# Specifies the maximum file descriptor number that can be opened by this process +LimitNOFILE=1048576 + +# Turn-off memory accounting by systemd, which is buggy. +MemoryAccounting=no + +# Specifies the maximum number of threads this process can create +TasksMax=infinity + +# Disable timeout logic and wait until process is stopped +TimeoutSec=infinity + +# Disable killing of MinIO by the kernel's OOM killer +OOMScoreAdjust=-1000 + +SendSIGKILL=no + +[Install] +WantedBy=multi-user.target + +# Built for ${project.name}-${project.version} (${project.name})