feat(relay): retire the legacy hosted relay from the app + servers

Verified the legacy relay held the same 115 events as the new one (0 diff) before removing it, so no data is lost. Drops wss://goskatespots.nostr1.com from the default pools, the DM/CVM/zap relay arrays, and the cvm-server + push-service defaults.
This commit is contained in:
SkateSpots 2026-10-12 13:06:02 +07:00
parent 36d87c273f
commit 6efd6b8deb
10 changed files with 10 additions and 13 deletions

View file

@ -2107,10 +2107,14 @@ The community relay moved off the hosted relay.tools instance
`scripts/systemd/skatespots-health.{service,timer}`. `scripts/systemd/skatespots-health.{service,timer}`.
- **Cutover (2026-10-12):** `SKATE_RELAY` (`src/lib/types.ts`) → the new relay; the - **Cutover (2026-10-12):** `SKATE_RELAY` (`src/lib/types.ts`) → the new relay; the
default pools, the DM/CVM/zap relay arrays, the `cvm-server` + `push-service` default pools, the DM/CVM/zap relay arrays, the `cvm-server` + `push-service`
defaults, and the archive default all point at the new relay **with the legacy defaults, and the archive default all point at the new relay.
relay kept as a fallback**. ⚠️ **Retire the legacy relay only after old native - **Legacy relay retired (2026-10-12):** verified the old relay held the **same 115
clients update** — the web app is instant (Netlify), the APK lags (Zapstore). events** as the new one (0 diff) before changing anything, so nothing is lost.
Until then the old relay still receives writes so old clients can read. `wss://goskatespots.nostr1.com` was then removed from the pools, the servers and
the box env. ⚠️ Old native clients (a pre-update APK) that still point at the old
relay will lose skate content once the relay.tools subscription is cancelled —
cancel only after the Zapstore update has propagated. Historical newsletter text
still names the old relay (left as-is on purpose).
- ⚠️ `relay.skate-spots.org` can show a stale NXDOMAIN in a local resolver cache - ⚠️ `relay.skate-spots.org` can show a stale NXDOMAIN in a local resolver cache
right after creation (our dev box did). Verify with right after creation (our dev box did). Verify with
`curl --resolve relay.skate-spots.org:443:185.18.221.2 …` or from another host. `curl --resolve relay.skate-spots.org:443:185.18.221.2 …` or from another host.

View file

@ -37,7 +37,7 @@ if (!NSEC_HEX) {
process.exit(1); process.exit(1);
} }
const NOSTR_RELAYS = (process.env.NOSTR_RELAYS || "wss://relay.skate-spots.org,wss://goskatespots.nostr1.com") const NOSTR_RELAYS = (process.env.NOSTR_RELAYS || "wss://relay.skate-spots.org")
.split(",") .split(",")
.map((r) => r.trim()) .map((r) => r.trim())
.filter(Boolean); .filter(Boolean);

View file

@ -36,7 +36,7 @@ const env = process.env;
const PORT = Number(env.PORT ?? 8788); const PORT = Number(env.PORT ?? 8788);
const MARKER = (env.PUSH_MARKER ?? 'skatespots').trim(); const MARKER = (env.PUSH_MARKER ?? 'skatespots').trim();
const STORAGE_PATH = env.PUSH_STORAGE_PATH ?? './push-state.json'; const STORAGE_PATH = env.PUSH_STORAGE_PATH ?? './push-state.json';
const RELAYS = (env.PUSH_RELAYS ?? 'wss://relay.skate-spots.org,wss://goskatespots.nostr1.com') const RELAYS = (env.PUSH_RELAYS ?? 'wss://relay.skate-spots.org')
.split(',').map((s) => s.trim()).filter(Boolean); .split(',').map((s) => s.trim()).filter(Boolean);
const LOOKBACK_SECONDS = Number(env.PUSH_LOOKBACK_SECONDS ?? 3 * 24 * 60 * 60); const LOOKBACK_SECONDS = Number(env.PUSH_LOOKBACK_SECONDS ?? 3 * 24 * 60 * 60);
const CHALLENGE_TTL_SECONDS = Number(env.PUSH_CHALLENGE_TTL_SECONDS ?? 5 * 60); const CHALLENGE_TTL_SECONDS = Number(env.PUSH_CHALLENGE_TTL_SECONDS ?? 5 * 60);

View file

