Files
buzz/deploy/charts/buzz-push-gateway/values.schema.json
Tom Brow 76f7e5ef0c feat(push): make gateway origin configurable (#7261)
Make the push gateway origin configurable across the relay, gateway,
mobile client, and deployment chart.

This is a fresh deployment. The gateway has only run on personal
development infrastructure, and push has no existing enabled users.
Legacy migration, configured-to-unconfigured mobile transitions, and
rolling upgrades from pre-launch gateway binaries are not supported.

Populated pre-launch databases are rejected with an informative error
before migrations run; their data is untouched. Mobile builds may omit
the gateway URL, leaving push unavailable. Once push is enabled,
subsequent builds must retain that configuration.

### Validation

- All applicable CI checks pass at
`5f546cfaf403f0386f146d213adfb4392f4ec29c`, including Rust,
mobile/Swift, desktop/integration, security, image builds, and Helm
checks. An unrelated agent cancellation test passed on retry.
- PostgreSQL CI passed 384 tests, including the production-entry-point
regression for refusing populated pre-launch databases before
migrations, fresh initialization, and subsequent initialized
deployments.
- Focused local validation passed all 10 gateway PostgreSQL tests under
the CI discovery filter and all 3 unconfigured-mobile tests.
Repository-wide PostgreSQL discovery validation and the complete
pre-push hooks passed.
- Physical-device APNs/App Attest behavior and deployment to a live
cluster were not verified in this work.

---------

Signed-off-by: Tom Brow <tomb@block.xyz>
Co-authored-by: Codex <noreply@openai.com>
2026-09-15 14:56:45 -07:00

363 lines
7.3 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"additionalProperties": true,
"properties": {
"replicaCount": {
"type": "integer",
"minimum": 2
},
"existingSecret": {
"type": "string",
"minLength": 1
},
"gatewayOrigin": {
"type": "string",
"format": "uri",
"pattern": "^https://[^/?#@:]+/?$"
},
"maxGrantLifetimeSeconds": {
"type": "integer",
"minimum": 1,
"maximum": 31536000
},
"profiles": {
"type": "object",
"additionalProperties": false,
"required": [
"dogfood"
],
"properties": {
"dogfood": {
"$ref": "#/$defs/enabledProfile"
}
}
},
"apnsKey": false,
"podAnnotations": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"httpRoute": {
"type": "object",
"additionalProperties": false,
"required": [
"enabled",
"parentRefs"
],
"properties": {
"enabled": {
"type": "boolean"
},
"parentRefs": {
"type": "array"
}
},
"allOf": [
{
"if": {
"properties": {
"enabled": {
"const": true
}
},
"required": [
"enabled"
]
},
"then": {
"properties": {
"parentRefs": {
"minItems": 1
}
}
}
}
]
},
"networkPolicy": {
"type": "object",
"required": [
"enabled",
"apnsEgressCidrs",
"postgresEgressCidrs",
"dns"
],
"properties": {
"enabled": {
"const": true
},
"apnsEgressCidrs": {
"type": "array",
"minItems": 1
},
"postgresEgressCidrs": {
"type": "array",
"minItems": 1
},
"dns": {
"type": "object",
"required": [
"namespaceSelector",
"podSelector"
]
},
"monitoring": {
"type": "object",
"required": [
"enabled",
"namespaceSelector",
"podSelector"
],
"properties": {
"enabled": {
"type": "boolean"
},
"namespaceSelector": {
"type": "object"
},
"podSelector": {
"type": "object"
}
},
"allOf": [
{
"if": {
"properties": {
"enabled": {
"const": true
}
},
"required": [
"enabled"
]
},
"then": {
"properties": {
"namespaceSelector": {
"minProperties": 1
},
"podSelector": {
"minProperties": 1
}
}
}
}
]
}
}
},
"podMonitor": {
"type": "object",
"required": [
"enabled"
],
"properties": {
"enabled": {
"type": "boolean"
}
}
},
"prometheusRule": {
"type": "object",
"required": [
"enabled"
],
"properties": {
"enabled": {
"type": "boolean"
},
"apnsRetryRatioThreshold": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 1
},
"apnsRetryMinSamples": {
"type": "integer",
"minimum": 1
}
}
},
"image": {
"type": "object",
"required": [
"repository"
],
"properties": {
"repository": {
"type": "string",
"minLength": 1
},
"tag": {
"type": "string"
},
"digest": {
"type": "string",
"pattern": "^$|^sha256:[0-9a-f]{64}$"
}
},
"anyOf": [
{
"properties": {
"tag": {
"minLength": 1
}
}
},
{
"properties": {
"digest": {
"pattern": "^sha256:[0-9a-f]{64}$"
}
}
}
]
},
"migration": {
"type": "object",
"additionalProperties": false,
"required": [
"existingSecret",
"databaseUrlKey",
"runtimeDatabaseRole",
"resources"
],
"properties": {
"existingSecret": {
"type": "string",
"minLength": 1
},
"databaseUrlKey": {
"type": "string",
"minLength": 1
},
"runtimeDatabaseRole": {
"type": "string",
"pattern": "^[a-zA-Z_][a-zA-Z0-9_]{0,62}$"
},
"resources": {
"type": "object"
}
}
}
},
"$defs": {
"profileBase": {
"type": "object",
"additionalProperties": false,
"required": [
"appAttestAppId",
"apnsTopic",
"apnsEnvironment"
],
"properties": {
"appAttestAppId": {
"type": "string",
"minLength": 1
},
"apnsTopic": {
"type": "string",
"minLength": 1
},
"apnsEnvironment": {
"enum": [
"production",
"sandbox"
]
},
"apnsCert": {
"$ref": "#/$defs/apnsCert"
}
}
},
"enabledProfile": {
"allOf": [
{
"$ref": "#/$defs/profileBase"
},
{
"required": [
"apnsCert"
]
}
]
},
"apnsCert": {
"type": "object",
"additionalProperties": false,
"required": [
"secretName",
"secretKey"
],
"properties": {
"secretName": {
"type": "string",
"minLength": 1
},
"secretKey": {
"type": "string",
"minLength": 1
}
}
}
},
"required": [
"replicaCount",
"existingSecret",
"gatewayOrigin",
"maxGrantLifetimeSeconds",
"profiles",
"httpRoute",
"image",
"migration"
],
"allOf": [
{
"$comment": "A PodMonitor requires scoped 8081 ingress. External scrapers such as Datadog may enable that ingress without rendering a PodMonitor.",
"if": {
"properties": {
"podMonitor": {
"properties": {
"enabled": {
"const": true
}
},
"required": [
"enabled"
]
}
},
"required": [
"podMonitor"
]
},
"then": {
"properties": {
"networkPolicy": {
"properties": {
"monitoring": {
"properties": {
"enabled": {
"const": true
}
},
"required": [
"enabled"
]
}
},
"required": [
"monitoring"
]
}
},
"required": [
"networkPolicy"
]
}
}
]
}