diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 400b87c..9d74469 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -36,4 +36,7 @@ jobs: - name: Start services run: | cd "${{ vars.PROD_APP_DIR }}" + docker compose up -d minio + docker compose rm -sf minio_init + docker compose run --rm minio_init docker compose up -d diff --git a/Makefile b/Makefile index 36f9231..214e000 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,8 @@ help: @echo "Available commands:" - @echo " make start - Start services without building (uses existing images)" - @echo " make start-build - Start services and build images if needed" + @echo " make start - Start services and initialize MinIO (uses existing images)" + @echo " make start-build - Build, start services, and initialize MinIO" @echo " make stop - Stop running services" @echo " make build - Build Docker images only" @echo " make down - Stop and remove containers/networks" @@ -19,11 +19,17 @@ help: @echo " make test - Run PHPUnit tests" start: + docker compose up -d minio + docker compose rm -sf minio_init + docker compose run --rm minio_init docker compose up -d start-build: composer i bun run build + docker compose up -d --build minio + docker compose rm -sf minio_init + docker compose run --rm minio_init docker compose up -d --build stop: diff --git a/compose.yaml b/compose.yaml index 867d4e1..8d18ea1 100644 --- a/compose.yaml +++ b/compose.yaml @@ -107,6 +107,7 @@ services: start_period: 10s minio_init: image: minio/minio:RELEASE.2025-09-07T16-13-09Z-cpuv1 + profiles: ['bootstrap'] restart: "no" container_name: '${APP_NAME}-minio-init' depends_on: diff --git a/docker/minio-init.sh b/docker/minio-init.sh index 5ac7278..d390e64 100755 --- a/docker/minio-init.sh +++ b/docker/minio-init.sh @@ -1,8 +1,12 @@ #!/bin/sh set -e -echo "[minio-init] Configuring alias..." -mc alias set local http://minio:9000 "$MINIO_ROOT_USER" "$MINIO_ROOT_PASSWORD" +echo "[minio-init] Waiting for MinIO..." +until mc alias set local http://minio:9000 "$MINIO_ROOT_USER" "$MINIO_ROOT_PASSWORD" > /dev/null 2>&1; do + sleep 2 +done + +echo "[minio-init] Configuring bucket..." if mc ls local/mineseeker > /dev/null 2>&1; then echo "[minio-init] Already initialized, skipping." diff --git a/docs/MINIO_INITIALIZATION.md b/docs/MINIO_INITIALIZATION.md new file mode 100644 index 0000000..d6372e4 --- /dev/null +++ b/docs/MINIO_INITIALIZATION.md @@ -0,0 +1,19 @@ +# MinIO Initialization + +The `minio_init` Compose service creates the `mineseeker` bucket and applies +its public read policy. It is an idempotent bootstrap task: after the bucket +exists, it exits without changing it. + +It belongs to the `bootstrap` Compose profile, so normal `docker compose up` +does not create a stopped `mineseeker-minio-init` container. + +`make start`, `make start-build`, and the production deployment workflow run +the bootstrap task automatically with `docker compose run --rm minio_init`. +They also remove any stopped legacy initializer container first. The temporary +container is removed as soon as the task succeeds. + +To run it manually when needed: + +```bash +docker compose run --rm minio_init +``` diff --git a/docs/README.md b/docs/README.md index 872c079..e15c449 100644 --- a/docs/README.md +++ b/docs/README.md @@ -60,6 +60,9 @@ Quick command reference for testing: ### [Scheduled Tasks](./SCHEDULER.md) Symfony Scheduler tasks and the Docker worker that runs them. +### [MinIO Initialization](./MINIO_INITIALIZATION.md) +Automatic, one-shot setup of the MinIO bucket and its access policy. + ### [CI/CD Integration Guide](./CI_CD.md) Comprehensive guide for continuous integration and deployment: - Gitea Actions workflows (CI and CD pipelines)