Skip to content

Commit 171b4a6

Browse files
committed
Merge remote-tracking branch 'origin/trunk' into docs/nsql-ux-improvements
# Conflicts: # website/docs/api/HTTP/post-nsql.api.mdx
2 parents 9edcb15 + f3d9b48 commit 171b4a6

32 files changed

Lines changed: 535 additions & 122 deletions

File tree

website/docs/api/overview.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,3 @@ Spice provides high-performance, industry-standard APIs:
2525
### MCP API
2626

2727
- **HTTP APIs**: The Model Context Protocol (MCP) helps integrate external tools and services into the Spice runtime. MCP tools can be accessed via HTTP APIs for tool integration and orchestration. For details, see the [MCP documentation](../features/large-language-models/mcp).
28-
29-
:::note
30-
HTTP Streaming support for MCP is coming soon.
31-
:::

website/docs/api/tls/index.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,70 @@ When TLS is enabled in the runtime, the Spice CLI can be configured to connect t
118118
```bash
119119
spice sql --tls-root-certificate-file /path/to/root.pem
120120
```
121+
122+
## Mutual TLS (mTLS)
123+
124+
:::info Enterprise Feature
125+
mTLS (client certificate authentication) is included in the Enterprise distribution of Spice.ai. [Learn more](https://docs.spice.ai/docs/enterprise).
126+
:::
127+
128+
mTLS extends standard TLS by requiring the client to also present a certificate during the TLS handshake. This provides cryptographic authentication of both the server and the client.
129+
130+
### Enable mTLS via spicepod.yaml
131+
132+
Set `client_auth_mode` to `request` or `required` and provide a CA bundle to verify client certificates:
133+
134+
```yaml
135+
runtime:
136+
tls:
137+
enabled: true
138+
certificate_file: /path/to/server.crt
139+
key_file: /path/to/server.key
140+
client_auth_mode: required
141+
client_auth_ca_file: /path/to/client-ca.pem
142+
```
143+
144+
### Enable mTLS via command line
145+
146+
```bash
147+
spiced --tls-enabled true \
148+
--tls-certificate-file /path/to/server.crt \
149+
--tls-key-file /path/to/server.key \
150+
--tls-client-auth-mode required \
151+
--tls-client-auth-ca-file /path/to/client-ca.pem
152+
```
153+
154+
### Client auth modes
155+
156+
| Mode | Behavior |
157+
|------|----------|
158+
| `none` *(default)* | Standard one-way TLS. No client certificate is requested. |
159+
| `request` | The server requests a client certificate but accepts connections without one. Presented certificates are verified against the CA. Useful for migration or audit-only deployments. |
160+
| `required` | A valid client certificate is required. The Flight listener rejects no-cert connections at the TLS handshake. The HTTP listener admits no-cert connections so `/health` and `/v1/ready` remain accessible for Kubernetes probes, but all other HTTP endpoints return 401 without a verified client certificate. |
161+
162+
### Connecting with a client certificate
163+
164+
Use cURL with a client certificate:
165+
166+
```bash
167+
curl --cacert ca.pem --cert client.crt --key client.key \
168+
https://localhost:8090/v1/sql -d 'SELECT 1'
169+
```
170+
171+
Use the Spice CLI with a client certificate:
172+
173+
```bash
174+
spice sql --tls-root-certificate-file ./ca.pem \
175+
--client-tls-certificate-file ./client.crt \
176+
--client-tls-key-file ./client.key
177+
```
178+
179+
### Probe and metrics access
180+
181+
Kubernetes liveness/readiness probes (`/health`, `/v1/ready`) and the metrics endpoint (`/metrics`) are always accessible without a client certificate, even under `client_auth_mode: required`.
182+
183+
### Client CA hot-reload
184+
185+
When `client_auth_ca_file` is used, the CA bundle is watched for changes and reloaded atomically alongside the server certificate and key. When `client_auth_ca` (inline) is used, the CA is loaded once at startup.
186+
187+
For a complete walkthrough, see the [mTLS Cookbook recipe](https://github.com/spiceai/cookbook/tree/trunk/mtls).

website/docs/components/catalogs/cayenne.md

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,34 @@ Use the `include` field to specify which tables to include from the catalog. The
3838

3939
## `params`
4040

41-
| Parameter Name | Description | Default |
42-
| -------------------------------- | -------------------------------------------------------------------------------------- | ------------ |
43-
| `cayenne_data_dir` | Local directory for table data files (Vortex format). | Spice data directory |
44-
| `cayenne_metadata_dir` | Local directory for Cayenne SQLite metadata. | Spice data directory |
45-
| `cayenne_target_file_size_mb` | Target Vortex file size in MB. | `128` |
46-
| `cayenne_footer_cache_mb` | Size of the in-memory Vortex footer cache in MB for query performance. | `128` |
47-
| `cayenne_segment_cache_mb` | Size of the in-memory Vortex segment cache in MB for caching decompressed data. | `256` |
48-
| `cayenne_compression_strategy` | Compression algorithm for Vortex files. Options: `btrblocks`, `zstd`. | `btrblocks` |
41+
| Parameter Name | Description | Default |
42+
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
43+
| `cayenne_data_dir` | Local directory for table data files (Vortex format). | Spice data directory |
44+
| `cayenne_metadata_dir` | Local directory for Cayenne SQLite metadata. | Spice data directory |
45+
| `cayenne_target_file_size_mb` | Target Vortex file size in MB. | `128` |
46+
| `cayenne_footer_cache_mb` | Size of the in-memory Vortex footer cache in MB for query performance. | `128` |
47+
| `cayenne_segment_cache_mb` | Size of the in-memory Vortex segment cache in MB for caching decompressed data. | `256` |
48+
| `cayenne_compression_strategy` | Compression algorithm for Vortex files. Options: `btrblocks`, `zstd`. | `btrblocks` |
49+
| `cayenne_file_path` | Custom path for storing Cayenne data files. Supports local paths or S3 Express One Zone URLs (e.g., `s3://bucket--usw2-az1--x-s3/prefix/`). | - |
50+
| `cayenne_unsupported_type_action` | Action when an unsupported data type is encountered. Options: `error`, `string`, `warn`, `ignore`. | `error` |
51+
| `cayenne_metastore` | Metastore backend type. Supports `sqlite` or `turso` (requires `turso` feature flag). | `sqlite` |
52+
53+
### S3 Express One Zone Parameters
54+
55+
When `cayenne_file_path` is set to an S3 Express One Zone URL (or `cayenne_s3_zone_ids` is configured), the following parameters control S3 connectivity:
56+
57+
| Parameter | Description | Default |
58+
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
59+
| `cayenne_s3_zone_ids` | Comma-separated availability zone IDs (e.g., `usw2-az1,usw2-az2`). Auto-generates bucket names in format `spice-{app}-{dataset}--{zone}--x-s3`. | - |
60+
| `cayenne_s3_region` | AWS region (e.g., `us-west-2`). Auto-derived from zone ID if not specified. | - |
61+
| `cayenne_s3_auth` | Authentication method: `iam_role` or `key`. | `iam_role` |
62+
| `cayenne_s3_key` | AWS access key ID (required when `cayenne_s3_auth: key`). | - |
63+
| `cayenne_s3_secret` | AWS secret access key (required when `cayenne_s3_auth: key`). | - |
64+
| `cayenne_s3_session_token` | AWS session token (optional, for temporary credentials). | - |
65+
| `cayenne_s3_endpoint` | Custom S3 endpoint URL (optional, overrides auto-generated endpoint). | - |
66+
| `cayenne_s3_client_timeout` | Request timeout duration (e.g., `30s`, `5m`). | `120s` |
67+
| `cayenne_s3_unsigned_payload` | Use unsigned payload for S3 Express One Zone requests. | `true` |
68+
| `cayenne_s3_allow_http` | Set to `true` for testing with local S3-compatible storage. | `false` |
4969

5070
## Examples
5171

website/docs/components/catalogs/index.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,21 @@ Catalog Connectors connect to external catalog providers and make their tables a
2222

2323
Supported Catalog Connectors include:
2424

25-
| Name | Description | Status | Protocol/Format |
26-
| --------------- | ----------------------- | ------ | ---------------------------- |
27-
| `cayenne` | Cayenne Lakehouse | Alpha | Vortex |
28-
| `unity_catalog` | Unity Catalog | Stable | Delta Lake |
29-
| `databricks` | Databricks | Beta | Spark Connect, S3/Delta Lake |
30-
| `iceberg` | Apache Iceberg | Beta | Parquet |
31-
| `spice.ai` | Spice.ai Cloud Platform | Beta | Arrow Flight |
32-
| `ducklake` | DuckLake | Beta | Parquet |
33-
| `glue` | AWS Glue | Alpha | Parquet, Iceberg |
34-
| `snowflake` | Snowflake | Alpha | Snowflake SQL |
35-
| `pg` | PostgreSQL / Redshift | Alpha | PostgreSQL Wire Protocol |
36-
| `mysql` | MySQL | Alpha | MySQL Wire Protocol |
37-
| `mssql` | Microsoft SQL Server | Alpha | TDS |
38-
| `adbc` | ADBC | Alpha | Arrow (ADBC) |
39-
| `oracle` | Oracle | Alpha | Oracle Net |
25+
| Name | Description | Status | Protocol/Format |
26+
| --------------- | ----------------------- | ----------------- | ---------------------------- |
27+
| `cayenne` | Cayenne Lakehouse | Release Candidate | Vortex |
28+
| `unity_catalog` | Unity Catalog | Stable | Delta Lake |
29+
| `databricks` | Databricks | Beta | Spark Connect, S3/Delta Lake |
30+
| `iceberg` | Apache Iceberg | Beta | Parquet |
31+
| `spice.ai` | Spice.ai Cloud Platform | Beta | Arrow Flight |
32+
| `ducklake` | DuckLake | Beta | Parquet |
33+
| `glue` | AWS Glue | Alpha | Parquet, Iceberg |
34+
| `snowflake` | Snowflake | Alpha | Snowflake SQL |
35+
| `pg` | PostgreSQL / Redshift | Alpha | PostgreSQL Wire Protocol |
36+
| `mysql` | MySQL | Alpha | MySQL Wire Protocol |
37+
| `mssql` | Microsoft SQL Server | Alpha | TDS |
38+
| `adbc` | ADBC | Alpha | Arrow (ADBC) |
39+
| `oracle` | Oracle | Alpha | Oracle Net |
4040

4141
## Catalog Connector Docs
4242

website/docs/components/data-accelerators/duckdb/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ DuckDB acceleration supports the following optional parameters under `accelerati
3939
- `duckdb_memory_limit` (string, default: none): Limits DuckDB's memory usage for instance. Acceptable units are KB, MB, GB, TB (decimal: 1000^i) or KiB, MiB, GiB, TiB (binary: 1024^i). See [DuckDB memory limit documentation](https://duckdb.org/docs/stable/configuration/overview).
4040
- `duckdb_preserve_insertion_order` (boolean, default: `true`): Controls whether DuckDB preserves the insertion order of rows in tables. When set to `true`, rows are returned in the order they were inserted. See [DuckDB preserve insertion order documentation](https://duckdb.org/docs/stable/guides/performance/how_to_tune_workloads#the-preserve_insertion_order-option) and [order preservation documentation](https://duckdb.org/docs/stable/sql/dialect/order_preservation).
4141
- `connection_pool_size` (integer, default: `10` or the number of datasets sharing the same DuckDB file, whichever is larger): Controls the maximum number of connections to keep open in the connection pool for concurrent query execution.
42-
- `on_refresh_recompute_statistics` (string, default: `enabled`): Triggers automatic `ANALYZE` execution after data refreshes. This keeps DuckDB optimizer statistics up-to-date for efficient query plans and performance. Set to `disabled` to turn automatic statistics recomputation off. See [DuckDB ANALYZE statement documentation](https://duckdb.org/docs/stable/sql/statements/analyze).
42+
- `on_refresh_recompute_statistics` (string, default: `enabled`, `disabled` when `refresh_mode` is `changes`): Triggers automatic `ANALYZE` execution after data refreshes. This keeps DuckDB optimizer statistics up-to-date for efficient query plans and performance. Set to `disabled` to turn automatic statistics recomputation off. See [DuckDB ANALYZE statement documentation](https://duckdb.org/docs/stable/sql/statements/analyze).
4343
- `duckdb_index_scan_percentage` (float, default: `0.001`): Sets the threshold percentage for performing an index scan instead of a table scan. An index scan is used when the number of matching rows is less than the maximum of `duckdb_index_scan_max_count` and `duckdb_index_scan_percentage` multiplied by total row count. Must be between `0.0` and `1.0`.
4444
- `duckdb_index_scan_max_count` (integer, default: `2048`): Sets the maximum row count threshold for performing an index scan instead of a table scan. An index scan is used when the number of matching rows is less than the maximum of `duckdb_index_scan_max_count` and `duckdb_index_scan_percentage` multiplied by total row count. Must be a non-negative integer.
4545
- `partition_mode` (string, default: `files`): Controls how partitioned data is stored. Can only be used with `partition_by`. Set to `tables` to store partitions as separate tables within a single DuckDB database, improving resource usage through single shared connection pool for all partitions. Default `files` mode creates separate database files per partition with individual connection pools and generally faster query performance.

website/docs/components/data-connectors/abfs.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,15 @@ The dataset name cannot be a [reserved keyword](../../reference/spicepod/keyword
8686

8787
#### Authentication parameters
8888

89-
The following parameters are used when authenticating with Azure. Only one of these parameters can be used at a time:
89+
The following authentication methods are mutually exclusive — only one can be used at a time:
9090

9191
- `abfs_access_key`
9292
- `abfs_bearer_token`
93-
- `abfs_client_secret`
93+
- `abfs_sas_string`
94+
- Client credentials (`abfs_client_id` + `abfs_client_secret` + `abfs_tenant_id`)
95+
- `abfs_use_cli`
96+
- `abfs_msi_endpoint`
97+
- `abfs_federated_token_file`
9498
- `abfs_skip_signature`
9599

96100
If none of these are set the connector will default to using a [managed identity](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview)

website/docs/components/data-connectors/elasticsearch/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ TLS is enabled automatically for `https://` endpoints.
138138
- Nested object fields are exposed as JSON strings rather than structured columns.
139139
- `date` and `date_nanos` fields are preserved as strings because Elasticsearch accepts heterogeneous date formats; cast to a timestamp in SQL when numeric comparison is required.
140140
- `dense_vector` fields without a declared `dims` value fall back to `Utf8` and are not usable as a vector column.
141-
- The connector issues a single `_search` request per query. The result set is capped at 10,000 hits (the Elasticsearch `index.max_result_window` default). Queries with `LIMIT N` fetch `min(N, 10000)` rows; queries without `LIMIT` return at most 10,000 rows. For larger result sets, accelerate the dataset.
141+
- For queries with `LIMIT N` where N ≤ 10,000, the connector issues a single `_search` request. For larger result sets or queries without `LIMIT`, the connector automatically paginates using Point-In-Time (PIT) + `search_after`, fetching all matching documents in 10,000-hit batches.
142142
- Pushdown of SQL predicates to Elasticsearch query DSL is limited; complex filter expressions are evaluated locally by DataFusion after fetching results.
143143

144144
Elasticsearch can also be configured as a [Vector Engine](../vectors/elasticsearch) for datasets sourced from other connectors (storing Spice-managed embeddings in Elasticsearch rather than querying an existing index).

website/docs/components/data-connectors/flightsql.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ The dataset name. This will be used as the table name within Spice. The dataset
4040
| `flightsql_username` | Optional. The username to use in the underlying Apache flight Handshake Request to authenticate to the server (see [reference](https://arrow.apache.org/docs/format/Flight.html#authentication)). |
4141
| `flightsql_password` | Optional. The password to use in the underlying Apache flight Handshake Request to authenticate to the server. Use the [secret replacement syntax](../secret-stores/) to load the password from a secret store, e.g. `${secrets:my_flightsql_pass}`. |
4242
| `flightsql_tls_ca_certificate_file` | Optional. Path to a CA certificate file (PEM format) to use for TLS verification instead of system certificates. |
43+
| `flightsql_tls_client_certificate_file` | Optional. Path to a PEM client certificate chain for mutual TLS (mTLS). Must be set together with `flightsql_tls_client_key_file`. Mutually exclusive with `flightsql_tls_client_certificate`. |
44+
| `flightsql_tls_client_key_file` | Optional. Path to the PEM private key matching `flightsql_tls_client_certificate_file`. Must be set together with `flightsql_tls_client_certificate_file`. Mutually exclusive with `flightsql_tls_client_key`. |
45+
| `flightsql_tls_client_certificate` | Optional. Inline PEM client certificate chain for mutual TLS (mTLS). Use the [secret replacement syntax](../secret-stores/) to load from a secret store, e.g. `${secrets:my_cert}`. Must be set together with `flightsql_tls_client_key`. Mutually exclusive with `flightsql_tls_client_certificate_file`. |
46+
| `flightsql_tls_client_key` | Optional. Inline PEM private key for mutual TLS (mTLS). Use the [secret replacement syntax](../secret-stores/) to load from a secret store, e.g. `${secrets:my_key}`. Must be set together with `flightsql_tls_client_certificate`. Mutually exclusive with `flightsql_tls_client_key_file`. |
4347

4448
## Secrets
4549

website/docs/components/data-connectors/ftp.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ SELECT * FROM sales LIMIT 10;
3434
| --------------- | ------------------------- | ------------------------------ |
3535
| Default Port | 21 | 22 |
3636
| Encryption | None (plain text) | SSH encryption |
37-
| Authentication | Username/password | Username/password or SSH keys |
37+
| Authentication | Username/password | Username/password |
3838
| Recommended Use | Internal/trusted networks | Production and public networks |
3939

4040
:::tip[Security Recommendation]

0 commit comments

Comments
 (0)