Nginx compiled from source with HTTP/3, brotli and zstd — every directive set by environment variable, with optional ACME, OpenTelemetry and security-header modules.
  • Dockerfile 48%
  • Shell 32.3%
  • Jinja 17.4%
  • CSS 0.9%
  • HTML 0.9%
  • Other 0.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Damián Búho 82407a0477
All checks were successful
published / release-tag (push) Successful in 4s
published / runner-is-ready (push) Successful in 9s
published / signing-is-ready (push) Successful in 16s
published / projectfile-is-valid (push) Successful in 7s
published / source-is-compliant (push) Successful in 13s
published / source-is-secure (push) Successful in 36s
published / documentation-passes-lint (push) Successful in 1m16s
published / source-passes-lint (push) Successful in 1m15s
published / projectfile-is-ok (push) Successful in 10s
published / image-is-built (amd64) (push) Successful in 12m7s
published / image-has-sbom (amd64) (push) Has been skipped
published / image-is-seeded (amd64) (push) Has been skipped
published / container-is-verified (amd64) (push) Successful in 2m0s
published / image-is-secure (amd64) (push) Successful in 3m37s
published / image-is-published (dockerhub) (push) Successful in 6s
published / image-is-published (kiota) (push) Successful in 17s
published / release-is-published (push) Has been skipped
published / release-notes-are-published (push) Has been skipped
published / published (push) Successful in 0s
build(workflows): regenerate
2026-10-25 23:25:02 -03:00
.compose docs(readme): declare the nginx service and a runnable example compose 2026-09-30 05:07:38 -03:00
.container fix(log): print nginx -t output through b19-log, only on failure 2026-10-25 22:19:04 -03:00
.forgejo/workflows build(workflows): regenerate 2026-10-25 23:25:02 -03:00
.github/workflows build(workflows): regenerate 2026-10-25 23:25:02 -03:00
.makefile chore(makefile): sync m6e submodules 2026-10-25 16:55:57 -03:00
docs chore(docs): regen features 2026-10-25 16:57:24 -03:00
LICENSES chore: init 2026-08-15 14:06:11 -03:00
scaffold build(docker): own the download cache as the build user 2026-10-10 04:23:13 -03:00
.claudeignore chore: sorting for claudeignore 2026-09-13 12:49:16 -03:00
.containerignore build: ignore .worktrees (oci/docker) 2026-09-29 23:59:38 -03:00
.dockerignore build: ignore .worktrees (oci/docker) 2026-09-29 23:59:38 -03:00
.gitattributes chore: clean j2 from attributes 2026-09-14 00:36:51 -03:00
.gitignore build: ignore .worktrees 2026-09-29 23:56:36 -03:00
.gitmodules build: hard .gitmodules before big refactoring of m6e 2026-09-02 18:40:16 -03:00
.yamllint chore(ignore): cleanup ignores 2026-09-18 00:38:58 -03:00
AGENTS.md fix(log): print nginx -t output through b19-log, only on failure 2026-10-25 22:19:04 -03:00
AI_POLICY.md chore(docs): prevent user data from triggering textlint 2026-08-19 23:24:00 -03:00
CITATION.cff chore(version): 0.22.1 2026-10-25 22:50:34 -03:00
CLAUDE.md chore: init 2026-08-15 14:06:11 -03:00
CODE_OF_CONDUCT.md docs: cleanup code of conduct 2026-08-18 02:17:58 -03:00
CODEOWNERS chore: init 2026-08-15 14:06:11 -03:00
CONTRIBUTING.md chore: regenerate contributing 2026-09-30 06:40:17 -03:00
Dockerfile feat(logs): tag the payload nginx and label its log formats 2026-10-25 20:48:58 -03:00
lefthook.yaml chore: regenerate lefthook.yaml 2026-09-29 22:29:05 -03:00
LICENSE chore: init 2026-08-15 14:06:11 -03:00
Makefile chore: init 2026-08-15 14:06:11 -03:00
projectfile.yaml chore(version): 0.22.1 2026-10-25 22:50:34 -03:00
README.md fix: refactor CI workflows (new goals + preflight checks) 2026-10-18 17:18:27 -03:00
SECURITY.md docs: clean up security.md (temporarily disable how to link) 2026-08-18 01:37:37 -03:00
SUPPORT.md feat(forge): declare and publish to GitHub 2026-09-22 23:56:03 -03:00

