Add headless Angor services and shared-index install guard
Demo images / Build & push demo images (push) Failing after 43s

This commit is contained in:
archipelago
2026-09-30 11:52:19 -04:00
parent 7c4169867c
commit 169bf77de6
24 changed files with 828 additions and 11 deletions
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 24 KiB

+29
View File
@@ -644,6 +644,35 @@
"/var/lib/archipelago/vaultwarden:/data"
]
}
},
{
"id": "angor-indexer",
"title": "Angor Indexer",
"version": "1.0.1",
"description": "Headless Bitcoin indexer endpoint for Angor. Reuses this node’s Mempool and Electrum index; requires a synced, unpruned Bitcoin node. Add this service’s address as the custom indexer in Angor settings. A relay is optional and installed separately.",
"dockerImage": "source.archipelago-foundation.org/chaum/angor-indexer:1.0.1",
"author": "Angor / Archipelago",
"requires": [
"Mempool API",
"Unpruned Bitcoin"
],
"category": "money",
"tier": "optional",
"icon": "/assets/img/app-icons/angor.svg",
"repoUrl": "https://github.com/block-core/angor"
},
{
"id": "angor-relay",
"title": "Angor Relay",
"version": "1.1.2",
"description": "Optional dedicated Nostr relay for Angor project metadata. Separate storage and access settings keep the node’s internal relay private. Add this service’s address to Angor’s relay settings; use WSS for browser clients.",
"dockerImage": "source.archipelago-foundation.org/chaum/angor-relay:1.1.2",
"author": "Angor / Archipelago",
"requires": [],
"category": "nostr",
"tier": "optional",
"icon": "/assets/img/app-icons/angor.svg",
"repoUrl": "https://github.com/hoytech/strfry"
}
]
}
@@ -42,6 +42,8 @@ export const GENERATED_APP_PORTS: Record<string, number> = {
export const GENERATED_APP_TITLES: Record<string, string> = {
"aiui": "AI Assistant",
"alby-hub": "Alby Hub",
"angor-indexer": "Angor Indexer",
"angor-relay": "Angor Relay",
"archipelago-source": "GitWorkshop",
"archy-btcpay-db": "BTCPay Postgres",
"archy-mempool-db": "Mempool MariaDB",
@@ -25,6 +25,15 @@ function makePkg(id: string, title: string, category: string): PackageDataEntry
}
describe('appsConfig service filtering', () => {
it('keeps standalone Angor APIs in Services without a launch button', () => {
for (const id of ['angor-indexer', 'angor-relay']) {
const pkg = makePkg(id, id, 'money')
expect(filterEntriesForTab([[id, pkg]], 'services', 'all')).toHaveLength(1)
expect(filterEntriesForTab([[id, pkg]], 'apps', 'all')).toHaveLength(0)
expect(canLaunch(pkg)).toBe(false)
}
})
it('treats bitcoin stack UI sidecars as services', () => {
expect(isServiceContainer('bitcoin-ui')).toBe(true)
expect(isServiceContainer('lnd-ui')).toBe(true)
@@ -1,5 +1,5 @@
import { afterEach, describe, expect, it } from 'vitest'
import { __setSignedCatalogForTests, portAuth, portIsGateFronted, type SignedAppCatalog } from '../curatedApps'
import { __setSignedCatalogForTests, signedCatalogToApps, portAuth, portIsGateFronted, type SignedAppCatalog } from '../curatedApps'
/** Catalog fragments mirroring the live signed catalog's port declarations
* (releases/app-catalog.json, 2026-09-01). */
@@ -77,3 +77,12 @@ describe('portAuth', () => {
expect(portAuth('mempool-web', 4080)).toBeNull()
})
})
describe('standalone headless services', () => {
it('lists Angor services while keeping shared Mempool and node relay internals hidden', () => {
const apps = signedCatalogToApps(catalog(Object.fromEntries(
['angor-indexer', 'angor-relay', 'mempool-api', 'strfry'].map(id => [id, { version: '1' }]),
)))
expect(apps.map(app => app.id)).toEqual(['angor-indexer', 'angor-relay'])
})
})