@ -54,7 +54,6 @@ const defaultConfig: AppConfig = {
{ url: 'wss://auth.nostr1.com', read: true, write: true }, { url: 'wss://auth.nostr1.com', read: true, write: true },
{ url: 'wss://relay.ditto.pub', read: true, write: true }, { url: 'wss://relay.ditto.pub', read: true, write: true },
{ url: 'wss://relay.skate-spots.org', read: true, write: true }, { url: 'wss://relay.skate-spots.org', read: true, write: true },
{ url: 'wss://goskatespots.nostr1.com', read: true, write: true }, // legacy fallback
{ url: 'wss://purplepag.es', read: true, write: false }, // Profile aggregator - read only { url: 'wss://purplepag.es', read: true, write: false }, // Profile aggregator - read only
], ],
updatedAt: 0, updatedAt: 0,

View file

@ -16,7 +16,6 @@ const DEFAULT_RELAYS = [
{ url: 'wss://auth.nostr1.com', read: true, write: true }, { url: 'wss://auth.nostr1.com', read: true, write: true },
{ url: 'wss://relay.ditto.pub', read: true, write: true }, { url: 'wss://relay.ditto.pub', read: true, write: true },
{ url: SKATE_RELAY, read: true, write: true }, { url: SKATE_RELAY, read: true, write: true },
{ url: 'wss://goskatespots.nostr1.com', read: true, write: true }, // legacy fallback
{ url: 'wss://purplepag.es', read: true, write: false }, // Profile aggregator { url: 'wss://purplepag.es', read: true, write: false }, // Profile aggregator
]; ];

View file

@ -16,7 +16,6 @@ const NEW_USER_RELAYS = [
{ url: 'wss://auth.nostr1.com', read: true, write: true }, { url: 'wss://auth.nostr1.com', read: true, write: true },
{ url: 'wss://relay.ditto.pub', read: true, write: true }, { url: 'wss://relay.ditto.pub', read: true, write: true },
{ url: 'wss://relay.skate-spots.org', read: true, write: true }, { url: 'wss://relay.skate-spots.org', read: true, write: true },
{ url: 'wss://goskatespots.nostr1.com', read: true, write: true }, // legacy fallback
{ url: 'wss://purplepag.es', read: true, write: false }, { url: 'wss://purplepag.es', read: true, write: false },
]; ];

View file

@ -43,7 +43,6 @@ interface PlatformFeePaymentProps {
// Relays the provider should publish the zap receipt to (so we can verify it). // Relays the provider should publish the zap receipt to (so we can verify it).
const ZAP_RECEIPT_RELAYS = [ const ZAP_RECEIPT_RELAYS = [
'wss://relay.skate-spots.org', 'wss://relay.skate-spots.org',
'wss://goskatespots.nostr1.com',
'wss://relay.nostr.band', 'wss://relay.nostr.band',
'wss://relay.damus.io', 'wss://relay.damus.io',
]; ];

View file

@ -30,7 +30,6 @@ import { verifyEvent } from 'nostr-tools';
*/ */
const DATA_RELAYS = [ const DATA_RELAYS = [
'wss://relay.skate-spots.org', 'wss://relay.skate-spots.org',
'wss://goskatespots.nostr1.com',
'wss://relay.ditto.pub', 'wss://relay.ditto.pub',
'wss://relay.damus.io', 'wss://relay.damus.io',
]; ];

View file

@ -51,7 +51,6 @@ const INBOX_DISCOVERY_RELAYS = [
'wss://purplepag.es', 'wss://purplepag.es',
'wss://relay.ditto.pub', 'wss://relay.ditto.pub',
'wss://relay.skate-spots.org', 'wss://relay.skate-spots.org',
'wss://goskatespots.nostr1.com',
'wss://nos.lol', 'wss://nos.lol',
]; ];

View file

@ -30,7 +30,6 @@ export function TestApp({ children }: TestAppProps) {
{ url: 'wss://auth.nostr1.com', read: true, write: true }, { url: 'wss://auth.nostr1.com', read: true, write: true },
{ url: 'wss://relay.ditto.pub', read: true, write: true }, { url: 'wss://relay.ditto.pub', read: true, write: true },
{ url: 'wss://relay.skate-spots.org', read: true, write: true }, { url: 'wss://relay.skate-spots.org', read: true, write: true },
{ url: 'wss://goskatespots.nostr1.com', read: true, write: true }, // legacy fallback
{ url: 'wss://purplepag.es', read: true, write: false }, { url: 'wss://purplepag.es', read: true, write: false },
], ],
updatedAt: 0, updatedAt: 0,