{ "$schema": "https://json-schema.org/draft-07/schema#", "title": ".digital_hq", "description": "My network's specification v0.1", "type": "object", "properties": { "name": {"$ref": "#/$defs/name"}, "domain": {"$ref": "#/$defs/domain"}, "home_url": { "description": "the first url to enter the network", "$ref": "#/$defs/url" }, "regions": { "type": "array", "items": { "$ref": "#/$defs/region" } }, "machines": { "type": "array", "items": { "$ref": "#/$defs/machine" }, "minItems": 1 }, "services": { "type": "array", "items": { "$ref": "#/$defs/service" }, "minItems": 1 }, "groups": { "type": "array", "items": { "$ref": "#/$defs/group" }, "minItems": 3 }, "users": { "type": "array", "items": { "$ref": "#/$defs/user" }, "minItems": 1 } }, "$defs": { "id": { "type": "string", "examples": ["cortex", "maurane", "postgres-shared"] }, "ip": { "type": "string", "pattern": "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" }, "name": { "type": "string", "examples": ["Maurane", "AFFiNE", "Gaufre"] }, "domain": { "type": "string", "pattern": "^[a-z]+\\.([a-z]*\\.)*[a-z]{2,10}" }, "url": { "type": "string", "pattern": "^(https?|postgres)://[a-z0-9.-]+(\\.[a-z]{2,10})?(:[0-9]+)?(/.*)?$" }, "email": { "type": "string", "pattern": "^[a-z0-9-\\.]+@[a-z]+\\.[a-z]{2,10}" }, "service": { "type": "object", "properties": { "id": {"$ref": "#/$defs/id"}, "name": {"$ref": "#/$defs/name"}, "machine_id": {"$ref": "#/$defs/id"}, "ports": { "type": "array", "items": { "type": "number", "minimum": 1 }, "minItems": 1 }, "public_url": {"$ref": "#/$defs/url"}, "internal_url": {"$ref": "#/$defs/url"}, "status": { "type": "string", "enum": ["active", "inactive", "planned", "wip" , "tested", "broken"] }, "auth": { "type": "string", "enum": ["session cookie", "trusted headers", "oidc", "vpn", "internal", "none"] }, "installation_mode": { "type": "string", "enum": ["docker", "native"] }, "categories": { "type": "array", "items": { "enum": ["ai", "auth", "automation", "backup", "caldav", "communication", "database", "dev", "experimental", "finance", "media", "monitoring", "network", "productivity", "storage"] } }, "dependencies": { "type": "array", "items": {"$ref": "#/$defs/name"} }, "allowed_groups": { "type": "array", "items": {"$ref": "#/$defs/name"}, "minItems": 1 } }, "required": ["id", "name", "machine_id", "status", "allowed_groups"] }, "machine": { "type": "object", "properties": { "id": {"$ref": "#/$defs/id"}, "name": {"$ref": "#/$defs/name"}, "ip": { "description": "private ip addresss of a server", "$ref": "#/$defs/ip" }, "public_ip": { "description": "public ip address of a server", "$ref": "#/$defs/ip" }, "provider": { "type": "string", "enum": ["ovh", "hostinger", "aws", "hertzner"] }, "role": { "type": "string" }, "domains": { "type": "array", "items": { "type": "object", "properties": { "internal": { "$ref": "#/$defs/domain" }, "external": { "$ref": "#/$defs/domain" } }, "minProperties": 1, "maxProperties": 1, "additionalProperties": false }, "contains": {"required": ["internal"]}, "uniqueItems": true } }, "required": ["id", "ip", "name", "domains"] }, "region": { "description": "sub part of the main digital hq land", "type": "object", "properties": { "id": {"$ref": "#/$defs/id"}, "region_type": {"type": "string"}, "vn": {"type": "string"}, "fr": {"type": "string"}, "kre": {"type": "string"}, "en": {"type": "string"} }, "required": ["id"] }, "group": { "type": "object", "properties": { "id": {"$ref": "#/$defs/id"}, "name": {"$ref": "#/$defs/name"}, "group_description": {"type": "string"}, "region": {"$ref": "#/$defs/name"} }, "required": ["id", "name", "region"] }, "user": { "type": "object", "properties": { "id": {"$ref": "#/$defs/id"}, "name": {"$ref": "#/$defs/name"}, "nickname": {"$ref": "#/$defs/name"}, "email": {"$ref": "#/$defs/email"}, "groups": { "type": "array", "items": { "type": "string" }, "minItems": 1 } }, "required": ["id", "name", "groups", "email"] } }, "additionalProperties": false }