Rename SUBSD_* env vars to SUBS_* to match upstream refactor

The upstream SpacesOps app refactored its SUBSD_* environment variables to
SUBS_* (verified against server.js in spacesops/spacesops:v1.0.0). Update the
package to match so the configured values reach the app:

- main.ts: inject SUBS_URI_VALUE / SUBS_RPC_USER / SUBS_RPC_PASSWORD.
- configurePlatform action + storeJson: rename store keys subsd*→subs* and the
  field labels/descriptions (SUBS URL / SUBS RPC User / SUBS RPC Password).
- README, instructions, release notes: SUBSD→SUBS.

Note: the image's /app/setup-spacesops-env.sh still exports SUBSD_* defaults
(partial upstream refactor) — see report; vars the package does not set (e.g.
SUBS_RPC_URL) currently have no in-image default.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-26 12:19:51 -04:00
co-authored by Claude Opus 4.7
parent 35c1013520
commit 147f51d710
7 changed files with 41 additions and 40 deletions
+16 -16
View File
@@ -65,10 +65,10 @@ const inputSpec = InputSpec.of({
minLength: null,
maxLength: null,
}),
subsdUrl: Value.text({
name: i18n('SUBSD URL'),
subsUrl: Value.text({
name: i18n('SUBS URL'),
description: i18n(
'Optional SUBSD service URL (SUBSD_URI_VALUE) for the subname-purchase flow. Leave blank to disable.',
'Optional SUBS service URL (SUBS_URI_VALUE) for the subname-purchase flow. Leave blank to disable.',
),
warning: null,
footnote: null,
@@ -79,9 +79,9 @@ const inputSpec = InputSpec.of({
minLength: null,
maxLength: null,
}),
subsdUser: Value.text({
name: i18n('SUBSD RPC User'),
description: i18n('Optional SUBSD RPC username (SUBSD_RPC_USER).'),
subsUser: Value.text({
name: i18n('SUBS RPC User'),
description: i18n('Optional SUBS RPC username (SUBS_RPC_USER).'),
warning: null,
footnote: null,
default: null,
@@ -91,9 +91,9 @@ const inputSpec = InputSpec.of({
minLength: null,
maxLength: null,
}),
subsdPassword: Value.text({
name: i18n('SUBSD RPC Password'),
description: i18n('Optional SUBSD RPC password (SUBSD_RPC_PASSWORD).'),
subsPassword: Value.text({
name: i18n('SUBS RPC Password'),
description: i18n('Optional SUBS RPC password (SUBS_RPC_PASSWORD).'),
warning: null,
footnote: null,
default: null,
@@ -113,7 +113,7 @@ export const configurePlatform = sdk.Action.withInput(
async ({ effects }) => ({
name: i18n('Configure Platform'),
description: i18n(
'Set optional SpacesOps settings: Nostr relay, theme mode, CoinGecko pricing, and SUBSD backend. Saving restarts the service so the new settings take effect.',
'Set optional SpacesOps settings: Nostr relay, theme mode, CoinGecko pricing, and SUBS backend. Saving restarts the service so the new settings take effect.',
),
warning: null,
allowedStatuses: 'any',
@@ -133,9 +133,9 @@ export const configurePlatform = sdk.Action.withInput(
coingeckoApiKey: store?.coingeckoApiKey ?? null,
coingeckoTokenCoins:
store?.coingeckoTokenCoins ?? DEFAULT_COINGECKO_TOKEN_COINS,
subsdUrl: store?.subsdUrl ?? null,
subsdUser: store?.subsdUser ?? null,
subsdPassword: store?.subsdPassword ?? null,
subsUrl: store?.subsUrl ?? null,
subsUser: store?.subsUser ?? null,
subsPassword: store?.subsPassword ?? null,
}
},
@@ -146,9 +146,9 @@ export const configurePlatform = sdk.Action.withInput(
platformMode: input.platformMode,
coingeckoApiKey: input.coingeckoApiKey || null,
coingeckoTokenCoins: input.coingeckoTokenCoins || null,
subsdUrl: input.subsdUrl || null,
subsdUser: input.subsdUser || null,
subsdPassword: input.subsdPassword || null,
subsUrl: input.subsUrl || null,
subsUser: input.subsUser || null,
subsPassword: input.subsPassword || null,
})
return {
+3 -3
View File
@@ -13,9 +13,9 @@ const shape = z.object({
operatorRelay: z.string().nullable().catch(null),
coingeckoApiKey: z.string().nullable().catch(null),
coingeckoTokenCoins: z.string().nullable().catch(null),
subsdUrl: z.string().nullable().catch(null),
subsdUser: z.string().nullable().catch(null),
subsdPassword: z.string().nullable().catch(null),
subsUrl: z.string().nullable().catch(null),
subsUser: z.string().nullable().catch(null),
subsPassword: z.string().nullable().catch(null),
})
export const storeJson = FileHelper.json(
+7 -7
View File
@@ -9,14 +9,14 @@ const dict = {
'Optional CoinGecko API key (COINGECKO_API_KEY) used for pricing features. Leave blank to disable pricing.': 5,
'CoinGecko Token Coins': 6,
'The CoinGecko coin id(s) to price against (COINGECKO_TOKEN_COINS).': 7,
'SUBSD URL': 8,
'Optional SUBSD service URL (SUBSD_URI_VALUE) for the subname-purchase flow. Leave blank to disable.': 9,
'SUBSD RPC User': 10,
'Optional SUBSD RPC username (SUBSD_RPC_USER).': 11,
'SUBSD RPC Password': 12,
'Optional SUBSD RPC password (SUBSD_RPC_PASSWORD).': 13,
'SUBS URL': 8,
'Optional SUBS service URL (SUBS_URI_VALUE) for the subname-purchase flow. Leave blank to disable.': 9,
'SUBS RPC User': 10,
'Optional SUBS RPC username (SUBS_RPC_USER).': 11,
'SUBS RPC Password': 12,
'Optional SUBS RPC password (SUBS_RPC_PASSWORD).': 13,
'Configure Platform': 14,
'Set optional SpacesOps settings: Nostr relay, theme mode, CoinGecko pricing, and SUBSD backend. Saving restarts the service so the new settings take effect.': 15,
'Set optional SpacesOps settings: Nostr relay, theme mode, CoinGecko pricing, and SUBS backend. Saving restarts the service so the new settings take effect.': 15,
Success: 16,
'Platform configuration saved. The service is restarting to apply the new settings.': 17,
'Operator Secret Key (hex)': 18,
+3 -3
View File
@@ -102,9 +102,9 @@ export const main = sdk.setupMain(async ({ effects }) => {
if (store.coingeckoApiKey) env.COINGECKO_API_KEY = store.coingeckoApiKey
if (store.coingeckoTokenCoins)
env.COINGECKO_TOKEN_COINS = store.coingeckoTokenCoins
if (store.subsdUrl) env.SUBSD_URI_VALUE = store.subsdUrl
if (store.subsdUser) env.SUBSD_RPC_USER = store.subsdUser
if (store.subsdPassword) env.SUBSD_RPC_PASSWORD = store.subsdPassword
if (store.subsUrl) env.SUBS_URI_VALUE = store.subsUrl
if (store.subsUser) env.SUBS_RPC_USER = store.subsUser
if (store.subsPassword) env.SUBS_RPC_PASSWORD = store.subsPassword
return sdk.Daemons.of(effects).addDaemon('spacesops', {
subcontainer: sub,
+1 -1
View File
@@ -8,7 +8,7 @@ export const v_1_0_0_0 = VersionInfo.of({
- Depends on the Spaces service and auto-connects to its spaced JSON-RPC at spaces.startos:7225 by reading the Spaces RPC credentials from the mounted Spaces volume.
- Generates a Nostr operator keypair and a strong session secret on first install. "Show Operator Credentials" and "Import Operator Key" actions manage the keypair.
- "Show Admin Credentials" surfaces the fixed, well-known admin login baked into the image, with a warning to keep the service private.
- "Configure Platform" optionally sets the Nostr relay, theme mode, CoinGecko pricing, and SUBSD backend.`,
- "Configure Platform" optionally sets the Nostr relay, theme mode, CoinGecko pricing, and SUBS backend.`,
},
migrations: {
up: async ({ effects }) => {},