Add HTTP upload server and serve command

This commit is contained in:
2026-06-03 15:22:52 +00:00
parent f0c10210eb
commit 6beef58dbf
12 changed files with 942 additions and 10 deletions

View File

@@ -2,15 +2,18 @@
## Config File Location
`distributor run --config <path>` loads the YAML config at the provided path.
`distributor run --config <path>` and `distributor serve --config <path>` load
the YAML config at the provided path.
If `--config` is omitted, `run` uses:
If `--config` is omitted, both commands use:
```text
/usr/local/etc/distributor/config.yml
```
Config parsing rejects unknown YAML fields. The executable `run` backends are `local`, `ssh`, and `s3`. The schema also accepts `http_upload` as a source-only ingestion backend configuration.
Config parsing rejects unknown YAML fields. The executable `run` backends are
`local`, `ssh`, and `s3`. The `serve` command executes `http_upload` sources
through the HTTP upload API and normal destination fan-out.
## Minimal Local Config
@@ -62,7 +65,9 @@ pipelines:
## HTTP Upload Source Configuration
HTTP upload sources are configured as pipeline sources only. They are not valid destination backends.
HTTP upload sources are configured as pipeline sources only. They are not valid
destination backends. `distributor serve` maps each configured upload token to
exactly one `http_upload` pipeline.
```yaml
server:
@@ -92,6 +97,50 @@ pipelines:
`source.max_upload_size` is optional. When omitted, it defaults to `server.http.max_upload_size`.
The server resolves each `token_env` through the real process environment and
the configured `secrets.directory` resolver. Startup fails if any configured
upload token is missing, empty, or resolves to the same value as another upload
pipeline. Token values are not read from YAML and are not printed in API
responses.
## HTTP Upload API
`distributor serve` binds to `server.http.bind`, which defaults to
`127.0.0.1:8080`.
Routes:
- `GET /healthz`: returns readiness status after config and upload tokens load.
- `POST /upload`: accepts one tar or tar.gz source bundle archive.
- `GET /runs/<run_id>`: returns an in-memory upload status record, or `404` if the run id is unknown or expired.
`POST /upload` authenticates with:
```text
Authorization: Bearer <token>
```
The token selects the configured `http_upload` pipeline. Producers do not send a
pipeline id. Requests with a submitted `pipeline` or `pipeline_id` query value
are rejected.
Accepted upload content types:
- `application/x-tar`
- `application/gzip`
- `application/x-gzip`
Accepted uploads return:
```json
{"run_id":"<id>","status":"accepted"}
```
The run id can be queried through `GET /runs/<run_id>` while the status record
is retained in memory. Completed records expire after `server.http.retention`;
expiration also removes committed staged bundle directories for completed
uploads.
## HTML Publication
To publish generated sidecar HTML from Markdown files: