Browse Source
- Create comprehensive docs/NEGENTROPY_SYNC_GUIDE.md covering: - Quick start for standalone and peer sync - Split IPC mode configuration - Neo4j backend setup - Docker/Cloudron deployment with supervisord - Environment variables reference - strfry interoperability - CLI sync command usage - Troubleshooting guide - Add Negentropy Sync section to README.md - Update version badge to v0.55.10 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>main
2 changed files with 373 additions and 1 deletions
@ -0,0 +1,325 @@
@@ -0,0 +1,325 @@
|
||||
# Negentropy Sync Configuration Guide |
||||
|
||||
ORLY implements [NIP-77](https://github.com/nostr-protocol/nips/blob/master/77.md) negentropy-based set reconciliation for efficient relay synchronization. This guide covers configuration for various deployment scenarios. |
||||
|
||||
## Overview |
||||
|
||||
Negentropy sync provides: |
||||
|
||||
- **Efficient synchronization**: Only exchanges events that differ between relays |
||||
- **Bandwidth optimization**: Uses set reconciliation instead of transferring full event lists |
||||
- **NIP-77 client support**: Clients can sync directly with your relay using the negentropy protocol |
||||
- **Relay-to-relay sync**: Automatically sync with configured peer relays |
||||
|
||||
## Quick Start |
||||
|
||||
### Standalone Relay (Simplest) |
||||
|
||||
For a standalone relay that accepts NIP-77 client connections: |
||||
|
||||
```bash |
||||
export ORLY_NEGENTROPY_ENABLED=true |
||||
./orly |
||||
``` |
||||
|
||||
This enables the relay to respond to client `NEG-OPEN`, `NEG-MSG`, and `NEG-CLOSE` messages. |
||||
|
||||
### Relay with Peer Sync |
||||
|
||||
To sync events with other relays: |
||||
|
||||
```bash |
||||
export ORLY_NEGENTROPY_ENABLED=true |
||||
export ORLY_SYNC_NEGENTROPY_PEERS=wss://relay1.example.com,wss://relay2.example.com |
||||
./orly |
||||
``` |
||||
|
||||
The relay will periodically sync with each peer relay. |
||||
|
||||
## Deployment Scenarios |
||||
|
||||
### 1. Split IPC Mode (Recommended for Production) |
||||
|
||||
In split mode, negentropy runs as a separate gRPC service managed by `orly-launcher`: |
||||
|
||||
```bash |
||||
# Build binaries |
||||
CGO_ENABLED=0 go build -o orly . |
||||
CGO_ENABLED=0 go build -o orly-db-badger ./cmd/orly-db-badger |
||||
CGO_ENABLED=0 go build -o orly-sync-negentropy ./cmd/orly-sync-negentropy |
||||
CGO_ENABLED=0 go build -o orly-launcher ./cmd/orly-launcher |
||||
``` |
||||
|
||||
**systemd service configuration:** |
||||
|
||||
```ini |
||||
[Service] |
||||
ExecStart=/path/to/orly-launcher |
||||
|
||||
# Database service |
||||
Environment=ORLY_LAUNCHER_DB_BACKEND=badger |
||||
Environment=ORLY_LAUNCHER_DB_BINARY=/path/to/orly-db-badger |
||||
Environment=ORLY_LAUNCHER_DB_LISTEN=127.0.0.1:50051 |
||||
|
||||
# Negentropy service |
||||
Environment=ORLY_LAUNCHER_SYNC_NEGENTROPY_ENABLED=true |
||||
Environment=ORLY_LAUNCHER_SYNC_NEGENTROPY_BINARY=/path/to/orly-sync-negentropy |
||||
Environment=ORLY_LAUNCHER_SYNC_NEGENTROPY_LISTEN=127.0.0.1:50064 |
||||
Environment=ORLY_SYNC_NEGENTROPY_PEERS=wss://relay.orly.dev |
||||
|
||||
# Relay configuration |
||||
Environment=ORLY_LAUNCHER_RELAY_BINARY=/path/to/orly |
||||
Environment=ORLY_DB_TYPE=grpc |
||||
Environment=ORLY_GRPC_SERVER=127.0.0.1:50051 |
||||
Environment=ORLY_NEGENTROPY_ENABLED=true |
||||
Environment=ORLY_SYNC_TYPE=grpc |
||||
Environment=ORLY_GRPC_SYNC_NEGENTROPY=127.0.0.1:50064 |
||||
``` |
||||
|
||||
### 2. Neo4j Backend with Negentropy |
||||
|
||||
For Neo4j deployments, use `orly-db-neo4j`: |
||||
|
||||
```bash |
||||
CGO_ENABLED=0 go build -o orly-db-neo4j ./cmd/orly-db-neo4j |
||||
``` |
||||
|
||||
**Configuration:** |
||||
|
||||
```ini |
||||
# Database service (Neo4j) |
||||
Environment=ORLY_LAUNCHER_DB_BACKEND=neo4j |
||||
Environment=ORLY_LAUNCHER_DB_BINARY=/path/to/orly-db-neo4j |
||||
Environment=ORLY_LAUNCHER_DB_LISTEN=127.0.0.1:50051 |
||||
Environment=ORLY_NEO4J_URI=bolt://localhost:7687 |
||||
Environment=ORLY_NEO4J_USER=neo4j |
||||
Environment=ORLY_NEO4J_PASSWORD=your_password |
||||
Environment=ORLY_DATA_DIR=/var/lib/orly |
||||
|
||||
# Negentropy and relay (same as Badger) |
||||
Environment=ORLY_LAUNCHER_SYNC_NEGENTROPY_ENABLED=true |
||||
... |
||||
``` |
||||
|
||||
### 3. Docker/Cloudron Deployment |
||||
|
||||
For containerized deployments with supervisord: |
||||
|
||||
**supervisord.conf:** |
||||
|
||||
```ini |
||||
[program:orly-db] |
||||
command=/app/code/orly-db-neo4j |
||||
environment=ORLY_DB_LISTEN="127.0.0.1:50051",ORLY_DATA_DIR="/app/data/ORLY",ORLY_DB_TYPE="neo4j",ORLY_NEO4J_URI="bolt://127.0.0.1:7687",ORLY_NEO4J_USER="neo4j",ORLY_NEO4J_PASSWORD="%(ENV_ORLY_NEO4J_PASSWORD)s" |
||||
priority=15 |
||||
|
||||
[program:orly] |
||||
command=/app/code/orly |
||||
environment=ORLY_DB_TYPE="grpc",ORLY_GRPC_SERVER="127.0.0.1:50051",ORLY_NEGENTROPY_ENABLED="true",ORLY_SYNC_TYPE="grpc",ORLY_GRPC_SYNC_NEGENTROPY="127.0.0.1:50064" |
||||
priority=20 |
||||
|
||||
[program:orly-negentropy] |
||||
command=/app/code/orly-sync-negentropy |
||||
environment=ORLY_LAUNCHER_SYNC_NEGENTROPY_LISTEN="127.0.0.1:50064",ORLY_DB_TYPE="grpc",ORLY_GRPC_SERVER="127.0.0.1:50051",ORLY_SYNC_NEGENTROPY_PEERS="wss://relay.orly.dev" |
||||
priority=25 |
||||
``` |
||||
|
||||
## Environment Variables Reference |
||||
|
||||
### Relay Settings |
||||
|
||||
| Variable | Default | Description | |
||||
|----------|---------|-------------| |
||||
| `ORLY_NEGENTROPY_ENABLED` | false | Enable NIP-77 client support | |
||||
| `ORLY_SYNC_TYPE` | local | Sync backend: `local` or `grpc` | |
||||
| `ORLY_GRPC_SYNC_NEGENTROPY` | | gRPC address of negentropy service | |
||||
|
||||
### Negentropy Service Settings |
||||
|
||||
| Variable | Default | Description | |
||||
|----------|---------|-------------| |
||||
| `ORLY_LAUNCHER_SYNC_NEGENTROPY_ENABLED` | false | Enable negentropy service | |
||||
| `ORLY_LAUNCHER_SYNC_NEGENTROPY_BINARY` | | Path to orly-sync-negentropy binary | |
||||
| `ORLY_LAUNCHER_SYNC_NEGENTROPY_LISTEN` | 127.0.0.1:50064 | gRPC listen address | |
||||
| `ORLY_SYNC_NEGENTROPY_PEERS` | | Comma-separated peer relay URLs | |
||||
| `ORLY_SYNC_NEGENTROPY_INTERVAL` | 60s | Background sync interval | |
||||
| `ORLY_SYNC_NEGENTROPY_FRAME_SIZE` | 4096 | Negentropy protocol frame size | |
||||
| `ORLY_SYNC_NEGENTROPY_ID_SIZE` | 16 | Event ID truncation size | |
||||
| `ORLY_SYNC_NEGENTROPY_SESSION_TIMEOUT` | 5m | Client session timeout | |
||||
|
||||
### Filter Configuration |
||||
|
||||
You can limit which events are synced using filter environment variables: |
||||
|
||||
| Variable | Default | Description | |
||||
|----------|---------|-------------| |
||||
| `ORLY_SYNC_NEGENTROPY_FILTER_KINDS` | | Comma-separated kind numbers to sync | |
||||
| `ORLY_SYNC_NEGENTROPY_FILTER_AUTHORS` | | Comma-separated author pubkeys to sync | |
||||
| `ORLY_SYNC_NEGENTROPY_FILTER_SINCE` | | Unix timestamp: only sync events after this time | |
||||
| `ORLY_SYNC_NEGENTROPY_FILTER_UNTIL` | | Unix timestamp: only sync events before this time | |
||||
|
||||
**Example: Sync only social events** |
||||
|
||||
```bash |
||||
export ORLY_SYNC_NEGENTROPY_FILTER_KINDS=0,1,3,6,7,1984,10000,30000 |
||||
``` |
||||
|
||||
## strfry Interoperability |
||||
|
||||
ORLY's negentropy implementation is compatible with strfry. You can sync events between ORLY and strfry relays. |
||||
|
||||
### Syncing from strfry to ORLY |
||||
|
||||
Configure ORLY to sync from a strfry relay: |
||||
|
||||
```bash |
||||
export ORLY_SYNC_NEGENTROPY_PEERS=wss://strfry-relay.example.com |
||||
``` |
||||
|
||||
### Using strfry CLI to sync with ORLY |
||||
|
||||
strfry can use ORLY as a sync target: |
||||
|
||||
```bash |
||||
# Pull events from ORLY to strfry |
||||
strfry sync wss://your-orly-relay.com --filter '{"kinds": [0, 1, 3]}' --dir down |
||||
|
||||
# Push events from strfry to ORLY |
||||
strfry sync wss://your-orly-relay.com --filter '{"kinds": [0, 1, 3]}' --dir up |
||||
|
||||
# Bidirectional sync |
||||
strfry sync wss://your-orly-relay.com --filter '{"kinds": [0, 1, 3]}' --dir both |
||||
``` |
||||
|
||||
### ORLY CLI Sync Command |
||||
|
||||
ORLY includes a strfry-compatible CLI sync command: |
||||
|
||||
```bash |
||||
# Build the sync binary |
||||
CGO_ENABLED=0 go build -o orly-sync ./cmd/orly |
||||
|
||||
# Pull events from another relay |
||||
./orly-sync sync wss://relay.example.com --filter '{"kinds": [0, 1, 3]}' --dir down |
||||
|
||||
# Push events to another relay |
||||
./orly-sync sync wss://relay.example.com --filter '{"kinds": [0, 1, 3]}' --dir up |
||||
|
||||
# Specify local data directory |
||||
./orly-sync sync wss://relay.example.com --data-dir /path/to/db --dir down |
||||
``` |
||||
|
||||
## Testing |
||||
|
||||
### Docker Compose Test Environment |
||||
|
||||
A test environment for negentropy interop testing is available in `tests/negentropy/`: |
||||
|
||||
```bash |
||||
cd tests/negentropy |
||||
docker compose build |
||||
docker compose up -d |
||||
|
||||
# Run sync test |
||||
./test-sync.sh |
||||
|
||||
# Clean up |
||||
docker compose down -v |
||||
``` |
||||
|
||||
### Verifying Negentropy Support |
||||
|
||||
Check if a relay supports NIP-77: |
||||
|
||||
```bash |
||||
curl -s https://your-relay.com | grep -o '"77"' |
||||
``` |
||||
|
||||
Or check the relay info: |
||||
|
||||
```bash |
||||
curl -s -H "Accept: application/nostr+json" https://your-relay.com | jq '.supported_nips' |
||||
``` |
||||
|
||||
## Troubleshooting |
||||
|
||||
### Common Issues |
||||
|
||||
**1. "negentropy sync starting" but no events synced** |
||||
|
||||
- Verify peer relay URL is correct and accessible |
||||
- Check if peer relay supports NIP-77 |
||||
- Verify network connectivity between relays |
||||
|
||||
**2. "failed to connect to gRPC server"** |
||||
|
||||
- Ensure `orly-db` service is running and ready |
||||
- Check `ORLY_GRPC_SERVER` matches the database listen address |
||||
- Verify firewall allows connections on gRPC ports |
||||
|
||||
**3. High memory usage during sync** |
||||
|
||||
- Reduce `ORLY_SYNC_NEGENTROPY_FRAME_SIZE` to 2048 or lower |
||||
- Use filters to limit the event set being reconciled |
||||
- Increase sync interval to reduce concurrent operations |
||||
|
||||
### Logging |
||||
|
||||
Enable debug logging for negentropy: |
||||
|
||||
```bash |
||||
export ORLY_LOG_LEVEL=debug |
||||
``` |
||||
|
||||
View sync-specific logs: |
||||
|
||||
```bash |
||||
journalctl -u orly | grep negentropy |
||||
``` |
||||
|
||||
## Architecture |
||||
|
||||
``` |
||||
┌──────────────────┐ |
||||
│ Peer Relays │ |
||||
│ (wss://...) │ |
||||
└────────┬─────────┘ |
||||
│ |
||||
│ NIP-77 WebSocket |
||||
│ |
||||
┌─────────────────────────────┼─────────────────────────────┐ |
||||
│ ▼ │ |
||||
│ ┌─────────────────────────────────────────────────────┐ │ |
||||
│ │ orly-sync-negentropy │ │ |
||||
│ │ (gRPC :50064) │ │ |
||||
│ │ │ │ |
||||
│ │ • Background sync with peers │ │ |
||||
│ │ • Event reconciliation │ │ |
||||
│ │ • Push/pull event exchange │ │ |
||||
│ └──────────────────────┬──────────────────────────────┘ │ |
||||
│ │ │ |
||||
│ │ gRPC │ |
||||
│ │ │ |
||||
│ ┌──────────────────────▼──────────────────────────────┐ │ |
||||
│ │ orly-db │ │ |
||||
│ │ (gRPC :50051) │ │ |
||||
│ │ │ │ |
||||
│ │ • Event storage │ │ |
||||
│ │ • Query execution │ │ |
||||
│ └─────────────────────────────────────────────────────┘ │ |
||||
│ │ |
||||
│ ORLY Server │ |
||||
└────────────────────────────────────────────────────────────┘ |
||||
|
||||
NIP-77 Client Flow: |
||||
Client ─NEG-OPEN──► Relay ──► Negentropy Service |
||||
Client ◄──NEG-MSG── Relay ◄── (reconciliation) |
||||
Client ─NEG-MSG───► Relay ──► (continue) |
||||
Client ◄──EVENT──── Relay ◄── (missing events) |
||||
``` |
||||
|
||||
## See Also |
||||
|
||||
- [IPC Sync Services Architecture](./IPC_SYNC_SERVICES.md) - Technical details of gRPC services |
||||
- [NIP-77 Specification](https://github.com/nostr-protocol/nips/blob/master/77.md) - Protocol specification |
||||
- [strfry sync documentation](https://github.com/hoytech/strfry/blob/master/docs/sync.md) - strfry sync reference |
||||
Loading…
Reference in new issue