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}`.
- **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`
defaults, and the archive default all point at the new relay **with the legacy
relay kept as a fallback**. ⚠️ **Retire the legacy relay only after old native
clients update** — the web app is instant (Netlify), the APK lags (Zapstore).
Until then the old relay still receives writes so old clients can read.
defaults, and the archive default all point at the new relay.
- **Legacy relay retired (2026-10-12):** verified the old relay held the **same 115
events** as the new one (0 diff) before changing anything, so nothing is lost.
`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
right after creation (our dev box did). Verify with
`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);
}
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(",")
.map((r) => r.trim())
.filter(Boolean);

View file

@ -36,7 +36,7 @@ const env = process.env;
const PORT = Number(env.PORT ?? 8788);
const MARKER = (env.PUSH_MARKER ?? 'skatespots').trim();
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);
const LOOKBACK_SECONDS = Number(env.PUSH_LOOKBACK_SECONDS ?? 3 * 24 * 60 * 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://relay.ditto.pub', 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
],
updatedAt: 0,

View file

@ -16,7 +16,6 @@ const DEFAULT_RELAYS = [
{ url: 'wss://auth.nostr1.com', read: true, write: true },
{ url: 'wss://relay.ditto.pub', 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
];

View file

@ -16,7 +16,6 @@ const NEW_USER_RELAYS = [
{ url: 'wss://auth.nostr1.com', 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://goskatespots.nostr1.com', read: true, write: true }, // legacy fallback
{ 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).
const ZAP_RECEIPT_RELAYS = [
'wss://relay.skate-spots.org',
'wss://goskatespots.nostr1.com',
'wss://relay.nostr.band',
'wss://relay.damus.io',
];

View file

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

View file

@ -51,7 +51,6 @@ const INBOX_DISCOVERY_RELAYS = [
'wss://purplepag.es',
'wss://relay.ditto.pub',
'wss://relay.skate-spots.org',
'wss://goskatespots.nostr1.com',
'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://relay.ditto.pub', 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 },
],
updatedAt: 0,