Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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