diff --git a/docs.json b/docs.json index d8ffc8b..a9f772c 100644 --- a/docs.json +++ b/docs.json @@ -46,6 +46,7 @@ }, "manage/healthchecks-failover", "manage/geoblocking", + "manage/blueprints", { "group": "Clients", "pages": [ diff --git a/images/docker-compose-blueprint-example.png b/images/docker-compose-blueprint-example.png new file mode 100644 index 0000000..2bfd87d Binary files /dev/null and b/images/docker-compose-blueprint-example.png differ diff --git a/manage/blueprints.mdx b/manage/blueprints.mdx new file mode 100644 index 0000000..3f7fa17 --- /dev/null +++ b/manage/blueprints.mdx @@ -0,0 +1,319 @@ +--- +title: "Blueprints" +description: "Pangolin Blueprints are declarative configurations that allow you to define your resources and their settings in a structured format" +--- + +Blueprints provide a way to define your Pangolin resources and their configurations in a structured, declarative format. This allows for easier management, version control, and automation of your resource setups. + +## Overview + +Pangolin supports two blueprint formats: +1. **YAML Configuration Files**: Standalone configuration files +2. **Docker Labels**: Configuration embedded in Docker Compose files + +## YAML Configuration Format + +### Proxy Resources + +Proxy resources are used to expose HTTP, TCP, or UDP services through Pangolin. Below is an example configuration for proxy resources: + +```yaml +proxy-resources: + resource-nice-id-uno: + name: this is a http resource + protocol: http + full-domain: uno.example.com + host-header: example.com + tls-server-name: example.com + headers: + - name: X-Example-Header + value: example-value + - name: X-Another-Header + value: another-value + rules: + - action: allow + match: ip + value: 1.1.1.1 + - action: deny + match: cidr + value: 2.2.2.2/32 + - action: pass + match: path + value: /admin + targets: + - site: lively-yosemite-toad + hostname: localhost + method: http + port: 8000 + - site: slim-alpine-chipmunk + hostname: localhost + path: /admin + path-match: exact + method: https + port: 8001 + resource-nice-id-dos: + name: this is a raw resource + protocol: tcp + proxy-port: 3000 + targets: + - site: lively-yosemite-toad + hostname: localhost + port: 3000 +``` + +### Authentication Configuration + + +Authentication is off by default. You can enable it by adding the relevant fields in the `auth` section as shown in the example below. + + +```yaml +proxy-resources: + secure-resource: + name: Secured Resource + protocol: http + full-domain: secure.example.com + auth: + pincode: 123456 + password: your-secure-password + sso-enabled: true + sso-roles: + - Member + - Admin + sso-users: + - user@example.com + whitelist-users: + - admin@example.com +``` + +### Targets-Only Resources + +You can define simplified resources that contain only target configurations. This is useful for adding targets to existing resources or for simple configurations: + +```yaml +proxy-resources: + additional-targets: + targets: + - site: another-site + hostname: backend-server + method: https + port: 8443 + - site: another-site + hostname: backup-server + method: http + port: 8080 +``` + + +When using targets-only resources, the `name` and `protocol` fields are not required. All other resource-level validations are skipped for these simplified configurations. + + +### Client Resources + +Client resources are only accessible when connected via an Olm client: + +```yaml +client-resources: + client-resource-nice-id-uno: + name: this is my resource + protocol: tcp + proxy-port: 3001 + hostname: localhost + internal-port: 3000 + site: lively-yosemite-toad +``` + +## Docker Labels Format + +For containerized applications, you can define blueprints using Docker labels. + +### Enabling Docker Socket Access + +To use Docker labels, enable the Docker socket when running Newt: + +```bash +newt --docker-socket /var/run/docker.sock +``` + +or using the environment variable: + +```bash +DOCKER_SOCKET=/var/run/docker.sock +``` + +### Docker Compose Example + +```yaml +services: + newt: + image: fosrl/newt + container_name: newt + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - PANGOLIN_ENDPOINT=https://p.fosrl.io + - NEWT_ID=h1rbsgku89wf9z3 + - NEWT_SECRET=z7g54mbcwkglpx1aau9gb8mzcccoof2fdbs97keoakg2pp5z + - DOCKER_SOCKET=/var/run/docker.sock + + nginx1: + image: nginxdemos/hello + container_name: nginx1 + labels: + # Proxy Resource Configuration + - pangolin.proxy-resources.nginx.name=nginx + - pangolin.proxy-resources.nginx.full-domain=nginx.fosrl.io + - pangolin.proxy-resources.nginx.protocol=http + - pangolin.proxy-resources.nginx.headers[0].name=X-Example-Header + - pangolin.proxy-resources.nginx.headers[0].value=example-value + # Target Configuration - the port and hostname will be auto-detected + - pangolin.proxy-resources.nginx.targets[0].method=http + - pangolin.proxy-resources.nginx.targets[0].path=/path + - pangolin.proxy-resources.nginx.targets[0].path-match=prefix + + nginx2: + image: nginxdemos/hello + container_name: nginx2 + labels: + # Additional target for the same resource where the port and hostname are explicit + - pangolin.proxy-resources.nginx.targets[1].method=http + - pangolin.proxy-resources.nginx.targets[1].hostname=nginx2 + - pangolin.proxy-resources.nginx.targets[1].port=80 + +networks: + default: + name: pangolin_default +``` + +This will create a resource that looks like the following: + + + Example resource + + +### Docker Labels Considerations + + + When hostname and internal port are not explicitly defined in labels, Pangolin will automatically detect them from the container configuration. + + + + If no site is specified in the labels, the resource will be assigned to the Newt site that discovered the container. + + + + Configuration across different containers is automatically merged to form complete resource definitions. This allows you to distribute targets across multiple containers while maintaining a single logical resource. + + +## Configuration Properties + +### Proxy Resources + +| Property | Type | Required | Description | Constraints | +|----------|------|----------|-------------|-------------| +| `name` | string | Conditional | Human-readable name for the resource | Required unless targets-only resource | +| `protocol` | string | Conditional | Protocol type (`http`, `tcp`, or `udp`) | Required unless targets-only resource | +| `full-domain` | string | HTTP only | Full domain name for HTTP resources | Required for HTTP protocol, must be unique | +| `proxy-port` | number | TCP/UDP only | Port for raw TCP/UDP resources | Required for TCP/UDP, 1-65535, must be unique within proxy-resources | +| `ssl` | boolean | No | Enable SSL/TLS for the resource | - | +| `enabled` | boolean | No | Whether the resource is enabled | Defaults to `true` | +| `host-header` | string | No | Custom Host header for requests | - | +| `tls-server-name` | string | No | SNI name for TLS connections | - | +| `headers` | array | No | Custom headers to add to requests | Each header requires `name` and `value` (min 1 char each) | +| `rules` | array | No | Access control rules | See Rules section below | +| `auth` | object | HTTP only | Authentication configuration | See Authentication section below | +| `targets` | array | Yes | Target endpoints for the resource | See Targets section below | + +### Target Configuration + +| Property | Type | Required | Description | Constraints | +|----------|------|----------|-------------|-------------| +| `site` | string | No | Site identifier where the target is located | - | +| `hostname` | string | Yes | Target hostname or IP address | - | +| `port` | number | Yes | Port on the target system | 1-65535 | +| `method` | string | HTTP only | Protocol method (`http`, `https`, or `h2c`) | Required for HTTP protocol targets | +| `enabled` | boolean | No | Whether the target is enabled | Defaults to `true` | +| `internal-port` | number | No | Internal port mapping | 1-65535 | +| `path` | string | HTTP only | Path prefix, exact path, or regex pattern | - | +| `path-match` | string | HTTP only | Path matching type (`prefix`, `exact`, or `regex`) | - | + +### Authentication Configuration + +Not allowed on TCP/UDP resources. + +| Property | Type | Required | Description | Constraints | +|----------|------|----------|-------------|-------------| +| `pincode` | number | No | 6-digit PIN for access | Must be exactly 6 digits | +| `password` | string | No | Password for access | - | +| `sso-enabled` | boolean | No | Enable SSO authentication | Defaults to `false` | +| `sso-roles` | array | No | Allowed SSO roles | Cannot include "Admin" role | +| `sso-users` | array | No | Allowed SSO user emails | Must be valid email addresses | +| `whitelist-users` | array | No | Whitelisted user emails | Must be valid email addresses | + +### Rules Configuration + +| Property | Type | Required | Description | Constraints | +|----------|------|----------|-------------|-------------| +| `action` | string | Yes | Rule action (`allow`, `deny`, or `pass`) | - | +| `match` | string | Yes | Match type (`cidr`, `path`, `ip`, or `country`) | - | +| `value` | string | Yes | Value to match against | Format depends on match type | + +### Client Resources + +These are resources used with Pangolin Olm clients (e.g., SSH, RDP). + +| Property | Type | Required | Description | Constraints | +|----------|------|----------|-------------|-------------| +| `name` | string | Yes | Human-readable name for the resource | 2-100 characters | +| `protocol` | string | Yes | Protocol type (`tcp` or `udp`) | - | +| `proxy-port` | number | Yes | Port accessible to clients | 1-65535, must be unique within client-resources | +| `hostname` | string | Yes | Target hostname or IP address | 1-255 characters | +| `internal-port` | number | Yes | Port on the target system | 1-65535 | +| `site` | string | No | Site identifier where the resource is located | 2-100 characters | +| `enabled` | boolean | No | Whether the resource is enabled | Defaults to `true` | + +## Validation Rules and Constraints + +### Resource-Level Validations + +1. **Targets-Only Resources**: A resource can contain only the `targets` field, in which case `name` and `protocol` are not required. + +2. **Protocol-Specific Requirements**: + - **HTTP Protocol**: Must have `full-domain` and all targets must have `method` field + - **TCP/UDP Protocol**: Must have `proxy-port` and targets must NOT have `method` field + - **TCP/UDP Protocol**: Cannot have `auth` configuration + +3. **Port Uniqueness**: + - `proxy-port` values must be unique within `proxy-resources` + - `proxy-port` values must be unique within `client-resources` + - Cross-validation between proxy and client resources is not enforced + +4. **Domain Uniqueness**: `full-domain` values must be unique across all proxy resources + +5. **Target Method Requirements**: When protocol is `http`, all non-null targets must specify a `method` + +## Common Validation Errors + +When working with blueprints, you may encounter these validation errors: + +### "Admin role cannot be included in sso-roles" +The `Admin` role is reserved and cannot be included in the `sso-roles` array for authentication configuration. + +### "Duplicate 'full-domain' values found" +Each `full-domain` must be unique across all proxy resources. If you need multiple resources for the same domain, use different subdomains or paths. + +### "Duplicate 'proxy-port' values found" +Port numbers in `proxy-port` must be unique within their resource type (proxy-resources or client-resources separately). + +### "When protocol is 'http', all targets must have a 'method' field" +All targets in HTTP proxy resources must specify whether they use `http`, `https`, or `h2c`. + +### "When protocol is 'tcp' or 'udp', targets must not have a 'method' field" +TCP and UDP targets should not include the `method` field as it's only applicable to HTTP resources. + +### "When protocol is 'tcp' or 'udp', 'auth' must not be provided" +Authentication is only supported for HTTP resources, not TCP or UDP. + +### "Resource must either be targets-only or have both 'name' and 'protocol' fields" +Resources must either contain only the `targets` field (targets-only) or include both `name` and `protocol` for complete resource definitions. \ No newline at end of file