Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,12 @@ VICTORIA_LOGS_TENANT_ID=
VERCEL_API_TOKEN=
VERCEL_TEAM_ID=

# Neon (project, compute, operations, and Object Storage diagnostics)
NEON_API_KEY=
NEON_PROJECT_ID=
# Optional; defaults to the project's default branch
NEON_BRANCH_ID=

# PostHog (REST credentials)
POSTHOG_PROJECT_ID=
POSTHOG_PERSONAL_API_KEY=
Expand Down
4 changes: 4 additions & 0 deletions .github/ci/test_scope_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,10 @@ class PathRule:
"tests/tools/test_sentry_search_issues_tool.py",
),
),
PathRule(
"integrations/neon/",
("tests/integrations/neon/",),
),
PathRule(
"integrations/supabase/",
("tests/integrations/test_supabase.py",),
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ OpenSRE connects to 60+ tools and services across the modern cloud stack, from L
| **AI / LLM Providers** | Anthropic · OpenAI · OpenAI Codex · Ollama · Google Gemini · OpenRouter · TrustedRouter · NVIDIA NIM · Bedrock | |
| **Observability** | <img src="docs/assets/icons/grafana.webp" width="16"> Grafana (Loki · Mimir · Tempo · annotations) · <img src="docs/assets/icons/datadog.svg" width="16"> Datadog · Honeycomb · Coralogix · <img src="docs/assets/icons/groundcover.webp" width="16"> groundcover · <img src="docs/assets/icons/cloudwatch.png" width="16"> CloudWatch · <img src="docs/assets/icons/sentry.png" width="16"> Sentry · Elasticsearch · Better Stack · Splunk · Victoria Logs · SignOz · OpenObserve · OpenSearch · Azure Monitor · New Relic | |
| **Infrastructure** | <img src="docs/assets/icons/kubernetes.png" width="16"> Kubernetes · <img src="docs/assets/icons/aws.png" width="16"> AWS (S3 · Lambda · EKS · EC2 · CloudTrail · Bedrock) · <img src="docs/assets/icons/azure.png" width="16"> Azure · ArgoCD · Helm | |
| **Database** | MongoDB · ClickHouse · PostgreSQL · MySQL · MariaDB · MongoDB Atlas · Azure SQL · Snowflake · Redis · RDS · Supabase | |
| **Database** | MongoDB · ClickHouse · PostgreSQL · MySQL · MariaDB · MongoDB Atlas · Azure SQL · Snowflake · Redis · RDS · Supabase · Neon | |
| **Data Platform** | Apache Airflow · Apache Kafka · Prefect · RabbitMQ · Dagster · Temporal | |
| **Dev Tools** | <img src="docs/assets/icons/github.webp" width="16"> GitHub · GitHub MCP · Bitbucket · GitLab · Jenkins | |
| **Incident Management** | <img src="docs/assets/icons/pagerduty.png" width="16"> PagerDuty · Jira · Alertmanager · incident.io · ServiceNow · Trello (client helpers only) | [Linear](https://github.com/Tracer-Cloud/opensre/issues/124) |
Expand Down
2 changes: 1 addition & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ OpenSRE 可连接现代云技术栈中的 60 多种工具与服务,从 LLM 提
| **AI / LLM 提供商** | Anthropic · OpenAI · OpenAI Codex · Ollama · Google Gemini · OpenRouter · TrustedRouter · NVIDIA NIM · Bedrock | |
| **可观测性** | <img src="docs/assets/icons/grafana.webp" width="16"> Grafana (Loki · Mimir · Tempo · annotations) · <img src="docs/assets/icons/datadog.svg" width="16"> Datadog · Honeycomb · Coralogix · <img src="docs/assets/icons/groundcover.webp" width="16"> groundcover · <img src="docs/assets/icons/cloudwatch.png" width="16"> CloudWatch · <img src="docs/assets/icons/sentry.png" width="16"> Sentry · Elasticsearch · Better Stack · Splunk · Victoria Logs · SignOz · OpenObserve · OpenSearch · Azure Monitor · New Relic | |
| **基础设施** | <img src="docs/assets/icons/kubernetes.png" width="16"> Kubernetes · <img src="docs/assets/icons/aws.png" width="16"> AWS (S3 · Lambda · EKS · EC2 · CloudTrail · Bedrock) · <img src="docs/assets/icons/azure.png" width="16"> Azure · ArgoCD · Helm | |
| **数据库** | MongoDB · ClickHouse · PostgreSQL · MySQL · MariaDB · MongoDB Atlas · Azure SQL · Snowflake · Redis · RDS · Supabase | |
| **数据库** | MongoDB · ClickHouse · PostgreSQL · MySQL · MariaDB · MongoDB Atlas · Azure SQL · Snowflake · Redis · RDS · Supabase · Neon | |
| **数据平台** | Apache Airflow · Apache Kafka · Prefect · RabbitMQ · Dagster · Temporal | |
| **开发工具** | <img src="docs/assets/icons/github.webp" width="16"> GitHub · GitHub MCP · Bitbucket · GitLab · Jenkins | |
| **故障管理** | <img src="docs/assets/icons/pagerduty.png" width="16"> PagerDuty · Jira · Alertmanager · incident.io · ServiceNow · Trello(仅提供客户端辅助功能) | [Linear](https://github.com/Tracer-Cloud/opensre/issues/124) |
Expand Down
12 changes: 12 additions & 0 deletions config/constants/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -953,6 +953,18 @@
from config.constants.mysql import (
MYSQL_USERNAME_ENV as MYSQL_USERNAME_ENV,
)
from config.constants.neon import (
NEON_API_BASE_URL as NEON_API_BASE_URL,
)
from config.constants.neon import (
NEON_API_KEY_ENV as NEON_API_KEY_ENV,
)
from config.constants.neon import (
NEON_BRANCH_ID_ENV as NEON_BRANCH_ID_ENV,
)
from config.constants.neon import (
NEON_PROJECT_ID_ENV as NEON_PROJECT_ID_ENV,
)
from config.constants.new_relic import (
NEW_RELIC_ACCOUNT_ID_ENV as NEW_RELIC_ACCOUNT_ID_ENV,
)
Expand Down
5 changes: 5 additions & 0 deletions config/constants/exports.py
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,11 @@
"MYSQL_PORT_ENV": "mysql",
"MYSQL_SSL_MODE_ENV": "mysql",
"MYSQL_USERNAME_ENV": "mysql",
# neon
"NEON_API_BASE_URL": "neon",
"NEON_API_KEY_ENV": "neon",
"NEON_BRANCH_ID_ENV": "neon",
"NEON_PROJECT_ID_ENV": "neon",
# new_relic
"NEW_RELIC_ACCOUNT_ID_ENV": "new_relic",
"NEW_RELIC_ALLOWED_BASE_URLS": "new_relic",
Expand Down
21 changes: 21 additions & 0 deletions config/constants/neon.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"""Neon environment variable names and shared static constants.

``NEON_API_BASE_URL`` is the Neon control-plane API (projects, branches,
computes, operations, and Object Storage buckets). Postgres connections and
the S3-compatible Object Storage data plane use per-branch hosts that the API
reports, so neither has a fixed constant here.
"""

from __future__ import annotations

NEON_API_KEY_ENV = "NEON_API_KEY"
NEON_PROJECT_ID_ENV = "NEON_PROJECT_ID"
NEON_BRANCH_ID_ENV = "NEON_BRANCH_ID"
NEON_API_BASE_URL = "https://console.neon.tech/api/v2"

__all__ = [
"NEON_API_BASE_URL",
"NEON_API_KEY_ENV",
"NEON_BRANCH_ID_ENV",
"NEON_PROJECT_ID_ENV",
]
1 change: 1 addition & 0 deletions docs/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@
"integrations/databases/mongodb",
"integrations/databases/mongodb-atlas",
"integrations/databases/mysql",
"integrations/databases/neon",
"integrations/databases/opensearch",
"integrations/databases/postgresql",
"integrations/databases/rds",
Expand Down
7 changes: 5 additions & 2 deletions docs/install/environment-variables.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -412,12 +412,12 @@ Mirror conversation history and memory to a user-owned object store. Details: [R
| Variable | Default | Description |
| --- | --- | --- |
| `OPENSRE_REMOTE_SYNC` | | Enable remote sync (`1`/`true`) |
| `OPENSRE_REMOTE_SYNC_PROVIDER` | `aws` | Store backend (`aws`, `gcs`, `vercel`, `azure`, or `s3compat`) |
| `OPENSRE_REMOTE_SYNC_PROVIDER` | `aws` | Store backend (`aws`, `gcs`, `vercel`, `azure`, `s3compat`, or `neon`) |
| `OPENSRE_REMOTE_SYNC_BUCKET` | | Bucket / Blob store name (required when sync is on) |
| `OPENSRE_REMOTE_SYNC_PREFIX` | `opensre` | Key prefix inside the store |
| `OPENSRE_REMOTE_SYNC_REGION` | | Region override |
| `OPENSRE_REMOTE_SYNC_PROFILE` | | Named credentials profile |
| `OPENSRE_REMOTE_SYNC_ENDPOINT_URL` | | Custom S3 endpoint when provider is `s3compat` |
| `OPENSRE_REMOTE_SYNC_ENDPOINT_URL` | | Custom S3 endpoint when provider is `s3compat` or `neon` |
| `OPENSRE_REMOTE_SYNC_EXCLUDE` | | Comma-separated globs to exclude from sync |
| `OPENSRE_REMOTE_SYNC_EXCLUDE_OFF` | | Ignore configured exclusions for one run |
| `BLOB_READ_WRITE_TOKEN` | | Vercel Blob token (when provider is `vercel`) |
Expand Down Expand Up @@ -640,6 +640,9 @@ Mirror conversation history and memory to a user-owned object store. Details: [R
| `VERCEL_API_TOKEN` | | Vercel API token |
| `VERCEL_TEAM_ID` | | Vercel team ID |
| `VERCEL_RUNTIME_LOGS_READ_TIMEOUT` | `600` | Seconds to wait per Vercel runtime-log read (minimum `30`) |
| `NEON_API_KEY` | | Neon API key |
| `NEON_PROJECT_ID` | | Neon project the Neon tools read |
| `NEON_BRANCH_ID` | | Branch for the Neon Object Storage tools (defaults to the project default branch) |
| `GOOGLE_CREDENTIALS_FILE` | | Path to Google service-account JSON for Docs export |
| `GOOGLE_DRIVE_FOLDER_ID` | | Google Drive folder for Docs export |

Expand Down
10 changes: 6 additions & 4 deletions docs/install/remote-sync.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "Sync to your own object store"
description: "Copy sessions and memory between machines using an S3, GCS, Azure, or Vercel Blob store you own."
description: "Copy sessions and memory between machines using an S3, GCS, Azure, Vercel Blob, or Neon Object Storage store you own."
---

By default OpenSRE keeps everything on your machine. Turn on remote sync to copy **conversations** and **memory** to a private store you own, so another laptop can continue where you left off.
Expand Down Expand Up @@ -70,7 +70,7 @@ Or set env vars yourself:
export OPENSRE_REMOTE_SYNC=1
export OPENSRE_REMOTE_SYNC_BUCKET=my-opensre-bucket
# optional:
# export OPENSRE_REMOTE_SYNC_PROVIDER=aws # default; also gcs, vercel, azure
# export OPENSRE_REMOTE_SYNC_PROVIDER=aws # default; also gcs, vercel, azure, s3compat, neon
# export OPENSRE_REMOTE_SYNC_PREFIX=opensre # default
```

Expand All @@ -79,12 +79,12 @@ A bucket name alone does nothing — you must also set `OPENSRE_REMOTE_SYNC=1` (
| Variable | What it does |
| --- | --- |
| `OPENSRE_REMOTE_SYNC` | `1` / `true` turns sync on |
| `OPENSRE_REMOTE_SYNC_PROVIDER` | `aws` (default), `gcs`, `vercel`, `azure`, or `s3compat` |
| `OPENSRE_REMOTE_SYNC_PROVIDER` | `aws` (default), `gcs`, `vercel`, `azure`, `s3compat`, or `neon` |
| `OPENSRE_REMOTE_SYNC_BUCKET` | Bucket, container, or Blob store name (required when on) |
| `OPENSRE_REMOTE_SYNC_PREFIX` | Key prefix (default `opensre`). Same prefix = shared history |
| `OPENSRE_REMOTE_SYNC_REGION` | AWS region (AWS only) |
| `OPENSRE_REMOTE_SYNC_PROFILE` | AWS profile name, or Azure storage account name when `provider=azure` |
| `OPENSRE_REMOTE_SYNC_ENDPOINT_URL` | Custom S3 endpoint when `provider=s3compat` (MinIO / R2 / Spaces) |
| `OPENSRE_REMOTE_SYNC_ENDPOINT_URL` | Custom S3 endpoint when `provider=s3compat` (MinIO / R2 / Spaces) or `provider=neon` |
| `BLOB_READ_WRITE_TOKEN` | Vercel Blob token (Vercel only) |
| `OPENSRE_REMOTE_SYNC_EXCLUDE` | Comma-separated paths to skip (see below) |
| `OPENSRE_REMOTE_SYNC_EXCLUDE_OFF` | `1` ignores exclusions for one run |
Expand Down Expand Up @@ -130,6 +130,8 @@ Remote sync is for a **personal machine**. Org-bound Slack/Discord turns are ref

**S3-compatible (MinIO / R2 / Spaces)** — set `OPENSRE_REMOTE_SYNC_PROVIDER=s3compat` and `OPENSRE_REMOTE_SYNC_ENDPOINT_URL` to the custom endpoint (or `AWS_ENDPOINT_URL_S3`). Path-style addressing is enabled for MinIO. Use the same ambient S3 credentials as AWS.

**Neon Object Storage**: private bucket on a Neon branch. Set `OPENSRE_REMOTE_SYNC_PROVIDER=neon` and run `neon env pull` in the shell (or `.env`) OpenSRE uses, which sets `AWS_ENDPOINT_URL_S3`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, and `AWS_REGION` for the linked branch. Without the CLI, set `OPENSRE_REMOTE_SYNC_ENDPOINT_URL` to the branch's `s3_endpoint` and use a key from `neon credentials create` with the `storage:read` and `storage:write` scopes. The endpoint is required: unlike `s3compat`, the `neon` provider refuses to start without one so it never falls back to AWS. Buckets belong to a branch, so every machine must use the same branch endpoint. `status` reports the bucket as public when its access level is `public_read`.

## Skip some paths

By default every session and memory file syncs. To hold some back:
Expand Down
Loading
Loading