Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
A Nostr Team Relay with additional controls for kinds, blossom media mirroring, and scheduled notes
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗This relay software provides a Nostr relay to a team. This is a fork of the bitvora team-relay with modifications for Swarm.hivetalk.org
In the .env file, the team domain is used to reject non team members, only members in nostr.json are allowed for the specified team domain.
Additional features we added for production use:
PUBLIC_ALLOWED_KINDS to allow any pubkey to post specific event kinds (e.g., text notes, reactions)ALLOWED_KINDS remains restricted to team members onlyTRUSTED_CLIENT_NAME and TRUSTED_CLIENT_KINDS for special client access/mirror endpoint to allow for syncing content with other relays/list endpoint to allow for listing content for a specific userSwarm implements a hierarchical access control system with three levels of access:
TRUSTED_CLIENT_NAME and TRUSTED_CLIENT_KINDS["client","<name>"] tag) bypass normal restrictionsPUBLIC_ALLOWED_KINDS to specify which event kinds any pubkey can postPUBLIC_ALLOWED_KINDS="1,6,7" allows any user to post text notes, reposts, and reactionsALLOWED_KINDS for team-member-only event kindsALLOWED_KINDS and PUBLIC_ALLOWED_KINDSSwarm includes comprehensive rate limiting and spam protection:
Create a .env file in the root directory of your project.
Add your environment variables to the .env file. For example:
RELAY_NAME="Swarm"
RELAY_PUBKEY="8ad8f1f78c8e11966242e28a7ca15c936b23a999d5fb91bfe4e4472e2d6eaf55"
RELAY_DESCRIPTION="Swarm Hivetalk Team Relay"
TEAM_DOMAIN="swarm.hivetalk.org" # Optional: Domain where the relay / site is served
NPUB_DOMAIN="hivetalk.org" # Optional: Domain that hosts .well-known/nostr.json (falls back to public/.well-known/nostr.json if not set)
DB_ENGINE="postgres"
# DB_ENGINE="badger" # lmdb, badger, postgres (default: postgres)
# DB_PATH="db/" # only required for badger and lmdb
# Option 1: FOR POSTGRES ONLY: Use DATABASE_URL (takes precedence if set)
DATABASE_URL=postgres://swarm:password@localhost:5437/relay?sslmode=disable
# Option 2: Use individual postgres variables (used if DATABASE_URL is not set)
# POSTGRES_USER=swarm
# POSTGRES_PASSWORD=password
# POSTGRES_DB=relay
# POSTGRES_HOST=localhost
# POSTGRES_PORT=5437
RELAY_PORT="3334"
BLOSSOM_ENABLED="false"
BLOSSOM_PATH="blossom/"
BLOSSOM_URL="http://localhost:3334"
WEBSOCKET_URL="wss://localhost:3334"
# Relay Kind Filtering
# ALLOWED_KINDS: Restricted to team members only (blank = allow all kinds for team members)
# PUBLIC_ALLOWED_KINDS: Any pubkey can post these kinds (blank = public cannot post, only team members)
# Specify comma-separated list of allowed kinds
# Examples:
# ALLOWED_KINDS="" (allow all kinds for team members)
# ALLOWED_KINDS="0,1,5,10002,30311" (only allow specific kinds for team members)
# PUBLIC_ALLOWED_KINDS="1,6,7" (allow any pubkey to post text notes, reposts, reactions)
ALLOWED_KINDS=""
PUBLIC_ALLOWED_KINDS= # (blank = public cannot post, only team members)
# Trusted client override
# Events from this client (via ["client","<name>"] tag) are allowed for the
# configured kinds even if the pubkey is not in nostr.json
# Set TRUSTED_CLIENT_KINDS="all" to allow any kind from the trusted client or as comma separated list of kinds
TRUSTED_CLIENT_NAME=""
TRUSTED_CLIENT_KINDS="all"
# Maximum file upload size in MB (default: 200)
MAX_UPLOAD_SIZE_MB=200
# Allowed hosts for the /mirror endpoint (SSRF protection)
# Leave blank to disable the mirror endpoint entirely
# Specify comma-separated list of allowed hosts (with port if non-standard)
# Examples:
# ALLOWED_MIRROR_HOSTS="blossom.example.com,cdn.example.org"
# ALLOWED_MIRROR_HOSTS="blossom.primal.net,cdn.satellite.earth"
ALLOWED_MIRROR_HOSTS=
# S3/Tigris Storage Backend (optional - defaults to filesystem)
# Use "s3" to store media in S3-compatible storage instead of local filesystem
STORAGE_BACKEND="filesystem" # or "s3"
# S3 Configuration (only required when STORAGE_BACKEND="s3")
# For Tigris on Fly.io: https://fly.storage.tigris.dev
# For Tigris outside Fly.io: https://t3.storage.dev
S3_ENDPOINT=""
S3_BUCKET=""
S3_REGION="auto"
AWS_ACCESS_KEY_ID=""
AWS_SECRET_ACCESS_KEY=""
S3_PUBLIC_URL="" # Optional: https://fly.storage.tigris.dev/your-bucket
For a complete list of all environment variables, see ENV_VARIABLES.md.
Clone the repository:
git clone https://github.com/hivetalk/swarm.git
cd swarm
Build the application:
# Build and run the Go server
go build -o swarm
./swarm
If any issues with building for lmdb on ubuntu:
sudo apt-get update
sudo apt-get install -y liblmdb-dev build-essential
From the repo root:
docker build -t hivetalk/swarm .
Make sure you have a .env file in the project root (see Setting Environment Variables), then run:
docker run --rm \
--name swarm-relay \
-p 3334:3334 \
--env-file .env \
hivetalk/swarm
If you change RELAY_PORT in .env, update the -p mapping accordingly (e.g. -p 7447:7447).
The docker-compose.yml runs the Swarm relay using the badger database engine (no external database required). Environment variables are read from a .env file with sensible defaults.
# 1. Copy and customize environment variables
cp .env.example .env
# Edit .env with your values
# 2. Start everything
docker compose up -d
# Or start with build
docker compose up -d --build
To override specific variables without editing .env:
RELAY_NAME="My Relay" docker compose up -d
To use a different env file:
docker compose --env-file .env.production up -d
Create a systemd service file:
sudo nano /etc/systemd/system/team-relay.service
Add the following content to the service file: (update paths and usernames as needed)
[Unit]
Description=Team Relay
After=network.target
[Service]
ExecStart=/path/to/yourappname
WorkingDirectory=/path/to/team-relay
EnvironmentFile=/path/to/team-relay/.env
Restart=always
User=ubuntu
[Install]
WantedBy=multi-user.target
Reload the systemd daemon:
sudo systemctl daemon-reload
Enable and start the service:
sudo systemctl enable team-relay
sudo systemctl start team-relay
Check the status of the service:
sudo systemctl status team-relay
Your team relay will be running at localhost:3334. Feel free to serve it with nginx or any other reverse proxy.