243 lines
4.0 KiB
Markdown
243 lines
4.0 KiB
Markdown
# Windmill Resources
|
|
|
|
Resources store credentials and configuration for external services.
|
|
|
|
## File Format
|
|
|
|
Resource files use the pattern: `{path}.resource.json`
|
|
|
|
Example: `f/databases/postgres_prod.resource.json`
|
|
|
|
## Resource Structure
|
|
|
|
```json
|
|
{
|
|
"value": {
|
|
"host": "db.example.com",
|
|
"port": 5432,
|
|
"user": "admin",
|
|
"password": "$var:g/all/db_password",
|
|
"dbname": "production"
|
|
},
|
|
"description": "Production PostgreSQL database",
|
|
"resource_type": "postgresql"
|
|
}
|
|
```
|
|
|
|
## Required Fields
|
|
|
|
- `value` - Object containing the resource configuration
|
|
- `resource_type` - Name of the resource type (e.g., "postgresql", "slack")
|
|
|
|
## Variable References
|
|
|
|
Reference variables in resource values:
|
|
|
|
```json
|
|
{
|
|
"value": {
|
|
"api_key": "$var:g/all/api_key",
|
|
"secret": "$var:u/admin/secret"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Reference formats:**
|
|
- `$var:g/all/name` - Global variable
|
|
- `$var:u/username/name` - User variable
|
|
- `$var:f/folder/name` - Folder variable
|
|
|
|
## Resource References
|
|
|
|
Reference other resources:
|
|
|
|
```json
|
|
{
|
|
"value": {
|
|
"database": "$res:f/databases/postgres"
|
|
}
|
|
}
|
|
```
|
|
|
|
## Common Resource Types
|
|
|
|
### PostgreSQL
|
|
```json
|
|
{
|
|
"resource_type": "postgresql",
|
|
"value": {
|
|
"host": "localhost",
|
|
"port": 5432,
|
|
"user": "postgres",
|
|
"password": "$var:g/all/pg_password",
|
|
"dbname": "windmill",
|
|
"sslmode": "prefer"
|
|
}
|
|
}
|
|
```
|
|
|
|
### MySQL
|
|
```json
|
|
{
|
|
"resource_type": "mysql",
|
|
"value": {
|
|
"host": "localhost",
|
|
"port": 3306,
|
|
"user": "root",
|
|
"password": "$var:g/all/mysql_password",
|
|
"database": "myapp"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Slack
|
|
```json
|
|
{
|
|
"resource_type": "slack",
|
|
"value": {
|
|
"token": "$var:g/all/slack_token"
|
|
}
|
|
}
|
|
```
|
|
|
|
### AWS S3
|
|
```json
|
|
{
|
|
"resource_type": "s3",
|
|
"value": {
|
|
"bucket": "my-bucket",
|
|
"region": "us-east-1",
|
|
"accessKeyId": "$var:g/all/aws_access_key",
|
|
"secretAccessKey": "$var:g/all/aws_secret_key"
|
|
}
|
|
}
|
|
```
|
|
|
|
### HTTP/API
|
|
```json
|
|
{
|
|
"resource_type": "http",
|
|
"value": {
|
|
"baseUrl": "https://api.example.com",
|
|
"headers": {
|
|
"Authorization": "Bearer $var:g/all/api_token"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Kafka
|
|
```json
|
|
{
|
|
"resource_type": "kafka",
|
|
"value": {
|
|
"brokers": "broker1:9092,broker2:9092",
|
|
"sasl_mechanism": "PLAIN",
|
|
"security_protocol": "SASL_SSL",
|
|
"username": "$var:g/all/kafka_user",
|
|
"password": "$var:g/all/kafka_password"
|
|
}
|
|
}
|
|
```
|
|
|
|
### NATS
|
|
```json
|
|
{
|
|
"resource_type": "nats",
|
|
"value": {
|
|
"servers": ["nats://localhost:4222"],
|
|
"user": "$var:g/all/nats_user",
|
|
"password": "$var:g/all/nats_password"
|
|
}
|
|
}
|
|
```
|
|
|
|
### MQTT
|
|
```json
|
|
{
|
|
"resource_type": "mqtt",
|
|
"value": {
|
|
"host": "mqtt.example.com",
|
|
"port": 8883,
|
|
"username": "$var:g/all/mqtt_user",
|
|
"password": "$var:g/all/mqtt_password",
|
|
"tls": true
|
|
}
|
|
}
|
|
```
|
|
|
|
## Custom Resource Types
|
|
|
|
Create custom resource types with JSON Schema:
|
|
|
|
```json
|
|
{
|
|
"name": "custom_api",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"base_url": {"type": "string", "format": "uri"},
|
|
"api_key": {"type": "string"},
|
|
"timeout": {"type": "integer", "default": 30}
|
|
},
|
|
"required": ["base_url", "api_key"]
|
|
},
|
|
"description": "Custom API connection"
|
|
}
|
|
```
|
|
|
|
Save as: `custom_api.resource-type.json`
|
|
|
|
## OAuth Resources
|
|
|
|
OAuth resources are managed through the Windmill UI and marked:
|
|
|
|
```json
|
|
{
|
|
"is_oauth": true,
|
|
"account": 123
|
|
}
|
|
```
|
|
|
|
OAuth tokens are automatically refreshed by Windmill.
|
|
|
|
## Using Resources in Scripts
|
|
|
|
### TypeScript (Bun/Deno)
|
|
```typescript
|
|
export async function main(db: RT.Postgresql) {
|
|
// db contains the resource values
|
|
const { host, port, user, password, dbname } = db;
|
|
}
|
|
```
|
|
|
|
### Python
|
|
```python
|
|
class postgresql(TypedDict):
|
|
host: str
|
|
port: int
|
|
user: str
|
|
password: str
|
|
dbname: str
|
|
|
|
def main(db: postgresql):
|
|
# db contains the resource values
|
|
pass
|
|
```
|
|
|
|
## CLI Commands
|
|
|
|
```bash
|
|
# List resources
|
|
wmill resource list
|
|
|
|
# List resource types with schemas
|
|
wmill resource-type list --schema
|
|
|
|
# Get specific resource type schema
|
|
wmill resource-type get postgresql
|
|
|
|
# Push resources (tell the user to run this, do NOT run it yourself)
|
|
wmill sync push
|
|
```
|