archy/releases/app-catalog.json
archipelago 05c22b6085 fix(mempool): correct frontend container port 4080->8080 (stops restart loop)
The mempool manifest + embedded catalog declared the frontend container
port as 4080, but mempool-frontend nginx listens on 8080 (the stack
creates it as -p 4080:8080 with FRONTEND_HTTP_PORT=8080, see
api/rpc/package/stacks.rs). So every reconcile rendered the quadlet as
PublishPort=4080:4080, disagreed with the working 4080:8080 container,
and restarted it ("port binding drift" -> "host port 4080 did not become
reachable within 5s" -> "host listener disappeared; restarting") in a
perpetual loop on .228. Correcting the manifest container port to 8080
makes the rendered quadlet match reality so the drift/restart loop stops.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 13:49:54 -04:00

4179 lines
127 KiB
JSON

{
"schema": 1,
"updated": "2026-06-28",
"apps": {
"adguardhome": {
"version": "v0.107.55",
"image": "146.59.87.168:3000/lfg2025/adguardhome:v0.107.55"
},
"aiui": {
"version": "0.1.0",
"manifest": {
"app": {
"id": "aiui",
"name": "AI Assistant",
"version": "0.1.0",
"description": "Conversational AI interface for Archipelago. Quarantined \u2014 communicates only via context broker.",
"internal": true,
"container": {
"image": "localhost/archipelago-aiui:latest",
"pull_policy": "always"
},
"resources": {
"cpu_limit": 1,
"memory_limit": "512Mi",
"disk_limit": "1Gi"
},
"security": {
"capabilities": [],
"readonly_root": true,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "isolated",
"apparmor_profile": "aiui"
},
"ports": [
{
"host": 5180,
"container": 80,
"protocol": "tcp",
"bind": "127.0.0.1"
}
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:80",
"path": "/",
"interval": "60s",
"timeout": "5s",
"retries": 3
}
}
}
},
"archy-btcpay-db": {
"version": "15.17",
"manifest": {
"app": {
"id": "archy-btcpay-db",
"name": "BTCPay Postgres",
"version": 15.17,
"description": "Postgres backend for BTCPay and NBXplorer.",
"container": {
"image": "git.tx1138.com/lfg2025/postgres:15.17",
"pull_policy": "if-not-present",
"network": "archy-net",
"data_uid": "100998:100998",
"secret_env": [
{
"key": "POSTGRES_PASSWORD",
"secret_file": "btcpay-db-password"
}
]
},
"dependencies": [
{
"storage": "20Gi"
}
],
"resources": {
"memory_limit": "1Gi",
"disk_limit": "20Gi"
},
"security": {
"capabilities": [
"CHOWN",
"FOWNER",
"SETUID",
"SETGID",
"DAC_OVERRIDE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/postgres-btcpay",
"target": "/var/lib/postgresql/data",
"options": [
"rw"
]
}
],
"environment": [
"POSTGRES_DB=btcpay",
"POSTGRES_USER=btcpay"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:5432",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "none",
"sync_required": false
}
}
}
},
"archy-mempool-db": {
"version": "11.4.10",
"manifest": {
"app": {
"id": "archy-mempool-db",
"name": "Mempool MariaDB",
"version": "11.4.10",
"description": "MariaDB backend for the mempool explorer stack.",
"container": {
"image": "git.tx1138.com/lfg2025/mariadb:11.4.10",
"pull_policy": "if-not-present",
"network": "archy-net",
"data_uid": "100998:100998",
"secret_env": [
{
"key": "MYSQL_PASSWORD",
"secret_file": "mempool-db-password"
},
{
"key": "MYSQL_ROOT_PASSWORD",
"secret_file": "mysql-root-db-password"
}
]
},
"dependencies": [
{
"storage": "20Gi"
}
],
"resources": {
"memory_limit": "512Mi",
"disk_limit": "20Gi"
},
"security": {
"capabilities": [
"CHOWN",
"FOWNER",
"SETUID",
"SETGID",
"DAC_OVERRIDE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/mysql-mempool",
"target": "/var/lib/mysql",
"options": [
"rw"
]
}
],
"environment": [
"MYSQL_DATABASE=mempool",
"MYSQL_USER=mempool"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:3306",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "none",
"sync_required": false
}
}
}
},
"archy-mempool-web": {
"version": "3.0.1",
"manifest": {
"app": {
"id": "archy-mempool-web",
"name": "Mempool Web",
"version": "3.0.1",
"description": "Frontend web UI for mempool explorer.",
"container_name": "mempool",
"container": {
"image": "146.59.87.168:3000/lfg2025/mempool-frontend:v3.0.1",
"pull_policy": "if-not-present",
"network": "archy-net"
},
"dependencies": [
{
"app_id": "mempool-api",
"version": ">=3.0.0"
}
],
"resources": {
"memory_limit": "512Mi"
},
"security": {
"capabilities": [],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 4080,
"container": 8080,
"protocol": "tcp"
}
],
"environment": [
"FRONTEND_HTTP_PORT=8080",
"BACKEND_MAINNET_HTTP_HOST=mempool-api"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:8080",
"path": "/",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "none",
"sync_required": false
}
}
}
},
"archy-nbxplorer": {
"version": "2.6.0",
"manifest": {
"app": {
"id": "archy-nbxplorer",
"name": "NBXplorer",
"version": "2.6.0",
"description": "BTCPay blockchain indexer service.",
"container": {
"image": "git.tx1138.com/lfg2025/nbxplorer:2.6.0",
"pull_policy": "if-not-present",
"network": "archy-net",
"secret_env": [
{
"key": "NBXPLORER_BTCRPCPASSWORD",
"secret_file": "bitcoin-rpc-password"
},
{
"key": "BTCPAY_DB_PASS",
"secret_file": "btcpay-db-password"
}
]
},
"dependencies": [
{
"app_id": "bitcoin-core",
"version": ">=26.0"
},
{
"app_id": "archy-btcpay-db",
"version": ">=15.17"
}
],
"resources": {
"memory_limit": "2Gi",
"disk_limit": "20Gi"
},
"security": {
"capabilities": [],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 32838,
"container": 32838,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/nbxplorer",
"target": "/data",
"options": [
"rw"
]
}
],
"environment": [
"NBXPLORER_DATADIR=/data",
"NBXPLORER_NETWORK=mainnet",
"NBXPLORER_CHAINS=btc",
"NBXPLORER_BIND=0.0.0.0:32838",
"NBXPLORER_BTCRPCURL=http://bitcoin-knots:8332",
"NBXPLORER_BTCRPCUSER=archipelago",
"NBXPLORER_BTCNODEENDPOINT=bitcoin-knots:8333",
"NBXPLORER_NOAUTH=1",
"NBXPLORER_POSTGRES=Username=btcpay;Password=${BTCPAY_DB_PASS};Host=archy-btcpay-db;Port=5432;Database=nbxplorer"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:32838",
"path": "/",
"interval": "30s",
"timeout": "30s",
"retries": 5
},
"bitcoin_integration": {
"rpc_access": "read-only",
"sync_required": true
}
}
}
},
"bitcoin-core": {
"version": "28.4.0",
"manifest": {
"app": {
"id": "bitcoin-core",
"name": "Bitcoin Core",
"version": "28.4.0",
"description": "Reference Bitcoin Core node with dynamic prune/full-mode startup based on host disk.",
"container_name": "bitcoin-core",
"container": {
"image": "146.59.87.168:3000/lfg2025/bitcoin:28.4",
"pull_policy": "if-not-present",
"network": "archy-net",
"entrypoint": [
"sh",
"-lc"
],
"custom_args": [
"BITCOIND=\"$(command -v bitcoind || true)\"; if [ -z \"$BITCOIND\" ]; then\n BITCOIND=\"$(find /opt -path '*/bin/bitcoind' -type f 2>/dev/null | sort | tail -n 1)\";\nfi; if [ -z \"$BITCOIND\" ]; then\n echo \"bitcoind not found in image\" >&2;\n exit 127;\nfi; RPC_USER=\"$(printenv BITCOIN_RPC_USER)\"; RPC_PASS=\"$(printenv BITCOIN_RPC_PASS)\"; RPC_TXRELAY_AUTH=\"$(printenv BITCOIN_RPC_TXRELAY_RPCAUTH || true)\"; DISK_GB_VALUE=\"$(printenv DISK_GB || true)\"; RPC_HEADROOM=\"-rpcthreads=16 -rpcworkqueue=256\"; RPC_TXRELAY_FLAGS=\"-rpcwhitelistdefault=0\"; if [ -n \"$RPC_TXRELAY_AUTH\" ]; then\n RPC_TXRELAY_FLAGS=\"$RPC_TXRELAY_FLAGS -rpcauth=$RPC_TXRELAY_AUTH -rpcwhitelist=txrelay:sendrawtransaction,submitpackage,testmempoolaccept,getmempoolinfo,getrawmempool,getmempoolentry,getnetworkinfo,getblockchaininfo,getblockcount,getblockhash,getblock,getblockheader,getrawtransaction,gettxout,gettxspendingprevout,decoderawtransaction,decodescript,estimatesmartfee,uptime,ping,getconnectioncount,getpeerinfo,getindexinfo,getdeploymentinfo,getchaintips\";\nfi; if [ \"${DISK_GB_VALUE:-0}\" -lt 1000 ]; then\n exec \"$BITCOIND\" -datadir=/home/bitcoin/.bitcoin -noconf -server=1 -prune=550 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=1024 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS -rpcuser=\"$RPC_USER\" -rpcpassword=\"$RPC_PASS\";\nelse\n exec \"$BITCOIND\" -datadir=/home/bitcoin/.bitcoin -noconf -server=1 -txindex=1 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=4096 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS -rpcuser=\"$RPC_USER\" -rpcpassword=\"$RPC_PASS\";\nfi"
],
"derived_env": [
{
"key": "DISK_GB",
"template": "{{DISK_GB}}"
}
],
"secret_env": [
{
"key": "BITCOIN_RPC_PASS",
"secret_file": "bitcoin-rpc-password"
},
{
"key": "BITCOIN_RPC_TXRELAY_RPCAUTH",
"secret_file": "bitcoin-rpc-txrelay-rpcauth"
}
],
"data_uid": "100101:100101"
},
"dependencies": [
{
"storage": "500Gi"
}
],
"resources": {
"cpu_limit": 0,
"memory_limit": "4Gi",
"disk_limit": "500Gi"
},
"security": {
"capabilities": [
"CHOWN",
"FOWNER",
"SETUID",
"SETGID",
"DAC_OVERRIDE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 8332,
"container": 8332,
"protocol": "tcp"
},
{
"host": 8333,
"container": 8333,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/bitcoin",
"target": "/home/bitcoin/.bitcoin",
"options": [
"rw"
]
}
],
"environment": [
"BITCOIN_RPC_USER=archipelago"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:8332",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "admin",
"sync_required": true,
"testnet_support": false,
"pruning_support": true
}
}
}
},
"bitcoin-knots": {
"version": "latest",
"image": "146.59.87.168:3000/lfg2025/bitcoin-knots:latest",
"manifest": {
"app": {
"id": "bitcoin-knots",
"name": "Bitcoin Knots",
"version": "28.1.0",
"description": "Full Bitcoin Knots node with dynamic prune/full-mode startup based on host disk.",
"container_name": "bitcoin-knots",
"container": {
"image": "146.59.87.168:3000/lfg2025/bitcoin-knots:latest",
"pull_policy": "if-not-present",
"network": "archy-net",
"entrypoint": [
"sh",
"-lc"
],
"custom_args": [
"BITCOIND=\"$(command -v bitcoind || true)\"; if [ -z \"$BITCOIND\" ]; then\n BITCOIND=\"$(find /opt -path '*/bin/bitcoind' -type f 2>/dev/null | sort | tail -n 1)\";\nfi; if [ -z \"$BITCOIND\" ]; then\n echo \"bitcoind not found in image\" >&2;\n exit 127;\nfi; RPC_USER=\"$(printenv BITCOIN_RPC_USER)\"; RPC_PASS=\"$(printenv BITCOIN_RPC_PASS)\"; RPC_TXRELAY_AUTH=\"$(printenv BITCOIN_RPC_TXRELAY_RPCAUTH || true)\"; DISK_GB_VALUE=\"$(printenv DISK_GB || true)\"; RPC_HEADROOM=\"-rpcthreads=16 -rpcworkqueue=256\"; RPC_TXRELAY_FLAGS=\"-rpcwhitelistdefault=0\"; if [ -n \"$RPC_TXRELAY_AUTH\" ]; then\n RPC_TXRELAY_FLAGS=\"$RPC_TXRELAY_FLAGS -rpcauth=$RPC_TXRELAY_AUTH -rpcwhitelist=txrelay:sendrawtransaction,submitpackage,testmempoolaccept,getmempoolinfo,getrawmempool,getmempoolentry,getnetworkinfo,getblockchaininfo,getblockcount,getblockhash,getblock,getblockheader,getrawtransaction,gettxout,gettxspendingprevout,decoderawtransaction,decodescript,estimatesmartfee,uptime,ping,getconnectioncount,getpeerinfo,getindexinfo,getdeploymentinfo,getchaintips\";\nfi; if [ \"${DISK_GB_VALUE:-0}\" -lt 1000 ]; then\n exec \"$BITCOIND\" -datadir=/home/bitcoin/.bitcoin -noconf -server=1 -prune=550 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=2048 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS -rpcuser=\"$RPC_USER\" -rpcpassword=\"$RPC_PASS\";\nelse\n exec \"$BITCOIND\" -datadir=/home/bitcoin/.bitcoin -noconf -server=1 -txindex=1 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=4096 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS -rpcuser=\"$RPC_USER\" -rpcpassword=\"$RPC_PASS\";\nfi"
],
"derived_env": [
{
"key": "DISK_GB",
"template": "{{DISK_GB}}"
}
],
"secret_env": [
{
"key": "BITCOIN_RPC_PASS",
"secret_file": "bitcoin-rpc-password"
},
{
"key": "BITCOIN_RPC_TXRELAY_RPCAUTH",
"secret_file": "bitcoin-rpc-txrelay-rpcauth"
}
],
"data_uid": "100101:100101"
},
"dependencies": [
{
"storage": "500Gi"
}
],
"resources": {
"cpu_limit": 0,
"memory_limit": "8Gi",
"disk_limit": "500Gi"
},
"security": {
"capabilities": [
"CHOWN",
"FOWNER",
"SETUID",
"SETGID",
"DAC_OVERRIDE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 8332,
"container": 8332,
"protocol": "tcp"
},
{
"host": 8333,
"container": 8333,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/bitcoin",
"target": "/home/bitcoin/.bitcoin",
"options": [
"rw"
]
}
],
"environment": [
"BITCOIN_RPC_USER=archipelago"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:8332",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "admin",
"sync_required": true,
"testnet_support": false,
"pruning_support": true
}
}
}
},
"bitcoin-ui": {
"version": "1.7.84-alpha",
"image": "146.59.87.168:3000/lfg2025/bitcoin-ui:1.7.84-alpha",
"manifest": {
"app": {
"id": "bitcoin-ui",
"name": "Bitcoin UI",
"version": "1.0.0",
"description": "Archipelago-native HTTP proxy + static site for interacting with the\nBitcoin Core / Bitcoin Knots JSON-RPC. Runs nginx inside a container\nand reverse-proxies /bitcoin-rpc/ to 127.0.0.1:8332 on the host. The\nupstream Authorization header is substituted from\n/var/lib/archipelago/secrets/bitcoin-rpc-password by the prod\norchestrator's pre-start hook, rendered into an nginx.conf that is\nbind-mounted read-only at container start.\n",
"container": {
"build": {
"context": "/opt/archipelago/docker/bitcoin-ui",
"dockerfile": "Dockerfile",
"tag": "localhost/bitcoin-ui:local"
}
},
"dependencies": [
{
"app_id": "bitcoin-core"
}
],
"resources": {
"memory_limit": "128Mi"
},
"security": {
"readonly_root": false,
"network_policy": "host"
},
"ports": [],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/bitcoin-ui/nginx.conf",
"target": "/etc/nginx/conf.d/default.conf",
"options": [
"ro"
]
}
],
"environment": [],
"health_check": {
"type": "http",
"endpoint": "http://127.0.0.1:8334",
"path": "/",
"interval": "30s",
"timeout": "5s",
"retries": 3
}
}
}
},
"botfights": {
"version": "1.1.0",
"manifest": {
"app": {
"id": "botfights",
"name": "BotFights",
"version": "1.1.0",
"description": "Bot competition arena with 2-player arcade fighting mode. AI bots battle in trivia challenges while humans duke it out with controllers. Built for Bitcoiners.",
"category": "community",
"container": {
"image": "146.59.87.168:3000/lfg2025/botfights:1.1.0",
"pull_policy": "always"
},
"dependencies": [
{
"storage": "500Mi"
}
],
"resources": {
"cpu_limit": 2,
"memory_limit": "512Mi",
"disk_limit": "500Mi"
},
"security": {
"capabilities": [],
"readonly_root": true,
"no_new_privileges": true,
"user": 1001,
"seccomp_profile": "default",
"network_policy": "bridge",
"apparmor_profile": "default"
},
"ports": [
{
"host": 9100,
"container": 9100,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "botfights-data",
"target": "/app/server/data"
},
{
"type": "tmpfs",
"target": "/tmp",
"options": [
"rw",
"noexec",
"nosuid",
"size=64m"
]
}
],
"environment": [
"NODE_ENV=production"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:9100",
"path": "/api/health",
"interval": "30s",
"timeout": "10s",
"retries": 3,
"start_period": "30s"
},
"interfaces": {
"main": {
"name": "Web UI",
"description": "Bot arena and arcade fighter with controller support",
"type": "ui",
"port": 9100,
"protocol": "http",
"path": "/"
}
},
"metadata": {
"author": "Dorian",
"repo": "https://botfights.net",
"icon": "/assets/img/app-icons/botfights.svg",
"license": "MIT",
"tags": [
"bitcoin",
"gaming",
"arcade",
"fighter",
"bots",
"competition",
"controller"
]
}
}
}
},
"btcpay": {
"version": "2.3.9",
"image": "docker.io/btcpayserver/btcpayserver:2.3.9",
"images": {
"btcpay-server": "docker.io/btcpayserver/btcpayserver:2.3.9",
"archy-nbxplorer": "146.59.87.168:3000/lfg2025/nbxplorer:2.6.0",
"archy-btcpay-db": "146.59.87.168:3000/lfg2025/postgres:15.17"
}
},
"btcpay-server": {
"version": "2.3.9",
"manifest": {
"app": {
"id": "btcpay-server",
"name": "BTCPay Server",
"version": "2.3.9",
"description": "Self-hosted Bitcoin payment processor. Accept Bitcoin payments without intermediaries.",
"container": {
"image": "docker.io/btcpayserver/btcpayserver:2.3.9",
"pull_policy": "if-not-present",
"network": "archy-net",
"secret_env": [
{
"key": "BTCPAY_BTCRPCPASSWORD",
"secret_file": "bitcoin-rpc-password"
},
{
"key": "BTCPAY_DB_PASS",
"secret_file": "btcpay-db-password"
}
],
"derived_env": [
{
"key": "BTCPAY_HOST",
"template": "{{HOST_IP}}:23000"
}
]
},
"dependencies": [
{
"app_id": "bitcoin-core",
"version": ">=26.0"
},
{
"app_id": "archy-btcpay-db",
"version": ">=15.17"
},
{
"app_id": "archy-nbxplorer",
"version": ">=2.6.0"
}
],
"resources": {
"cpu_limit": 2,
"memory_limit": "2Gi",
"disk_limit": "20Gi"
},
"security": {
"capabilities": [],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 23000,
"container": 49392,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/btcpay",
"target": "/datadir",
"options": [
"rw"
]
}
],
"environment": [
"ASPNETCORE_URLS=http://0.0.0.0:49392",
"BTCPAY_PROTOCOL=http",
"BTCPAY_CHAINS=btc",
"BTCPAY_BTCEXPLORERURL=http://archy-nbxplorer:32838",
"BTCPAY_BTCRPCURL=http://bitcoin-knots:8332",
"BTCPAY_BTCRPCUSER=archipelago",
"BTCPAY_POSTGRES=Username=btcpay;Password=${BTCPAY_DB_PASS};Host=archy-btcpay-db;Port=5432;Database=btcpay"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:49392",
"path": "/",
"interval": "30s",
"timeout": "30s",
"retries": 5
},
"bitcoin_integration": {
"rpc_access": "read-only",
"sync_required": true
},
"lightning_integration": {
"payment_processing": false,
"invoice_management": true
},
"interfaces": {
"main": {
"name": "Web UI",
"description": "BTCPay Server dashboard",
"type": "ui",
"port": 23000,
"protocol": "http",
"path": "/"
}
},
"metadata": {
"launch": {
"open_in_new_tab": true
}
}
}
}
},
"core-lightning": {
"version": "23.08.2",
"manifest": {
"app": {
"id": "core-lightning",
"name": "Core Lightning (CLN)",
"version": "23.08.2",
"description": "Lightning Network implementation in C. Lightweight alternative to LND.",
"container": {
"image": "elementsproject/lightningd:v23.08.2",
"image_signature": "cosign://...",
"pull_policy": "verify-signature"
},
"dependencies": [
{
"app_id": "bitcoin-core",
"version": ">=26.0"
}
],
"resources": {
"cpu_limit": 1,
"memory_limit": "512Mi",
"disk_limit": "5Gi"
},
"security": {
"capabilities": [
"NET_BIND_SERVICE"
],
"readonly_root": true,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "isolated",
"apparmor_profile": "core-lightning"
},
"ports": [
{
"host": 9736,
"container": 9735,
"protocol": "tcp"
},
{
"host": 9835,
"container": 9835,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/core-lightning",
"target": "/home/clightning/.lightning",
"options": [
"rw"
]
}
],
"environment": [
"BITCOIND_RPCURL=http://bitcoin-core:8332",
"BITCOIND_RPCUSER=${BITCOIN_RPC_USER}",
"BITCOIND_RPCPASS=${BITCOIN_RPC_PASSWORD}",
"NETWORK=bitcoin"
],
"health_check": {
"type": "exec",
"endpoint": "lightning-cli getinfo",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "admin",
"sync_required": true
},
"lightning_integration": {
"channel_management": true,
"payment_routing": true
}
}
}
},
"cryptpad": {
"version": "2024.12.0",
"image": "146.59.87.168:3000/lfg2025/cryptpad:2024.12.0"
},
"did-wallet": {
"version": "1.0.0",
"manifest": {
"app": {
"id": "did-wallet",
"name": "Web5 DID Wallet",
"version": "1.0.0",
"description": "Web5 wallet with Decentralized Identifier (DID) support. Manage your digital identity and Web5 assets.",
"container": {
"image": "archipelago/did-wallet:1.0.0",
"image_signature": "cosign://...",
"pull_policy": "if-not-present"
},
"dependencies": [
{
"storage": "2Gi"
}
],
"resources": {
"cpu_limit": 1,
"memory_limit": "512Mi",
"disk_limit": "2Gi"
},
"security": {
"capabilities": [],
"readonly_root": true,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "isolated",
"apparmor_profile": "did-wallet"
},
"ports": [
{
"host": 8083,
"container": 8080,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/did-wallet",
"target": "/app/wallet",
"options": [
"rw"
]
}
],
"environment": [
"WALLET_STORAGE=/app/wallet"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:8083",
"path": "/health",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"web5_integration": {
"did_support": true,
"wallet_functionality": true,
"bitcoin_integration": true
}
}
}
},
"electrs-ui": {
"version": "latest",
"image": "146.59.87.168:3000/lfg2025/electrs-ui:latest",
"manifest": {
"app": {
"id": "electrs-ui",
"name": "Electrs UI",
"version": "1.0.0",
"description": "Archipelago-native HTTP frontend for electrs/electrumx status. Runs\nnginx inside a container, serves static assets, and proxies\n/electrs-status to the archipelago backend on 127.0.0.1:5678.\n",
"container": {
"build": {
"context": "/opt/archipelago/docker/electrs-ui",
"dockerfile": "Dockerfile",
"tag": "localhost/electrs-ui:local"
}
},
"dependencies": [],
"resources": {
"memory_limit": "64Mi"
},
"security": {
"readonly_root": false,
"network_policy": "host"
},
"ports": [],
"volumes": [],
"environment": [],
"health_check": {
"type": "http",
"endpoint": "http://127.0.0.1:50002",
"path": "/",
"interval": "30s",
"timeout": "5s",
"retries": 3
}
}
}
},
"electrumx": {
"version": "v1.18.0",
"image": "146.59.87.168:3000/lfg2025/electrumx:v1.18.0",
"manifest": {
"app": {
"id": "electrumx",
"name": "ElectrumX",
"version": "1.18.0",
"description": "Electrum server indexing Bitcoin chain data for lightweight wallet queries.",
"container": {
"image": "146.59.87.168:3000/lfg2025/electrumx:v1.18.0",
"pull_policy": "if-not-present",
"network": "archy-net",
"data_uid": "1000:1000",
"entrypoint": [
"sh",
"-lc"
],
"custom_args": [
"export DAEMON_URL=\"http://archipelago:$(printenv BITCOIN_RPC_PASS)@bitcoin-knots:8332/\"; exec electrumx_server"
],
"secret_env": [
{
"key": "BITCOIN_RPC_PASS",
"secret_file": "bitcoin-rpc-password"
}
]
},
"dependencies": [
{
"app_id": "bitcoin-knots",
"version": ">=26.0"
},
{
"storage": "50Gi"
}
],
"resources": {
"cpu_limit": 0,
"memory_limit": "6Gi",
"disk_limit": "50Gi"
},
"security": {
"capabilities": [
"DAC_OVERRIDE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 50001,
"container": 50001,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/electrumx",
"target": "/data",
"options": [
"rw"
]
}
],
"environment": [
"COIN=Bitcoin",
"DB_DIRECTORY=/data",
"SERVICES=tcp://:50001,rpc://0.0.0.0:8000",
"CACHE_MB=1024",
"MAX_SEND=10000000"
],
"interfaces": {
"main": {
"name": "Web UI",
"description": "ElectrumX server status and connection details",
"type": "ui",
"port": 50002,
"protocol": "http"
}
},
"health_check": {
"type": "tcp",
"endpoint": "localhost:50001",
"interval": "30s",
"timeout": "5s",
"retries": 3,
"start_period": "10m"
},
"bitcoin_integration": {
"rpc_access": "read-only",
"sync_required": true,
"pruning_support": false
}
}
}
},
"fedimint": {
"version": "v0.10.0",
"image": "146.59.87.168:3000/lfg2025/fedimintd:v0.10.0",
"manifest": {
"app": {
"id": "fedimint",
"name": "Fedimint Guardian",
"version": "0.10.0",
"description": "Federated Bitcoin minting service with built-in Guardian UI. Privacy-preserving Bitcoin custody.",
"container": {
"image": "146.59.87.168:3000/lfg2025/fedimintd:v0.10.0",
"pull_policy": "if-not-present",
"network": "archy-net",
"entrypoint": [
"sh",
"-lc"
],
"custom_args": [
"until state=\"$(curl -sS --connect-timeout 5 -m 45 -u \"$FM_BITCOIND_USERNAME:$FM_BITCOIND_PASSWORD\" -H \"Content-Type: application/json\" --data-binary '{\"jsonrpc\":\"1.0\",\"id\":\"fedimint-wait\",\"method\":\"getblockchaininfo\",\"params\":[]}' \"$FM_BITCOIND_URL/\")\" && echo \"$state\" | grep -q '\"initialblockdownload\":false'; do\n echo \"Waiting for Bitcoin RPC sync at $FM_BITCOIND_URL...\";\n sleep 30;\ndone;\nexec fedimintd"
],
"derived_env": [
{
"key": "FM_P2P_URL",
"template": "fedimint://{{HOST_MDNS}}:8173"
},
{
"key": "FM_API_URL",
"template": "ws://{{HOST_MDNS}}:8174"
}
],
"secret_env": [
{
"key": "FM_BITCOIND_PASSWORD",
"secret_file": "bitcoin-rpc-password"
}
],
"data_uid": "1000:1000"
},
"dependencies": [
{
"app_id": "bitcoin-core",
"version": ">=26.0"
},
{
"storage": "20Gi"
}
],
"resources": {
"cpu_limit": 4,
"memory_limit": "4Gi",
"disk_limit": "20Gi"
},
"security": {
"capabilities": [],
"readonly_root": true,
"network_policy": "isolated"
},
"ports": [
{
"host": 8173,
"container": 8173,
"protocol": "tcp"
},
{
"host": 8174,
"container": 8174,
"protocol": "tcp"
},
{
"host": 8177,
"container": 8175,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/fedimint",
"target": "/data",
"options": [
"rw"
]
}
],
"environment": [
"FM_DATA_DIR=/data",
"FM_BITCOIND_URL=http://bitcoin-knots:8332",
"FM_BITCOIND_USERNAME=archipelago",
"FM_BITCOIN_NETWORK=bitcoin",
"FM_BIND_P2P=0.0.0.0:8173",
"FM_BIND_API=0.0.0.0:8174",
"FM_BIND_UI=0.0.0.0:8175"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:8175",
"path": "/",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"interfaces": {
"main": {
"name": "Guardian UI",
"description": "Fedimint Guardian wait/proxy UI",
"type": "ui",
"port": 8175,
"protocol": "http",
"path": "/"
}
},
"bitcoin_integration": {
"rpc_access": "admin",
"sync_required": true
}
}
}
},
"fedimint-clientd": {
"version": "0.8.0",
"manifest": {
"app": {
"id": "fedimint-clientd",
"name": "Fedimint Client",
"version": "0.8.0",
"description": "Fedimint ecash client daemon (fmcd). Lets the node hold Fedimint ecash and join federations; the wallet talks to it over a local REST API.",
"container": {
"image": "146.59.87.168:3000/lfg2025/fmcd:0.8.1",
"pull_policy": "if-not-present",
"network": "archy-net",
"generated_secrets": [
{
"name": "fmcd-password",
"kind": "hex16"
}
],
"secret_env": [
{
"key": "FMCD_PASSWORD",
"secret_file": "fmcd-password"
}
],
"data_uid": "1000:1000"
},
"dependencies": [
{
"storage": "2Gi"
}
],
"resources": {
"cpu_limit": 0.25,
"memory_limit": "1Gi",
"disk_limit": "2Gi"
},
"security": {
"capabilities": [
"CHOWN",
"DAC_OVERRIDE",
"FOWNER",
"SETUID",
"SETGID"
],
"readonly_root": true,
"network_policy": "bridge"
},
"ports": [
{
"host": 8178,
"container": 8080,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/fmcd",
"target": "/data",
"options": [
"rw"
]
}
],
"environment": [
"FMCD_ADDR=0.0.0.0:8080",
"FMCD_MODE=rest",
"FMCD_DATA_DIR=/data",
"FMCD_INVITE_CODE=fed11qgqyj3mfwfhksw309uuxywtxxfjrjc35xuexverpxdsnxcnrxucxvenzveskgc3kvvun2c34xp3k2ep38yunzdpexcekxe3hvd3rvvmx8pnrvdenx5mnzvtzqqqjqt0t6pc3s5z0ynqjw9s4njf6svwgu59kweawc0vvrddcjeemw6yyn4pcdp"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:8080",
"interval": "30s",
"timeout": "5s",
"retries": 3
}
}
}
},
"fedimint-gateway": {
"version": "v0.10.0",
"image": "146.59.87.168:3000/lfg2025/gatewayd:v0.10.0",
"manifest": {
"app": {
"id": "fedimint-gateway",
"name": "Fedimint Gateway",
"version": "0.10.0",
"description": "Fedimint gateway service with automatic LND-or-LDK backend selection.",
"container": {
"image": "git.tx1138.com/lfg2025/gatewayd:v0.10.0",
"pull_policy": "if-not-present",
"network": "archy-net",
"entrypoint": [
"sh",
"-lc"
],
"custom_args": [
"if [ -f /lnd/tls.cert ] && [ -f /lnd/data/chain/bitcoin/mainnet/admin.macaroon ]; then\n exec gatewayd --data-dir /data --listen 0.0.0.0:8176 --bcrypt-password-hash \"$FEDI_HASH\" --network bitcoin --bitcoind-url http://host.archipelago:8332 --bitcoind-username \"$FM_BITCOIND_USERNAME\" --bitcoind-password \"$FM_BITCOIND_PASSWORD\" lnd --lnd-rpc-host lnd:10009 --lnd-tls-cert /lnd/tls.cert --lnd-macaroon /lnd/data/chain/bitcoin/mainnet/admin.macaroon;\nelse\n exec gatewayd --data-dir /data --listen 0.0.0.0:8176 --bcrypt-password-hash \"$FEDI_HASH\" --network bitcoin --bitcoind-url http://host.archipelago:8332 --bitcoind-username \"$FM_BITCOIND_USERNAME\" --bitcoind-password \"$FM_BITCOIND_PASSWORD\" ldk --ldk-lightning-port 9737 --ldk-alias archipelago-gateway;\nfi"
],
"generated_secrets": [
{
"name": "fedimint-gateway-hash",
"kind": "bcrypt"
}
],
"secret_env": [
{
"key": "FM_BITCOIND_PASSWORD",
"secret_file": "bitcoin-rpc-password"
},
{
"key": "FEDI_HASH",
"secret_file": "fedimint-gateway-hash"
}
],
"data_uid": "1000:1000"
},
"dependencies": [
{
"app_id": "bitcoin-core",
"version": ">=26.0"
},
{
"app_id": "fedimint",
"version": ">=0.10.0"
}
],
"resources": {
"cpu_limit": 2,
"memory_limit": "2Gi",
"disk_limit": "10Gi"
},
"security": {
"capabilities": [],
"readonly_root": true,
"network_policy": "isolated"
},
"ports": [
{
"host": 8176,
"container": 8176,
"protocol": "tcp"
},
{
"host": 9737,
"container": 9737,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/fedimint-gateway",
"target": "/data",
"options": [
"rw"
]
},
{
"type": "bind",
"source": "/var/lib/archipelago/lnd",
"target": "/lnd",
"options": [
"ro"
]
}
],
"environment": [
"FM_BITCOIND_USERNAME=archipelago"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:8176",
"path": "/",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "admin",
"sync_required": true
}
}
}
},
"filebrowser": {
"version": "v2.27.0",
"image": "146.59.87.168:3000/lfg2025/filebrowser:v2.27.0",
"manifest": {
"app": {
"id": "filebrowser",
"name": "File Browser",
"version": "2.27.0",
"description": "Baseline Archipelago file manager service.",
"container": {
"image": "git.tx1138.com/lfg2025/filebrowser:v2.27.0",
"pull_policy": "if-not-present",
"network": "archy-net",
"custom_args": [
"--config",
"/data/.filebrowser.json"
],
"data_uid": "100000:100000"
},
"dependencies": [
{
"storage": "10Gi"
}
],
"resources": {
"memory_limit": "256Mi",
"disk_limit": "10Gi"
},
"security": {
"capabilities": [
"CHOWN",
"FOWNER",
"SETUID",
"SETGID",
"DAC_OVERRIDE",
"NET_BIND_SERVICE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 8083,
"container": 80,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/filebrowser",
"target": "/srv",
"options": [
"rw"
]
},
{
"type": "bind",
"source": "/var/lib/archipelago/filebrowser-data",
"target": "/data",
"options": [
"rw"
]
}
],
"environment": [],
"health_check": {
"type": "http",
"endpoint": "http://localhost:80",
"path": "/health",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "none",
"sync_required": false
}
}
}
},
"fips": {
"version": "v0.1.0",
"image": "146.59.87.168:3000/lfg2025/fips:v0.1.0"
},
"fips-ui": {
"version": "1.0.0",
"manifest": {
"app": {
"id": "fips-ui",
"name": "FIPS Mesh",
"version": "1.0.0",
"description": "Archipelago-native dashboard for the FIPS mesh transport. Runs nginx\ninside a container with host networking, serves a static dashboard on\n:8336, and reverse-proxies /rpc/v1 to the archipelago backend on\n127.0.0.1:5678. All FIPS controls (status, seed anchors, reconnect,\nrestart, and stable-channel daemon updates) go through the existing\nfips.* RPC methods, authenticated by the browser's own archipelago\nsession \u2014 there is no separate secret to manage.\n",
"container": {
"build": {
"context": "/opt/archipelago/docker/fips-ui",
"dockerfile": "Dockerfile",
"tag": "localhost/fips-ui:local"
}
},
"resources": {
"memory_limit": "128Mi"
},
"security": {
"readonly_root": false,
"network_policy": "host"
},
"ports": [],
"volumes": [],
"environment": [],
"health_check": {
"type": "http",
"endpoint": "http://127.0.0.1:8336",
"path": "/",
"interval": "30s",
"timeout": "5s",
"retries": 3
}
}
}
},
"gitea": {
"version": "1.23",
"manifest": {
"app": {
"id": "gitea",
"name": "Gitea",
"version": "1.23",
"description": "Self-hosted Git service with built-in container registry, CI/CD, and package hosting.",
"category": "development",
"container": {
"image": "docker.io/gitea/gitea:1.23",
"pull_policy": "if-not-present"
},
"dependencies": [
{
"storage": "500Mi"
}
],
"resources": {
"memory_limit": "256Mi",
"disk_limit": "500Mi"
},
"security": {
"capabilities": [
"CHOWN",
"FOWNER",
"SETUID",
"SETGID",
"DAC_OVERRIDE",
"NET_BIND_SERVICE"
],
"readonly_root": false,
"no_new_privileges": false,
"network_policy": "bridge"
},
"ports": [
{
"host": 3001,
"container": 3000,
"protocol": "tcp"
},
{
"host": 2222,
"container": 22,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/gitea/data",
"target": "/data",
"options": [
"rw"
]
},
{
"type": "bind",
"source": "/var/lib/archipelago/gitea/config",
"target": "/etc/gitea",
"options": [
"rw"
]
}
],
"environment": [
"GITEA__database__DB_TYPE=sqlite3",
"GITEA__server__SSH_PORT=2222",
"GITEA__server__SSH_LISTEN_PORT=22",
"GITEA__server__LFS_START_SERVER=true",
"GITEA__packages__ENABLED=true",
"GITEA__repository__ENABLE_PUSH_CREATE_USER=true",
"GITEA__repository__ENABLE_PUSH_CREATE_ORG=true"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:3000",
"path": "/",
"interval": "120s",
"timeout": "30s",
"retries": 5
},
"interfaces": {
"main": {
"name": "Web UI",
"description": "Gitea web interface",
"type": "ui",
"port": 3001,
"protocol": "http",
"path": "/"
}
},
"metadata": {
"icon": "/assets/img/app-icons/gitea.svg",
"repo": "https://gitea.com",
"tier": "optional",
"launch": {
"open_in_new_tab": true
},
"features": [
"Git repositories with web UI",
"Built-in container/package registry",
"Issue tracking and pull requests",
"CI/CD via Gitea Actions",
"Lightweight SQLite deployment"
]
},
"nginx_proxy": {
"listen": 3000,
"proxy_pass": "http://127.0.0.1:3001",
"extra_headers": [
"proxy_hide_header X-Frame-Options",
"proxy_hide_header Content-Security-Policy"
]
}
}
}
},
"grafana": {
"version": "10.2.0",
"image": "146.59.87.168:3000/lfg2025/grafana:10.2.0",
"manifest": {
"app": {
"id": "grafana",
"name": "Grafana",
"version": "10.2.0",
"description": "Analytics and monitoring platform. Visualize metrics and create dashboards.",
"container": {
"image": "grafana/grafana:10.2.0",
"image_signature": "cosign://...",
"pull_policy": "if-not-present",
"data_uid": "472:472"
},
"dependencies": [
{
"storage": "5Gi"
}
],
"resources": {
"cpu_limit": 2,
"memory_limit": "1Gi",
"disk_limit": "5Gi"
},
"security": {
"capabilities": [],
"readonly_root": true,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "isolated",
"apparmor_profile": "grafana"
},
"ports": [
{
"host": 3000,
"container": 3000,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/grafana",
"target": "/var/lib/grafana",
"options": [
"rw"
]
}
],
"environment": [
"GF_SECURITY_ADMIN_USER=admin",
"GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD}",
"GF_SERVER_ROOT_URL=http://localhost:3000",
"GF_INSTALL_PLUGINS="
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:3000",
"path": "/api/health",
"interval": "30s",
"timeout": "30s",
"retries": 5
},
"metadata": {
"launch": {
"open_in_new_tab": true
}
}
}
}
},
"homeassistant": {
"version": "2024.1",
"image": "146.59.87.168:3000/lfg2025/home-assistant:2024.1",
"manifest": {
"app": {
"id": "homeassistant",
"name": "Home Assistant",
"version": "2024.1.0",
"description": "Open source home automation platform. Control and monitor your smart home devices.",
"container": {
"image": "146.59.87.168:3000/lfg2025/home-assistant:2024.1",
"pull_policy": "if-not-present",
"network": "pasta"
},
"dependencies": [
{
"storage": "10Gi"
}
],
"resources": {
"cpu_limit": 2,
"memory_limit": "512Mi",
"disk_limit": "10Gi"
},
"security": {
"capabilities": [
"CHOWN",
"FOWNER",
"SETUID",
"SETGID",
"DAC_OVERRIDE",
"NET_BIND_SERVICE",
"NET_RAW"
],
"readonly_root": false,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "isolated",
"apparmor_profile": "home-assistant"
},
"ports": [
{
"host": 8123,
"container": 8123,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/home-assistant",
"target": "/config",
"options": [
"rw"
]
}
],
"devices": [],
"environment": [
"TZ=UTC"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:8123",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"interfaces": {
"main": {
"name": "Web UI",
"description": "Home Assistant dashboard",
"type": "ui",
"port": 8123,
"protocol": "http",
"path": "/"
}
},
"metadata": {
"icon": "/assets/img/app-icons/homeassistant.png",
"category": "home",
"author": "Home Assistant",
"repo": "https://github.com/home-assistant/core",
"launch": {
"open_in_new_tab": true
}
}
}
}
},
"immich": {
"version": "release",
"image": "146.59.87.168:3000/lfg2025/immich-server:release",
"images": {
"immich_server": "146.59.87.168:3000/lfg2025/immich-server:release",
"immich_postgres": "146.59.87.168:3000/lfg2025/immich-postgres:14-vectorchord0.4.3-pgvectors0.2.0",
"immich_redis": "146.59.87.168:3000/lfg2025/redis:7.4.8"
},
"manifest": {
"app": {
"id": "immich",
"name": "Immich",
"version": "2.7.4",
"description": "Self-hosted photo and video backup with mobile apps and search.",
"container_name": "immich_server",
"container": {
"image": "146.59.87.168:3000/lfg2025/immich-server:release",
"pull_policy": "if-not-present",
"network": "archy-net",
"secret_env": [
{
"key": "DB_PASSWORD",
"secret_file": "immich-db-password"
}
]
},
"dependencies": [
{
"app_id": "immich-postgres"
},
{
"app_id": "immich-redis"
},
{
"storage": "200Gi"
}
],
"resources": {
"memory_limit": "2Gi",
"disk_limit": "200Gi"
},
"security": {
"capabilities": [],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 2283,
"container": 2283,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/immich",
"target": "/usr/src/app/upload",
"options": [
"rw"
]
}
],
"environment": [
"DB_HOSTNAME=immich_postgres",
"DB_USERNAME=postgres",
"DB_DATABASE_NAME=immich",
"REDIS_HOSTNAME=immich_redis",
"UPLOAD_LOCATION=/usr/src/app/upload"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:2283",
"path": "/api/server/ping",
"interval": "30s",
"timeout": "5s",
"retries": 20
},
"interfaces": {
"main": {
"name": "Web UI",
"description": "Immich photo library",
"type": "ui",
"port": 2283,
"protocol": "http",
"path": "/"
}
},
"metadata": {
"launch": {
"open_in_new_tab": true
}
}
}
}
},
"immich-postgres": {
"version": "14-vectorchord0.4.3-pgvectors0.2.0",
"manifest": {
"app": {
"id": "immich-postgres",
"name": "Immich Postgres",
"version": "14-vectorchord0.4.3-pgvectors0.2.0",
"description": "Postgres (pgvecto.rs / vectorchord) backend for Immich.",
"container_name": "immich_postgres",
"container": {
"image": "146.59.87.168:3000/lfg2025/immich-postgres:14-vectorchord0.4.3-pgvectors0.2.0",
"pull_policy": "if-not-present",
"network": "archy-net",
"data_uid": "100998:100998",
"generated_secrets": [
{
"name": "immich-db-password",
"kind": "hex32"
}
],
"secret_env": [
{
"key": "POSTGRES_PASSWORD",
"secret_file": "immich-db-password"
}
]
},
"dependencies": [
{
"storage": "40Gi"
}
],
"resources": {
"memory_limit": "2Gi",
"disk_limit": "40Gi"
},
"security": {
"capabilities": [
"CHOWN",
"DAC_OVERRIDE",
"FOWNER",
"SETGID",
"SETUID"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/immich-db",
"target": "/var/lib/postgresql/data",
"options": [
"rw"
]
}
],
"environment": [
"POSTGRES_USER=postgres",
"POSTGRES_DB=immich"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:5432",
"interval": "30s",
"timeout": "5s",
"retries": 3
}
}
}
},
"immich-redis": {
"version": "7-alpine",
"manifest": {
"app": {
"id": "immich-redis",
"name": "Immich Redis",
"version": "7-alpine",
"description": "Valkey (Redis-compatible) cache for Immich.",
"container_name": "immich_redis",
"container": {
"image": "146.59.87.168:3000/lfg2025/valkey:7-alpine",
"pull_policy": "if-not-present",
"network": "archy-net"
},
"dependencies": [],
"resources": {
"memory_limit": "128Mi"
},
"security": {
"capabilities": [
"SETGID",
"SETUID"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [],
"volumes": [],
"environment": [],
"health_check": {
"type": "tcp",
"endpoint": "localhost:6379",
"interval": "30s",
"timeout": "5s",
"retries": 3
}
}
}
},
"indeedhub": {
"version": "1.0.0",
"image": "146.59.87.168:3000/lfg2025/indeedhub:1.0.0",
"images": {
"indeedhub": "146.59.87.168:3000/lfg2025/indeedhub:1.0.0",
"indeedhub-api": "146.59.87.168:3000/lfg2025/indeedhub-api:1.0.0",
"indeedhub-ffmpeg": "146.59.87.168:3000/lfg2025/indeedhub-ffmpeg:1.0.0"
},
"manifest": {
"app": {
"id": "indeedhub",
"name": "IndeeHub",
"version": "1.0.0",
"description": "Bitcoin documentary streaming platform featuring God Bless Bitcoin and other educational content about Bitcoin, sovereignty, and decentralized technology. Sign in with your Nostr identity.",
"category": "community",
"container_name": "indeedhub",
"container": {
"image": "146.59.87.168:3000/lfg2025/indeedhub:1.0.0",
"pull_policy": "if-not-present",
"network": "indeedhub-net"
},
"dependencies": [
{
"app_id": "indeedhub-api"
},
{
"storage": "1Gi"
}
],
"resources": {
"memory_limit": "512Mi",
"disk_limit": "1Gi"
},
"security": {
"capabilities": [
"CHOWN",
"DAC_OVERRIDE",
"SETGID",
"SETUID"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 7778,
"container": 7777,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "tmpfs",
"target": "/run",
"options": [
"rw",
"nosuid",
"nodev",
"size=16m"
]
},
{
"type": "tmpfs",
"target": "/var/cache/nginx",
"options": [
"rw",
"nosuid",
"nodev",
"size=32m"
]
}
],
"environment": [],
"hooks": {
"post_install": [
{
"exec": [
"sed",
"-i",
"/X-Frame-Options/d",
"/etc/nginx/conf.d/default.conf"
]
},
{
"copy_from_host": {
"src": "web-ui/nostr-provider.js",
"dest": "/usr/share/nginx/html/nostr-provider.js"
}
},
{
"exec": [
"sh",
"-c",
"grep -q nostr-provider /etc/nginx/conf.d/default.conf || sed -i 's#</head>#<script src=\"/nostr-provider.js\"></script></head>#' /etc/nginx/conf.d/default.conf"
]
},
{
"exec": [
"nginx",
"-s",
"reload"
]
}
]
},
"health_check": {
"type": "tcp",
"endpoint": "localhost:7777",
"interval": "30s",
"timeout": "5s",
"retries": 5,
"start_period": "30s"
},
"interfaces": {
"main": {
"name": "Web UI",
"description": "Stream Bitcoin documentaries with Nostr identity",
"type": "ui",
"port": 7778,
"protocol": "http",
"path": "/"
}
},
"metadata": {
"author": "Indeehub Team",
"icon": "/assets/img/app-icons/indeedhub.png",
"website": "https://indeedhub.com",
"repo": "https://github.com/indeedhub/indeedhub",
"license": "MIT",
"tags": [
"bitcoin",
"documentary",
"streaming",
"media",
"education",
"nostr"
]
}
}
}
},
"indeedhub-api": {
"version": "1.0.0",
"manifest": {
"app": {
"id": "indeedhub-api",
"name": "IndeedHub API",
"version": "1.0.0",
"description": "IndeedHub backend API (Nostr auth, media, payments).",
"category": "community",
"container_name": "indeedhub-api",
"container": {
"image": "146.59.87.168:3000/lfg2025/indeedhub-api:1.0.0",
"pull_policy": "if-not-present",
"network": "indeedhub-net",
"network_aliases": [
"api"
],
"generated_secrets": [
{
"name": "indeedhub-jwt",
"kind": "hex32"
}
],
"secret_env": [
{
"key": "DATABASE_PASSWORD",
"secret_file": "indeedhub-db-password"
},
{
"key": "AWS_SECRET_KEY",
"secret_file": "indeedhub-minio-password"
},
{
"key": "NOSTR_JWT_SECRET",
"secret_file": "indeedhub-jwt"
}
]
},
"dependencies": [
{
"app_id": "indeedhub-postgres"
},
{
"app_id": "indeedhub-redis"
},
{
"app_id": "indeedhub-minio"
}
],
"resources": {
"memory_limit": "2Gi"
},
"security": {
"capabilities": [],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [],
"volumes": [],
"environment": [
"PORT=4000",
"DATABASE_HOST=postgres",
"DATABASE_PORT=5432",
"DATABASE_USER=indeedhub",
"DATABASE_NAME=indeedhub",
"QUEUE_HOST=redis",
"QUEUE_PORT=6379",
"S3_ENDPOINT=http://minio:9000",
"AWS_REGION=us-east-1",
"AWS_ACCESS_KEY=indeeadmin",
"S3_PUBLIC_BUCKET_NAME=indeedhub-public",
"S3_PRIVATE_BUCKET_NAME=indeedhub-private",
"S3_PUBLIC_BUCKET_URL=/storage",
"NOSTR_JWT_EXPIRES_IN=7d",
"AES_MASTER_SECRET=0123456789abcdef0123456789abcdef",
"ENVIRONMENT=production"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:4000",
"interval": "30s",
"timeout": "5s",
"retries": 10
}
}
}
},
"indeedhub-ffmpeg": {
"version": "1.0.0",
"manifest": {
"app": {
"id": "indeedhub-ffmpeg",
"name": "IndeedHub FFmpeg Worker",
"version": "1.0.0",
"description": "IndeedHub background media transcoding worker.",
"category": "community",
"container_name": "indeedhub-ffmpeg",
"container": {
"image": "146.59.87.168:3000/lfg2025/indeedhub-ffmpeg:1.0.0",
"pull_policy": "if-not-present",
"network": "indeedhub-net",
"secret_env": [
{
"key": "DATABASE_PASSWORD",
"secret_file": "indeedhub-db-password"
},
{
"key": "AWS_SECRET_KEY",
"secret_file": "indeedhub-minio-password"
}
]
},
"dependencies": [
{
"app_id": "indeedhub-api"
}
],
"resources": {
"memory_limit": "4Gi"
},
"security": {
"capabilities": [],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [],
"volumes": [],
"environment": [
"DATABASE_HOST=postgres",
"DATABASE_PORT=5432",
"DATABASE_USER=indeedhub",
"DATABASE_NAME=indeedhub",
"QUEUE_HOST=redis",
"QUEUE_PORT=6379",
"S3_ENDPOINT=http://minio:9000",
"AWS_REGION=us-east-1",
"AWS_ACCESS_KEY=indeeadmin",
"S3_PUBLIC_BUCKET_NAME=indeedhub-public",
"S3_PRIVATE_BUCKET_NAME=indeedhub-private",
"ENVIRONMENT=production",
"AES_MASTER_SECRET=0123456789abcdef0123456789abcdef"
]
}
}
},
"indeedhub-minio": {
"version": "RELEASE.2024-11-07T00-52-20Z",
"manifest": {
"app": {
"id": "indeedhub-minio",
"name": "IndeedHub MinIO",
"version": "RELEASE.2024-11-07T00-52-20Z",
"description": "MinIO S3-compatible object storage for IndeedHub media.",
"category": "community",
"container_name": "indeedhub-minio",
"container": {
"image": "146.59.87.168:3000/lfg2025/minio:RELEASE.2024-11-07T00-52-20Z",
"pull_policy": "if-not-present",
"network": "indeedhub-net",
"network_aliases": [
"minio"
],
"custom_args": [
"server",
"/data"
],
"generated_secrets": [
{
"name": "indeedhub-minio-password",
"kind": "hex32"
}
],
"secret_env": [
{
"key": "MINIO_ROOT_PASSWORD",
"secret_file": "indeedhub-minio-password"
}
]
},
"dependencies": [
{
"storage": "50Gi"
}
],
"resources": {
"memory_limit": "1Gi",
"disk_limit": "50Gi"
},
"security": {
"capabilities": [],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [],
"volumes": [
{
"type": "volume",
"source": "indeedhub-minio-data",
"target": "/data",
"options": [
"rw"
]
}
],
"environment": [
"MINIO_ROOT_USER=indeeadmin"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:9000",
"path": "/minio/health/live",
"interval": "30s",
"timeout": "5s",
"retries": 5
}
}
}
},
"indeedhub-postgres": {
"version": "16.13-alpine",
"manifest": {
"app": {
"id": "indeedhub-postgres",
"name": "IndeedHub Postgres",
"version": "16.13-alpine",
"description": "Postgres database backend for IndeedHub.",
"category": "community",
"container_name": "indeedhub-postgres",
"container": {
"image": "146.59.87.168:3000/lfg2025/postgres:16.13-alpine",
"pull_policy": "if-not-present",
"network": "indeedhub-net",
"network_aliases": [
"postgres"
],
"generated_secrets": [
{
"name": "indeedhub-db-password",
"kind": "hex32"
}
],
"secret_env": [
{
"key": "POSTGRES_PASSWORD",
"secret_file": "indeedhub-db-password"
}
]
},
"dependencies": [
{
"storage": "10Gi"
}
],
"resources": {
"memory_limit": "1Gi",
"disk_limit": "10Gi"
},
"security": {
"capabilities": [
"CHOWN",
"DAC_OVERRIDE",
"FOWNER",
"SETGID",
"SETUID"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [],
"volumes": [
{
"type": "volume",
"source": "indeedhub-postgres-data",
"target": "/var/lib/postgresql/data",
"options": [
"rw"
]
}
],
"environment": [
"POSTGRES_USER=indeedhub",
"POSTGRES_DB=indeedhub"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:5432",
"interval": "30s",
"timeout": "5s",
"retries": 3
}
}
}
},
"indeedhub-redis": {
"version": "7.4.8-alpine",
"manifest": {
"app": {
"id": "indeedhub-redis",
"name": "IndeedHub Redis",
"version": "7.4.8-alpine",
"description": "Redis queue/cache backend for IndeedHub.",
"category": "community",
"container_name": "indeedhub-redis",
"container": {
"image": "146.59.87.168:3000/lfg2025/redis:7.4.8-alpine",
"pull_policy": "if-not-present",
"network": "indeedhub-net",
"network_aliases": [
"redis"
]
},
"dependencies": [
{
"storage": "1Gi"
}
],
"resources": {
"memory_limit": "256Mi"
},
"security": {
"capabilities": [
"SETGID",
"SETUID"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [],
"volumes": [
{
"type": "volume",
"source": "indeedhub-redis-data",
"target": "/data",
"options": [
"rw"
]
}
],
"environment": [],
"health_check": {
"type": "tcp",
"endpoint": "localhost:6379",
"interval": "30s",
"timeout": "5s",
"retries": 3
}
}
}
},
"indeedhub-relay": {
"version": "0.9.0",
"manifest": {
"app": {
"id": "indeedhub-relay",
"name": "IndeedHub Nostr Relay",
"version": "0.9.0",
"description": "nostr-rs-relay backing IndeedHub's Nostr identity + comments.",
"category": "community",
"container_name": "indeedhub-relay",
"container": {
"image": "146.59.87.168:3000/lfg2025/nostr-rs-relay:0.9.0",
"pull_policy": "if-not-present",
"network": "indeedhub-net",
"network_aliases": [
"relay"
]
},
"dependencies": [
{
"storage": "2Gi"
}
],
"resources": {
"memory_limit": "256Mi",
"disk_limit": "2Gi"
},
"security": {
"capabilities": [],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [],
"volumes": [
{
"type": "volume",
"source": "indeedhub-relay-data",
"target": "/usr/src/app/db",
"options": [
"rw"
]
}
],
"environment": [],
"health_check": {
"type": "tcp",
"endpoint": "localhost:8080",
"interval": "30s",
"timeout": "5s",
"retries": 3
}
}
}
},
"jellyfin": {
"version": "10.8.13",
"image": "146.59.87.168:3000/lfg2025/jellyfin:10.8.13",
"manifest": {
"app": {
"id": "jellyfin",
"name": "Jellyfin",
"version": "10.8.13",
"description": "Free media server. Stream movies, music, and photos.",
"container": {
"image": "146.59.87.168:3000/lfg2025/jellyfin:10.8.13",
"pull_policy": "if-not-present",
"network": "pasta"
},
"dependencies": [
{
"storage": "10Gi"
}
],
"resources": {
"memory_limit": "1Gi",
"disk_limit": "10Gi"
},
"security": {
"capabilities": [
"CHOWN",
"FOWNER",
"SETUID",
"SETGID",
"DAC_OVERRIDE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 8096,
"container": 8096,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/jellyfin/config",
"target": "/config",
"options": [
"rw"
]
},
{
"type": "bind",
"source": "/var/lib/archipelago/jellyfin/cache",
"target": "/cache",
"options": [
"rw"
]
}
],
"environment": [],
"health_check": {
"type": "tcp",
"endpoint": "localhost:8096",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"interfaces": {
"main": {
"name": "Web UI",
"description": "Jellyfin media dashboard",
"type": "ui",
"port": 8096,
"protocol": "http",
"path": "/"
}
},
"metadata": {
"icon": "/assets/img/app-icons/jellyfin.webp",
"category": "data",
"author": "Jellyfin",
"repo": "https://github.com/jellyfin/jellyfin"
}
}
}
},
"lightning-stack": {
"version": "0.12.0",
"manifest": {
"app": {
"id": "lightning-stack",
"name": "Lightning Stack",
"version": "0.12.0",
"description": "Complete Lightning Network implementation. Includes LND, CLN, and management tools.",
"container": {
"image": "lightninglabs/lightning-stack:v0.12.0",
"image_signature": "cosign://...",
"pull_policy": "if-not-present"
},
"dependencies": [
{
"app_id": "bitcoin-core",
"version": ">=24.0"
},
{
"storage": "50Gi"
}
],
"resources": {
"cpu_limit": 4,
"memory_limit": "4Gi",
"disk_limit": "50Gi"
},
"security": {
"capabilities": [
"NET_BIND_SERVICE"
],
"readonly_root": true,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "isolated",
"apparmor_profile": "lightning-stack"
},
"ports": [
{
"host": 9737,
"container": 9735,
"protocol": "tcp"
},
{
"host": 10010,
"container": 10009,
"protocol": "tcp"
},
{
"host": 8087,
"container": 8080,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/lightning-stack",
"target": "/root/.lightning",
"options": [
"rw"
]
}
],
"environment": [
"BITCOIND_HOST=bitcoin-core",
"BITCOIND_RPCUSER=${BITCOIN_RPC_USER}",
"BITCOIND_RPCPASS=${BITCOIN_RPC_PASSWORD}",
"NETWORK=mainnet"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:8087",
"path": "/v1/getinfo",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "admin",
"sync_required": true
},
"lightning_integration": {
"channel_management": true,
"payment_routing": true
}
}
}
},
"lnd": {
"version": "v0.18.4-beta",
"image": "146.59.87.168:3000/lfg2025/lnd:v0.18.4-beta",
"manifest": {
"app": {
"id": "lnd",
"name": "LND",
"version": "0.18.4",
"description": "Lightning Network implementation by Lightning Labs. Enables instant, low-cost Bitcoin payments.",
"container": {
"image": "146.59.87.168:3000/lfg2025/lnd:v0.18.4-beta",
"pull_policy": "if-not-present",
"network": "archy-net",
"secret_env": [
{
"key": "BITCOIND_RPCPASS",
"secret_file": "bitcoin-rpc-password"
}
],
"data_uid": "100000:100000"
},
"dependencies": [
{
"app_id": "bitcoin-core",
"version": ">=26.0"
}
],
"resources": {
"cpu_limit": 2,
"memory_limit": "1Gi",
"disk_limit": "10Gi"
},
"security": {
"capabilities": [
"CHOWN",
"FOWNER",
"SETUID",
"SETGID",
"DAC_OVERRIDE",
"NET_RAW"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 9735,
"container": 9735,
"protocol": "tcp"
},
{
"host": 10009,
"container": 10009,
"protocol": "tcp"
},
{
"host": 18080,
"container": 8080,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/lnd",
"target": "/root/.lnd",
"options": [
"rw"
]
}
],
"environment": [
"BITCOIND_HOST=bitcoin-knots",
"BITCOIND_RPCUSER=archipelago",
"NETWORK=mainnet"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:10009",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "admin",
"sync_required": true
},
"lightning_integration": {
"channel_management": true,
"payment_routing": true
}
}
}
},
"lnd-ui": {
"version": "latest",
"image": "146.59.87.168:3000/lfg2025/lnd-ui:latest",
"manifest": {
"app": {
"id": "lnd-ui",
"name": "LND UI",
"version": "1.0.0",
"description": "Archipelago-native HTTP frontend for LND. Runs nginx inside a\ncontainer and serves static assets. LND connection info is fetched\nvia an absolute URL that the host nginx routes to the archipelago\nbackend on 127.0.0.1:5678, so no upstream auth is baked in.\n",
"container": {
"build": {
"context": "/opt/archipelago/docker/lnd-ui",
"dockerfile": "Dockerfile",
"tag": "localhost/lnd-ui:local"
}
},
"dependencies": [
{
"app_id": "lnd"
}
],
"resources": {
"memory_limit": "64Mi"
},
"security": {
"readonly_root": false,
"network_policy": "bridge"
},
"ports": [
{
"host": 18083,
"container": 80,
"protocol": "tcp"
}
],
"volumes": [],
"environment": [],
"health_check": {
"type": "http",
"endpoint": "http://127.0.0.1:18083",
"path": "/",
"interval": "30s",
"timeout": "5s",
"retries": 3
}
}
}
},
"mempool": {
"version": "v3.0.1",
"image": "146.59.87.168:3000/lfg2025/mempool-frontend:v3.0.1",
"images": {
"archy-mempool-web": "146.59.87.168:3000/lfg2025/mempool-frontend:v3.0.1",
"mempool-api": "146.59.87.168:3000/lfg2025/mempool-backend:v3.0.0",
"archy-mempool-db": "146.59.87.168:3000/lfg2025/mariadb:11.4.10"
},
"manifest": {
"app": {
"id": "mempool",
"name": "Mempool Explorer",
"version": "3.0.0",
"description": "Bitcoin mempool and blockchain explorer. Real-time transaction and block visualization.",
"container": {
"image": "146.59.87.168:3000/lfg2025/mempool-frontend:v3.0.1",
"image_signature": "cosign://...",
"pull_policy": "if-not-present"
},
"dependencies": [
{
"app_id": "bitcoin-core",
"version": ">=24.0"
},
{
"storage": "20Gi"
}
],
"resources": {
"cpu_limit": 2,
"memory_limit": "2Gi",
"disk_limit": "20Gi"
},
"security": {
"capabilities": [],
"readonly_root": true,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "isolated",
"apparmor_profile": "mempool"
},
"ports": [
{
"host": 4080,
"container": 8080,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/mempool",
"target": "/data",
"options": [
"rw"
]
}
],
"environment": [
"MEMPOOL_BACKEND=electrum",
"MEMPOOL_BITCOIN_HOST=bitcoin-core",
"MEMPOOL_BITCOIN_PORT=8332",
"MEMPOOL_BITCOIN_USER=${BITCOIN_RPC_USER}",
"MEMPOOL_BITCOIN_PASSWORD=${BITCOIN_RPC_PASSWORD}"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:4080",
"path": "/api/health",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "read-only",
"sync_required": true
}
}
}
},
"mempool-api": {
"version": "3.0.0",
"manifest": {
"app": {
"id": "mempool-api",
"name": "Mempool API",
"version": "3.0.0",
"description": "Backend API for mempool explorer.",
"container": {
"image": "git.tx1138.com/lfg2025/mempool-backend:v3.0.0",
"pull_policy": "if-not-present",
"network": "archy-net",
"derived_env": [
{
"key": "CORE_RPC_HOST",
"template": "{{BITCOIN_HOST}}"
}
],
"secret_env": [
{
"key": "CORE_RPC_PASSWORD",
"secret_file": "bitcoin-rpc-password"
},
{
"key": "DATABASE_PASSWORD",
"secret_file": "mempool-db-password"
}
]
},
"dependencies": [
{
"app_id": "bitcoin-knots",
"version": ">=26.0"
},
{
"app_id": "electrumx",
"version": ">=1.18.0"
},
{
"app_id": "archy-mempool-db",
"version": ">=11.4.10"
}
],
"resources": {
"memory_limit": "2Gi",
"disk_limit": "20Gi"
},
"security": {
"capabilities": [],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 8999,
"container": 8999,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/mempool",
"target": "/data",
"options": [
"rw"
]
}
],
"environment": [
"MEMPOOL_BACKEND=electrum",
"ELECTRUM_HOST=electrumx",
"ELECTRUM_PORT=50001",
"ELECTRUM_TLS_ENABLED=false",
"CORE_RPC_PORT=8332",
"CORE_RPC_USERNAME=archipelago",
"DATABASE_ENABLED=true",
"DATABASE_HOST=archy-mempool-db",
"DATABASE_DATABASE=mempool",
"DATABASE_USERNAME=mempool"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:8999",
"path": "/api/v1/backend-info",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"bitcoin_integration": {
"rpc_access": "read-only",
"sync_required": true,
"pruning_support": false
}
}
}
},
"morphos-server": {
"version": "1.0.0",
"manifest": {
"app": {
"id": "morphos-server",
"name": "MorphOS Server",
"version": "1.0.0",
"description": "MorphOS server platform. Decentralized application server.",
"container": {
"image": "archipelago/morphos-server:1.0.0",
"image_signature": "cosign://...",
"pull_policy": "if-not-present"
},
"dependencies": [
{
"storage": "5Gi"
}
],
"resources": {
"cpu_limit": 2,
"memory_limit": "2Gi",
"disk_limit": "5Gi"
},
"security": {
"capabilities": [],
"readonly_root": true,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "isolated",
"apparmor_profile": "morphos-server"
},
"ports": [
{
"host": 8086,
"container": 8080,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/morphos-server",
"target": "/app/data",
"options": [
"rw"
]
}
],
"environment": [
"MORPHOS_ENV=production",
"MORPHOS_DATA_DIR=/app/data"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:8086",
"path": "/health",
"interval": "30s",
"timeout": "5s",
"retries": 3
}
}
}
},
"netbird": {
"version": "2.38.0",
"manifest": {
"app": {
"id": "netbird",
"name": "NetBird",
"version": "2.38.0",
"description": "Self-hosted WireGuard mesh VPN control plane with dashboard, embedded identity provider, management API, signal, relay, and STUN. The user-facing entry point \u2014 a TLS proxy in front of the dashboard + server.",
"category": "networking",
"container_name": "netbird",
"container": {
"image": "docker.io/library/nginx:1.27-alpine",
"pull_policy": "if-not-present",
"network": "netbird-net",
"generated_certs": [
{
"crt": "/var/lib/archipelago/netbird/tls.crt",
"key": "/var/lib/archipelago/netbird/tls.key"
}
]
},
"dependencies": [
{
"app_id": "netbird-server"
},
{
"app_id": "netbird-dashboard"
},
{
"storage": "1Gi"
}
],
"resources": {
"memory_limit": "256Mi"
},
"security": {
"capabilities": [
"CHOWN",
"DAC_OVERRIDE",
"SETGID",
"SETUID",
"NET_BIND_SERVICE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 8087,
"container": 443,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/netbird/nginx.conf",
"target": "/etc/nginx/conf.d/default.conf",
"options": [
"ro"
]
},
{
"type": "bind",
"source": "/var/lib/archipelago/netbird/tls.crt",
"target": "/etc/nginx/tls.crt",
"options": [
"ro"
]
},
{
"type": "bind",
"source": "/var/lib/archipelago/netbird/tls.key",
"target": "/etc/nginx/tls.key",
"options": [
"ro"
]
}
],
"environment": [],
"files": [
{
"path": "/var/lib/archipelago/netbird/nginx.conf",
"overwrite": true,
"content": "server {\n listen 443 ssl;\n server_name _;\n\n # netbird's dashboard needs a secure context (window.crypto.subtle for\n # OIDC PKCE), so the proxy terminates TLS with a self-signed cert (#15).\n ssl_certificate /etc/nginx/tls.crt;\n ssl_certificate_key /etc/nginx/tls.key;\n\n # Rootless Podman can hand a container a new IP across restarts/reboots.\n # nginx resolves a literal upstream name ONCE at startup and caches it,\n # so after the IP moves every request 502s with \"host unreachable\"\n # (issue #15, observed live on .198: nginx pinned to a dead\n # netbird-dashboard IP). Fix: point `resolver` at the netbird-net\n # gateway (Podman's aardvark DNS) and use VARIABLE upstreams, which\n # forces nginx to re-resolve the container names at request time.\n resolver {{NETWORK_GATEWAY}} valid=10s ipv6=off;\n\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n proxy_http_version 1.1;\n\n location ~ ^/(relay|ws-proxy/) {\n set $nb_server netbird-server;\n proxy_pass http://$nb_server:80;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n proxy_read_timeout 1d;\n }\n\n location ~ ^/(api|oauth2)(/|$) {\n # The dashboard is a SPA whose API/OIDC base URL is baked at build\n # time to one host:port. A single box is reached via several\n # addresses, so those fetches are cross-origin and the browser\n # blocks them with no Access-Control-Allow-Origin (#15, live on\n # .198). Reflect the caller's Origin and answer the CORS preflight.\n if ($request_method = OPTIONS) {\n add_header Access-Control-Allow-Origin $http_origin always;\n add_header Access-Control-Allow-Credentials true always;\n add_header Access-Control-Allow-Methods \"GET, POST, PUT, PATCH, DELETE, OPTIONS\" always;\n add_header Access-Control-Allow-Headers \"Authorization, Content-Type, Accept\" always;\n add_header Access-Control-Max-Age 86400 always;\n add_header Content-Length 0;\n return 204;\n }\n add_header Access-Control-Allow-Origin $http_origin always;\n add_header Access-Control-Allow-Credentials true always;\n add_header Access-Control-Allow-Methods \"GET, POST, PUT, PATCH, DELETE, OPTIONS\" always;\n add_header Access-Control-Allow-Headers \"Authorization, Content-Type, Accept\" always;\n set $nb_server netbird-server;\n proxy_pass http://$nb_server:80;\n }\n\n location ~ ^/(signalexchange\\.SignalExchange|management\\.ManagementService|management\\.ProxyService)/ {\n set $nb_server netbird-server;\n grpc_pass grpc://$nb_server:80;\n grpc_read_timeout 1d;\n grpc_send_timeout 1d;\n }\n\n # OIDC callback routes are client-side SPA routes with NO prebuilt page\n # in the dashboard bundle, so proxying them straight through 404s \u2014\n # which crashes the dashboard's auth init and shows \"Unauthenticated\"\n # with dead buttons (#15, live on .198: /nb-auth + /nb-silent-auth\n # returned 404). Serve index.html at these paths (URL unchanged) so\n # react-oidc boots and completes the login / silent-SSO.\n location ~ ^/(nb-auth|nb-silent-auth) {\n set $nb_dashboard netbird-dashboard;\n rewrite ^.*$ /index.html break;\n proxy_pass http://$nb_dashboard:80;\n }\n\n location / {\n set $nb_dashboard netbird-dashboard;\n proxy_pass http://$nb_dashboard:80;\n }\n}\n"
}
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:443",
"interval": "30s",
"timeout": "5s",
"retries": 5,
"start_period": "20s"
},
"interfaces": {
"main": {
"name": "Dashboard",
"description": "Manage your self-hosted NetBird mesh VPN",
"type": "ui",
"port": 8087,
"protocol": "https",
"path": "/"
}
},
"metadata": {
"author": "NetBird",
"icon": "/assets/img/app-icons/netbird.svg",
"website": "https://netbird.io",
"repo": "https://github.com/netbirdio/netbird",
"license": "BSD-3-Clause",
"tags": [
"networking",
"vpn",
"wireguard",
"mesh"
]
}
}
}
},
"netbird-dashboard": {
"version": "2.38.0",
"manifest": {
"app": {
"id": "netbird-dashboard",
"name": "NetBird Dashboard",
"version": "2.38.0",
"description": "NetBird management dashboard (SPA). Internal stack member served through the netbird proxy.",
"category": "networking",
"container_name": "netbird-dashboard",
"container": {
"image": "docker.io/netbirdio/dashboard:v2.38.0",
"pull_policy": "if-not-present",
"network": "netbird-net",
"network_aliases": [
"netbird-dashboard"
],
"derived_env": [
{
"key": "NETBIRD_MGMT_API_ENDPOINT",
"template": "https://{{HOST_IP}}:8087"
},
{
"key": "NETBIRD_MGMT_GRPC_API_ENDPOINT",
"template": "https://{{HOST_IP}}:8087"
},
{
"key": "AUTH_AUTHORITY",
"template": "https://{{HOST_IP}}:8087/oauth2"
}
]
},
"dependencies": [
{
"app_id": "netbird-server"
}
],
"resources": {
"memory_limit": "256Mi"
},
"security": {
"capabilities": [
"CHOWN",
"DAC_OVERRIDE",
"SETGID",
"SETUID",
"NET_BIND_SERVICE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [],
"volumes": [],
"environment": [
"AUTH_AUDIENCE=netbird-dashboard",
"AUTH_CLIENT_ID=netbird-dashboard",
"AUTH_CLIENT_SECRET=",
"USE_AUTH0=false",
"AUTH_SUPPORTED_SCOPES=openid profile email groups",
"AUTH_REDIRECT_URI=/nb-auth",
"AUTH_SILENT_REDIRECT_URI=/nb-silent-auth",
"NETBIRD_TOKEN_SOURCE=idToken",
"NGINX_SSL_PORT=443",
"LETSENCRYPT_DOMAIN=none"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:80",
"interval": "30s",
"timeout": "5s",
"retries": 5,
"start_period": "20s"
},
"metadata": {
"author": "NetBird",
"icon": "/assets/img/app-icons/netbird.svg",
"website": "https://netbird.io",
"repo": "https://github.com/netbirdio/dashboard",
"license": "BSD-3-Clause",
"tags": [
"networking",
"vpn",
"dashboard"
]
}
}
}
},
"netbird-server": {
"version": "0.71.2",
"manifest": {
"app": {
"id": "netbird-server",
"name": "NetBird Server",
"version": "0.71.2",
"description": "NetBird combined management / signal / relay server with an embedded identity provider and STUN. Backend for the self-hosted NetBird mesh VPN.",
"category": "networking",
"container_name": "netbird-server",
"container": {
"image": "docker.io/netbirdio/netbird-server:0.71.2",
"pull_policy": "if-not-present",
"network": "netbird-net",
"network_aliases": [
"netbird-server"
],
"generated_secrets": [
{
"name": "netbird-relay-auth-secret",
"kind": "base64"
},
{
"name": "netbird-store-encryption-key",
"kind": "base64"
}
],
"custom_args": [
"--config",
"/etc/netbird/config.yaml"
]
},
"dependencies": [
{
"storage": "1Gi"
}
],
"resources": {
"memory_limit": "1Gi"
},
"security": {
"capabilities": [
"NET_BIND_SERVICE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 8086,
"container": 80,
"protocol": "tcp"
},
{
"host": 3478,
"container": 3478,
"protocol": "udp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/netbird/data",
"target": "/var/lib/netbird",
"options": [
"rw"
]
},
{
"type": "bind",
"source": "/var/lib/archipelago/netbird/config.yaml",
"target": "/etc/netbird/config.yaml",
"options": [
"ro"
]
}
],
"environment": [],
"files": [
{
"path": "/var/lib/archipelago/netbird/config.yaml",
"overwrite": true,
"content": "server:\n listenAddress: \":80\"\n exposedAddress: \"https://{{HOST_IP}}:8087\"\n stunPorts:\n - 3478\n metricsPort: 9090\n healthcheckAddress: \":9000\"\n logLevel: \"info\"\n logFile: \"console\"\n authSecret: \"{{secret:netbird-relay-auth-secret}}\"\n dataDir: \"/var/lib/netbird\"\n auth:\n issuer: \"https://{{HOST_IP}}:8087/oauth2\"\n localAuthDisabled: false\n signKeyRefreshEnabled: false\n dashboardRedirectURIs:\n - \"https://{{HOST_IP}}:8087/nb-auth\"\n - \"https://{{HOST_IP}}:8087/nb-silent-auth\"\n dashboardPostLogoutRedirectURIs:\n - \"https://{{HOST_IP}}:8087/\"\n cliRedirectURIs:\n - \"http://localhost:53000/\"\n store:\n engine: \"sqlite\"\n encryptionKey: \"{{secret:netbird-store-encryption-key}}\"\n"
}
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:80",
"interval": "30s",
"timeout": "5s",
"retries": 10,
"start_period": "30s"
},
"metadata": {
"author": "NetBird",
"icon": "/assets/img/app-icons/netbird.svg",
"website": "https://netbird.io",
"repo": "https://github.com/netbirdio/netbird",
"license": "BSD-3-Clause",
"tags": [
"networking",
"vpn",
"wireguard",
"mesh"
]
}
}
}
},
"nextcloud": {
"version": "29",
"image": "146.59.87.168:3000/lfg2025/nextcloud:29",
"manifest": {
"app": {
"id": "nextcloud",
"name": "Nextcloud",
"version": "29",
"description": "Your own private cloud. File sync, calendars, contacts.",
"container": {
"image": "146.59.87.168:3000/lfg2025/nextcloud:29",
"pull_policy": "if-not-present",
"network": "pasta"
},
"dependencies": [
{
"storage": "10Gi"
}
],
"resources": {
"memory_limit": "1Gi",
"disk_limit": "10Gi"
},
"security": {
"capabilities": [
"CHOWN",
"SETUID",
"SETGID",
"DAC_OVERRIDE",
"NET_BIND_SERVICE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 8085,
"container": 80,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/nextcloud",
"target": "/var/www/html",
"options": [
"rw"
]
}
],
"environment": [],
"health_check": {
"type": "tcp",
"endpoint": "localhost:80",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"interfaces": {
"main": {
"name": "Web UI",
"description": "Nextcloud file and collaboration dashboard",
"type": "ui",
"port": 8085,
"protocol": "http",
"path": "/"
}
},
"metadata": {
"icon": "/assets/img/app-icons/nextcloud.webp",
"category": "data",
"author": "Nextcloud",
"repo": "https://github.com/nextcloud/server",
"launch": {
"open_in_new_tab": true
}
}
}
}
},
"nginx-proxy-manager": {
"version": "latest",
"image": "146.59.87.168:3000/lfg2025/nginx-proxy-manager:latest"
},
"nostr-rs-relay": {
"version": "0.9.0",
"image": "146.59.87.168:3000/lfg2025/nostr-rs-relay:0.9.0",
"manifest": {
"app": {
"id": "nostr-rs-relay",
"name": "Nostr Relay (Rust)",
"version": "0.8.0",
"description": "High-performance Nostr relay written in Rust. Host your own decentralized social media relay and earn networking profits.",
"container": {
"image": "scsibug/nostr-rs-relay:0.8.9",
"image_signature": "cosign://...",
"pull_policy": "verify-signature",
"data_uid": "1000:1000"
},
"dependencies": [
{
"storage": "10Gi"
}
],
"resources": {
"cpu_limit": 2,
"memory_limit": "1Gi",
"disk_limit": "10Gi"
},
"security": {
"capabilities": [],
"readonly_root": true,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "isolated",
"apparmor_profile": "nostr-relay"
},
"ports": [
{
"host": 18081,
"container": 8080,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/nostr-relay",
"target": "/usr/src/app/db",
"options": [
"rw"
]
}
],
"environment": [
"RELAY_NAME=Archipelago Nostr Relay",
"RELAY_DESCRIPTION=Self-hosted Nostr relay on Archipelago",
"MAX_EVENTS=1000000",
"MAX_SUBSCRIPTIONS=100"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:8080",
"path": "/",
"interval": "30s",
"timeout": "30s",
"retries": 5
},
"nostr_integration": {
"relay_type": "public",
"monetization_enabled": true,
"event_storage": "sqlite"
}
}
}
},
"nostr-vpn": {
"version": "v0.3.7",
"image": "146.59.87.168:3000/lfg2025/nostr-vpn:v0.3.7"
},
"ollama": {
"version": "latest",
"image": "146.59.87.168:3000/lfg2025/ollama:latest"
},
"penpot": {
"version": "2.4",
"image": "146.59.87.168:3000/lfg2025/penpot-frontend:2.4",
"images": {
"penpot-frontend": "146.59.87.168:3000/lfg2025/penpot-frontend:2.4",
"penpot-backend": "146.59.87.168:3000/lfg2025/penpot-backend:2.4",
"penpot-exporter": "146.59.87.168:3000/lfg2025/penpot-exporter:2.4",
"penpot-postgres": "146.59.87.168:3000/lfg2025/postgres:15",
"penpot-valkey": "146.59.87.168:3000/lfg2025/valkey:8.1"
}
},
"photoprism": {
"version": "240915",
"image": "146.59.87.168:3000/lfg2025/photoprism:240915",
"manifest": {
"app": {
"id": "photoprism",
"name": "PhotoPrism",
"version": "240915",
"description": "AI-powered photo management with facial recognition.",
"container": {
"image": "146.59.87.168:3000/lfg2025/photoprism:240915",
"pull_policy": "if-not-present"
},
"dependencies": [
{
"storage": "10Gi"
}
],
"resources": {
"memory_limit": "1Gi",
"disk_limit": "10Gi"
},
"security": {
"capabilities": [
"CHOWN",
"SETUID",
"SETGID"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 2342,
"container": 2342,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/photoprism",
"target": "/photoprism/storage",
"options": [
"rw"
]
}
],
"environment": [
"PHOTOPRISM_ADMIN_PASSWORD=archipelago",
"PHOTOPRISM_DEFAULT_LOCALE=en"
],
"health_check": {
"type": "tcp",
"endpoint": "localhost:2342",
"interval": "60s",
"timeout": "5s",
"retries": 3
},
"interfaces": {
"main": {
"name": "Web UI",
"description": "PhotoPrism photo library",
"type": "ui",
"port": 2342,
"protocol": "http",
"path": "/"
}
},
"metadata": {
"icon": "/assets/img/app-icons/photoprism.svg",
"category": "data",
"author": "PhotoPrism",
"repo": "https://github.com/photoprism/photoprism",
"launch": {
"open_in_new_tab": true
}
}
}
}
},
"portainer": {
"version": "2.19.4",
"image": "146.59.87.168:3000/lfg2025/portainer:2.19.4",
"manifest": {
"app": {
"id": "portainer",
"name": "Portainer",
"version": "2.19.4",
"description": "Container management web UI for the local Podman socket.",
"category": "development",
"container": {
"image": "146.59.87.168:3000/lfg2025/portainer:2.19.4",
"pull_policy": "if-not-present",
"data_uid": "1000:1000"
},
"dependencies": [
{
"storage": "1Gi"
}
],
"resources": {
"memory_limit": "256Mi",
"disk_limit": "1Gi"
},
"security": {
"capabilities": [
"CHOWN",
"SETUID",
"SETGID",
"DAC_OVERRIDE"
],
"readonly_root": false,
"no_new_privileges": true,
"network_policy": "isolated"
},
"ports": [
{
"host": 9000,
"container": 9000,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/portainer",
"target": "/data",
"options": [
"rw"
]
},
{
"type": "bind",
"source": "/var/lib/archipelago/portainer/compose",
"target": "/data/compose",
"options": [
"rw"
]
},
{
"type": "bind",
"source": "/run/user/1000/podman/podman.sock",
"target": "/var/run/docker.sock",
"options": [
"rw"
]
}
],
"environment": [],
"interfaces": {
"main": {
"name": "Web UI",
"description": "Portainer web interface",
"type": "ui",
"port": 9000,
"protocol": "http",
"path": "/"
}
},
"metadata": {
"icon": "/assets/img/app-icons/portainer.webp",
"tier": "optional",
"launch": {
"open_in_new_tab": true
},
"features": [
"Container management dashboard",
"Local Podman socket access",
"Compose stack storage"
]
}
}
}
},
"router": {
"version": "1.0.0",
"manifest": {
"app": {
"id": "router",
"name": "Mesh Router",
"version": "1.0.0",
"description": "Mesh routing and local network management. Provides device discovery, routing, and network topology visualization.",
"container": {
"image": "archipelago/router:1.0.0",
"image_signature": "cosign://...",
"pull_policy": "if-not-present"
},
"dependencies": [
{
"storage": "500Mi"
}
],
"resources": {
"cpu_limit": 2,
"memory_limit": "512Mi",
"disk_limit": "500Mi"
},
"security": {
"capabilities": [
"NET_ADMIN",
"NET_RAW"
],
"readonly_root": true,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "host",
"apparmor_profile": "router"
},
"ports": [
{
"host": 8084,
"container": 8080,
"protocol": "tcp"
},
{
"host": 5353,
"container": 5353,
"protocol": "udp"
},
{
"host": 1900,
"container": 1900,
"protocol": "udp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/router",
"target": "/app/data",
"options": [
"rw"
]
},
{
"type": "bind",
"source": "/var/run/dbus",
"target": "/var/run/dbus",
"options": [
"ro"
]
}
],
"environment": [
"NETWORK_INTERFACE=eth0",
"MESH_ENABLED=true",
"DEVICE_DISCOVERY=true"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:8084",
"path": "/health",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"networking": {
"mesh_enabled": true,
"local_network_access": true,
"device_discovery": true,
"routing_protocols": [
"olsr",
"babel"
]
}
}
}
},
"routstr": {
"version": "v0.4.3",
"image": "146.59.87.168:3000/lfg2025/routstr:v0.4.3"
},
"searxng": {
"version": "latest",
"image": "146.59.87.168:3000/lfg2025/searxng:latest",
"manifest": {
"app": {
"id": "searxng",
"name": "SearXNG",
"version": "1.0.0",
"description": "Privacy-respecting metasearch engine. Search the web without tracking.",
"container": {
"image": "146.59.87.168:3000/lfg2025/searxng:latest",
"pull_policy": "if-not-present"
},
"dependencies": [
{
"storage": "2Gi"
}
],
"resources": {
"cpu_limit": 2,
"memory_limit": "1Gi",
"disk_limit": "2Gi"
},
"security": {
"capabilities": [],
"readonly_root": true,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "isolated",
"apparmor_profile": "searxng"
},
"ports": [
{
"host": 8888,
"container": 8080,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/searxng",
"target": "/etc/searxng",
"options": [
"rw"
]
}
],
"environment": [
"SEARXNG_HOSTNAME=localhost",
"SEARXNG_BIND_ADDRESS=0.0.0.0:8080"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:8080",
"path": "/",
"interval": "30s",
"timeout": "30s",
"retries": 5
}
}
}
},
"strfry": {
"version": "0.9.0",
"manifest": {
"app": {
"id": "strfry",
"name": "Strfry Nostr Relay",
"version": "0.9.0",
"description": "Lightweight Nostr relay written in C++. Alternative to nostr-rs-relay with lower resource usage.",
"container": {
"image": "dockurr/strfry:1.0.4",
"image_signature": "cosign://...",
"pull_policy": "verify-signature"
},
"dependencies": [
{
"storage": "5Gi"
}
],
"resources": {
"cpu_limit": 1,
"memory_limit": "512Mi",
"disk_limit": "5Gi"
},
"security": {
"capabilities": [],
"readonly_root": true,
"no_new_privileges": true,
"user": 1000,
"seccomp_profile": "default",
"network_policy": "isolated",
"apparmor_profile": "nostr-relay"
},
"ports": [
{
"host": 8082,
"container": 8080,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/strfry",
"target": "/strfry",
"options": [
"rw"
]
}
],
"environment": [
"RELAY_NAME=Archipelago Strfry Relay"
],
"health_check": {
"type": "http",
"endpoint": "http://localhost:8082",
"path": "/health",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"nostr_integration": {
"relay_type": "public",
"monetization_enabled": true
}
}
}
},
"tailscale": {
"version": "stable",
"image": "146.59.87.168:3000/lfg2025/tailscale:stable"
},
"uptime-kuma": {
"version": "1",
"image": "146.59.87.168:3000/lfg2025/uptime-kuma:1",
"manifest": {
"app": {
"id": "uptime-kuma",
"name": "Uptime Kuma",
"version": "1.23.0",
"description": "Self-hosted uptime monitoring.",
"container": {
"image": "146.59.87.168:3000/lfg2025/uptime-kuma:1",
"pull_policy": "if-not-present",
"network": "pasta",
"custom_args": [
"--",
"node",
"server/server.js"
]
},
"dependencies": [
{
"storage": "1Gi"
}
],
"resources": {
"memory_limit": "256Mi",
"disk_limit": "1Gi"
},
"security": {
"capabilities": [
"CHOWN",
"FOWNER",
"SETUID",
"SETGID"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 3002,
"container": 3001,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/uptime-kuma",
"target": "/app/data",
"options": [
"rw"
]
}
],
"environment": [
"TZ=UTC"
],
"health_check": {
"type": "http",
"endpoint": "localhost:3001",
"path": "/",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"metadata": {
"icon": "/assets/img/app-icons/uptime-kuma.webp",
"category": "data",
"tier": "recommended",
"author": "Uptime Kuma",
"repo": "https://github.com/louislam/uptime-kuma",
"launch": {
"open_in_new_tab": true
}
}
}
}
},
"vaultwarden": {
"version": "1.30.0-alpine",
"image": "146.59.87.168:3000/lfg2025/vaultwarden:1.30.0-alpine",
"manifest": {
"app": {
"id": "vaultwarden",
"name": "Vaultwarden",
"version": "1.30.0",
"description": "Self-hosted password vault with zero-knowledge encryption.",
"container": {
"image": "146.59.87.168:3000/lfg2025/vaultwarden:1.30.0-alpine",
"pull_policy": "if-not-present",
"network": "pasta"
},
"dependencies": [
{
"storage": "1Gi"
}
],
"resources": {
"memory_limit": "256Mi",
"disk_limit": "1Gi"
},
"security": {
"capabilities": [
"CHOWN",
"SETUID",
"SETGID",
"NET_BIND_SERVICE"
],
"readonly_root": false,
"network_policy": "isolated"
},
"ports": [
{
"host": 8082,
"container": 80,
"protocol": "tcp"
}
],
"volumes": [
{
"type": "bind",
"source": "/var/lib/archipelago/vaultwarden",
"target": "/data",
"options": [
"rw"
]
}
],
"environment": [],
"health_check": {
"type": "tcp",
"endpoint": "localhost:80",
"interval": "30s",
"timeout": "5s",
"retries": 3
},
"interfaces": {
"main": {
"name": "Web UI",
"description": "Vaultwarden web vault",
"type": "ui",
"port": 8082,
"protocol": "http",
"path": "/"
}
},
"metadata": {
"icon": "/assets/img/app-icons/vaultwarden.webp",
"category": "data",
"tier": "recommended",
"author": "Vaultwarden",
"repo": "https://github.com/dani-garcia/vaultwarden",
"launch": {
"open_in_new_tab": true
}
}
}
}
}
}
}