{"id":51016576,"url":"https://github.com/octobercms/runtimes","last_synced_at":"2026-06-21T11:04:02.154Z","repository":{"id":364672173,"uuid":"1264797459","full_name":"octobercms/runtimes","owner":"octobercms","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-14T00:30:16.000Z","size":40,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T02:21:05.071Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","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/octobercms.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-10T07:30:59.000Z","updated_at":"2026-06-14T00:30:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/octobercms/runtimes","commit_stats":null,"previous_names":["octobercms/runtimes"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/octobercms/runtimes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/octobercms%2Fruntimes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/octobercms%2Fruntimes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/octobercms%2Fruntimes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/octobercms%2Fruntimes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/octobercms","download_url":"https://codeload.github.com/octobercms/runtimes/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/octobercms%2Fruntimes/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34607126,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2026-06-21T11:04:01.352Z","updated_at":"2026-06-21T11:04:02.149Z","avatar_url":"https://github.com/octobercms.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# October CMS Runtimes\n\nOfficial Docker runtime images for [October CMS](https://octobercms.com). These images provide a shared foundation for local development, GitHub Codespaces, and production deployments.\n\n## Images\n\nThe following images are published to GitHub Container Registry (GHCR) under the `octobercms` organization.\n\n| Image                                                                                | Purpose                                                  |\n| ------------------------------------------------------------------------------------ | -------------------------------------------------------- |\n| [`runtime-base`](https://github.com/octobercms/runtimes/pkgs/container/runtime-base) | Shared PHP foundation used by the other images           |\n| [`runtime-dev`](https://github.com/octobercms/runtimes/pkgs/container/runtime-dev)   | Development environments, dev containers, and Codespaces |\n| [`runtime-prod`](https://github.com/octobercms/runtimes/pkgs/container/runtime-prod) | Production deployments                                   |\n\n### Base (`runtime-base`)\n\nThe base image is the shared layer for all runtimes. It is not intended to be run directly.\n\n- PHP 8.5 FPM\n- Composer 2\n- Extensions required by October CMS\n- Working directory: `/var/www/html`\n\nNginx and Supervisor are intentionally excluded so future worker or scheduler runtimes can reuse the same base.\n\n### Dev (`runtime-dev`)\n\nExtends the base image for local and cloud development.\n\n- PostgreSQL and SQLite drivers\n- Nginx with the October CMS 4.x routing configuration\n- Basic shell tooling (`bash`, `less`)\n\n### Prod (`runtime-prod`)\n\nExtends the base image for production use.\n\n- Nginx with the October CMS 4.x routing configuration\n- PHP-FPM production settings\n- Supervisor managing Nginx and PHP-FPM\n- Entrypoint that prepares October storage directories\n- `/_health` endpoint for container health checks\n\n## Usage\n\nPull a published image:\n\n```bash\ndocker pull ghcr.io/octobercms/runtime-dev:php85\ndocker pull ghcr.io/octobercms/runtime-prod:php85\n```\n\nUse the prod image as a base in an application Dockerfile:\n\n```dockerfile\nFROM ghcr.io/octobercms/runtime-prod:php85\n\nCOPY . /var/www/html\nRUN composer install --no-dev --optimize-autoloader\n```\n\nMount your October CMS project at `/var/www/html`. The web root is the project root, matching October's expected layout.\n\n## Tags\n\nEach publish pushes several tags per image:\n\n| Tag                         | Example                                 | Notes                                      |\n| --------------------------- | --------------------------------------- | ------------------------------------------ |\n| `php85`                     | `runtime-prod:php85`                    | Moving tag for the current PHP 8.5 runtime |\n| `latest`                    | `runtime-prod:latest`                   | Moving tag for the latest publish          |\n| `php85-YYYY.MM.DD`          | `runtime-prod:php85-2026.06.11`         | Date pin (UTC)                             |\n| `php85-YYYY.MM.DD-SHORTSHA` | `runtime-prod:php85-2026.06.11-abc1234` | Immutable pin per build                    |\n| `php85-X.Y.Z`               | `runtime-prod:php85-1.0.0`              | Version pin from a release or `v*` tag     |\n| `X.Y.Z`                     | `runtime-prod:1.0.0`                    | Version pin from a release or `v*` tag     |\n\nFor production, prefer an immutable tag such as a date-SHA or semver tag rather than `php85` or `latest`.\n\n## Local builds\n\nBuild the base image first, then build dev or prod against it:\n\n```bash\ndocker build -t runtime-base:local -f images/base/Dockerfile .\n\ndocker build -t runtime-dev:local \\\n  --build-arg BASE_IMAGE=runtime-base:local \\\n  -f images/dev/Dockerfile .\n\ndocker build -t runtime-prod:local \\\n  --build-arg BASE_IMAGE=runtime-base:local \\\n  -f images/prod/Dockerfile .\n```\n\nRun the prod image locally:\n\n```bash\ndocker run --rm -p 8080:80 runtime-prod:local\ncurl http://localhost:8080/_health\n```\n\n## Project structure\n\n```\n.github/workflows/\n├── ci.yml                   # Build and smoke test all images\n└── publish.yml              # Publish images to GHCR\n\nconfig/\n├── nginx/default.conf       # October CMS Nginx configuration\n├── php/runtime.ini          # Production PHP settings\n├── php-fpm/zz-runtime.conf  # PHP-FPM pool settings\n└── supervisor/supervisord.conf\n\nimages/\n├── base/Dockerfile          # Shared PHP foundation\n├── dev/Dockerfile           # Development runtime\n└── prod/Dockerfile          # Production runtime\n\nscripts/\n├── entrypoint.sh                 # Prepares storage directories on startup\n├── healthcheck.sh                # Checks /_health from inside the container\n└── devcontainer-smoke-test.sh    # Installs October CMS and verifies /_health and / return HTTP 200\n\n.devcontainer/\n├── devcontainer.json             # Dev container configuration\n├── Dockerfile                    # Dev runtime wrapper for Codespaces\n├── post-create.sh                # Installs October CMS into /var/www/html\n├── post-start.sh                 # Starts PHP-FPM and Nginx\n└── configure-app-url.sh          # Sets APP_URL and LINK_POLICY for dev/Codespaces\n```\n\nOpening this repository in a dev container clones [octobercms/october](https://github.com/octobercms/october) into `/var/www/html` during `postCreateCommand`, then starts the web stack on port 80 during `postStartCommand`.\n\nThe devcontainer smoke test uses the same install flow and verifies `/` and `/_health` both return HTTP 200.\n\n## CI and publishing\n\n**CI** runs on every push and pull request. It builds all three images and runs smoke tests for PHP, extensions, Nginx configuration, the prod `/_health` endpoint, and a devcontainer flow that installs October CMS and verifies the homepage responds.\n\n**Publish** pushes images to GHCR when:\n\n- Changes are pushed to `main`\n- A GitHub Release is published\n- A git tag matching `v*` is pushed\n- The workflow is triggered manually from the Actions tab\n\nImages are published as public packages on GHCR and can be pulled without authentication.\n\n## Health checks\n\nThe prod image exposes a static health endpoint that does not hit PHP:\n\n```\nGET /_health → 200 ok\n```\n\nThis is used by the Docker `HEALTHCHECK` instruction and by `scripts/healthcheck.sh`.\n\n## License\n\n[MIT](https://github.com/octobercms/runtimes/blob/main/LICENSE)\n\nCopyright (c) 2026-present, October CMS.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foctobercms%2Fruntimes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foctobercms%2Fruntimes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foctobercms%2Fruntimes/lists"}