Español · Українська

O9S / Nginx

Nginx compiled from source with HTTP/3, brotli and zstd — every directive set by environment variable, with optional ACME, OpenTelemetry and security-header modules.

Stand with Ukraine Projectfile inside License Cosign ClamAV scanned PRs welcome REUSE compliance

Project status Last commit on GitHub Last commit on kiota.ch

Publish pipeline on GitHub Vulnerability audit on GitHub Dependency freshness on GitHub Analysis sweep on GitHub

Publish pipeline on kiota.ch Vulnerability audit on kiota.ch Dependency freshness on kiota.ch Analysis sweep on kiota.ch

Features

  • Built-in ACME certificate automation
  • CDN-aware real client IP
  • Brotli, zstd and gzip compression
  • Configuration through environment variables only
  • robots.txt with AI Content Signals
  • Base for nginx-based images
  • Localized, self-contained error pages
  • HTTP/3 (QUIC)
  • Live config reload
  • Correct content types and caching
  • OpenTelemetry tracing and JSON access logs
  • Automatic resource hints
  • Security headers
  • Config validation and nginx-aware healthchecks
  • Ready-made serving modes
  • Static asset pre-compression
  • Hardened TLS defaults

It also inherits the features of B19 / Ubuntu — see Features for the full list.

Quick Start

Save this as compose.yaml:

---
services:
  nginx:
    image: docker.io/damianbuho/o9s-nginx:latest
    ports:
      - "8080:8080"
    cap_drop: [ALL]
    security_opt: [no-new-privileges:true]
    restart: unless-stopped

Then start it with docker compose up --detach.

What this provides

  • Container image ghcr.io/damian-buho/o9s/nginx:latest
  • Container image damianbuho/o9s-nginx:latest
  • Service nginx — listens on 8080 (http) — nginx web server

Installation

Pull the published container image:

Pull from GHCR — linux/amd64, linux/arm64

docker pull ghcr.io/damian-buho/o9s/nginx:latest

Pull from DockerHub — linux/amd64

docker pull damianbuho/o9s-nginx:latest

Stable releases also publish X.Y.Z, X.Y and X tags — pull the precision you want to pin.

If the registries above are unreachable, pull from the origin instead:

Pull from Kiota — linux/amd64

docker pull kiota.ch/o9s/nginx:latest

Usage

Run the service in the background, publishing its ports:

From GHCR

docker run --detach --publish 8080:8080/tcp ghcr.io/damian-buho/o9s/nginx:latest

From DockerHub

docker run --detach --publish 8080:8080/tcp damianbuho/o9s-nginx:latest

Then check that it answers:

curl http://localhost:8080/

Building

Clone the repository with its submodules:

git clone --recurse-submodules https://github.com/damian-buho/o9s-nginx nginx && cd nginx

Build the container image locally:

make container-build

Run make with no arguments for the default target; run make help to list every target.

For the local dev loop, make dev-container brings up the dev-container.

Pipeline entry points:

  • make analyzed — Run the heavy analysis sweep (mutation testing, benchmarks)
  • make audited — Re-scan the pinned dependencies and published artifacts for new vulnerabilities
  • make check-outdated — Report every pinned dependency that lags upstream
  • make release-is-ready — Run the pseudo-CI pipeline locally — build, test and scan, without publishing

Roadmap

See the Roadmap for what is planned next.

Policies

License

This project is licensed under MIT — see the LICENSE file for details.