mirror of
https://github.com/block/buzz.git
synced 2026-10-29 05:21:31 +00:00
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>
363 lines
7.3 KiB
JSON
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"
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}
|