2026-06-23 23:45:31 -04:00
{
"apps" : {
"adguardhome" : {
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/adguardhome:v0.107.55" ,
"version" : "v0.107.55"
2026-06-23 23:45:31 -04:00
},
"aiui" : {
"manifest" : {
"app" : {
"container" : {
"image" : "localhost/archipelago-aiui:latest" ,
"pull_policy" : "always"
},
2026-07-22 03:49:19 -04:00
"description" : "Conversational AI interface for Archipelago. Quarantined — communicates only via context broker." ,
"health_check" : {
"endpoint" : "http://localhost:80" ,
"interval" : "60s" ,
"path" : "/" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "http"
2026-07-21 06:29:48 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "aiui" ,
"internal" : true ,
"name" : "AI Assistant" ,
2026-07-21 21:55:08 +01:00
"ports" : [
{
2026-07-22 03:49:19 -04:00
"bind" : "127.0.0.1" ,
2026-07-21 21:55:08 +01:00
"container" : 80 ,
2026-07-22 03:49:19 -04:00
"host" : 5180 ,
"protocol" : "tcp"
2026-07-21 21:55:08 +01:00
}
],
2026-07-22 03:49:19 -04:00
"resources" : {
"cpu_limit" : 1 ,
"disk_limit" : "1Gi" ,
"memory_limit" : "512Mi"
},
"security" : {
"apparmor_profile" : "aiui" ,
"capabilities" : [],
"network_policy" : "isolated" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default" ,
"user" : 1000
},
"version" : "0.1.0"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "0.1.0"
2026-06-23 23:45:31 -04:00
},
"archy-btcpay-db" : {
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"rpc_access" : "none" ,
"sync_required" : false
},
2026-06-23 23:45:31 -04:00
"container" : {
2026-07-21 21:55:08 +01:00
"data_uid" : "100998:100998" ,
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/postgres:15.17" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "POSTGRES_PASSWORD" ,
"secret_file" : "btcpay-db-password"
}
]
},
"dependencies" : [
{
"storage" : "20Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Postgres backend for BTCPay and NBXplorer." ,
"environment" : [
"POSTGRES_DB=btcpay" ,
"POSTGRES_USER=btcpay"
],
"health_check" : {
"endpoint" : "localhost:5432" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "archy-btcpay-db" ,
"name" : "BTCPay Postgres" ,
"ports" : [],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "20Gi" ,
"memory_limit" : "1Gi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"FOWNER" ,
"SETUID" ,
"SETGID" ,
"DAC_OVERRIDE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "15.17" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/postgres-btcpay" ,
"target" : "/var/lib/postgresql/data" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
}
},
"version" : "15.17"
},
"archy-mempool-db" : {
"manifest" : {
"app" : {
2026-06-23 23:45:31 -04:00
"bitcoin_integration" : {
"rpc_access" : "none" ,
"sync_required" : false
2026-07-22 03:49:19 -04:00
},
2026-06-23 23:45:31 -04:00
"container" : {
2026-07-21 21:55:08 +01:00
"data_uid" : "100998:100998" ,
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/mariadb:11.4.10" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "MYSQL_PASSWORD" ,
"secret_file" : "mempool-db-password"
},
{
"key" : "MYSQL_ROOT_PASSWORD" ,
"secret_file" : "mysql-root-db-password"
}
]
},
"dependencies" : [
{
"storage" : "20Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "MariaDB backend for the mempool explorer stack." ,
"environment" : [
"MYSQL_DATABASE=mempool" ,
"MYSQL_USER=mempool"
],
"health_check" : {
"endpoint" : "localhost:3306" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "archy-mempool-db" ,
"name" : "Mempool MariaDB" ,
"ports" : [],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "20Gi" ,
"memory_limit" : "512Mi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"FOWNER" ,
"SETUID" ,
"SETGID" ,
"DAC_OVERRIDE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "11.4.10" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/mysql-mempool" ,
"target" : "/var/lib/mysql" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
}
},
"version" : "11.4.10"
},
"archy-mempool-web" : {
"manifest" : {
"app" : {
2026-06-23 23:45:31 -04:00
"bitcoin_integration" : {
"rpc_access" : "none" ,
"sync_required" : false
2026-07-22 03:49:19 -04:00
},
2026-06-23 23:45:31 -04:00
"container" : {
"image" : "146.59.87.168:3000/lfg2025/mempool-frontend:v3.0.1" ,
2026-07-22 03:49:19 -04:00
"network" : "archy-net" ,
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "mempool" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"app_id" : "mempool-api" ,
"version" : ">=3.0.0"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Frontend web UI for mempool explorer." ,
"environment" : [
"FRONTEND_HTTP_PORT=8080" ,
"BACKEND_MAINNET_HTTP_HOST=mempool-api"
],
"health_check" : {
"endpoint" : "http://127.0.0.1:8080" ,
"interval" : "30s" ,
"path" : "/" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "http"
},
"id" : "archy-mempool-web" ,
"name" : "Mempool Web" ,
"ports" : [
{
"container" : 8080 ,
"host" : 4080 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
"memory_limit" : "512Mi"
},
"security" : {
"capabilities" : [],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "3.0.1"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "3.0.1"
2026-06-23 23:45:31 -04:00
},
"archy-nbxplorer" : {
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"rpc_access" : "read-only" ,
"sync_required" : true
},
2026-06-23 23:45:31 -04:00
"container" : {
2026-07-10 17:48:27 +01:00
"image" : "146.59.87.168:3000/lfg2025/nbxplorer:2.6.0" ,
2026-07-21 21:55:08 +01:00
"network" : "archy-net" ,
2026-07-22 03:49:19 -04:00
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"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"
}
],
2026-07-22 03:49:19 -04:00
"description" : "BTCPay blockchain indexer service." ,
2026-06-23 23:45:31 -04:00
"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" : {
"endpoint" : "http://localhost:32838" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/" ,
"retries" : 5 ,
2026-06-23 23:45:31 -04:00
"timeout" : "30s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "archy-nbxplorer" ,
"name" : "NBXplorer" ,
"ports" : [
{
"container" : 32838 ,
"host" : 32838 ,
"protocol" : "tcp"
}
],
"resources" : {
"disk_limit" : "20Gi" ,
"memory_limit" : "2Gi"
},
"security" : {
"capabilities" : [],
"network_policy" : "isolated" ,
"readonly_root" : false
},
"version" : "2.6.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/nbxplorer" ,
"target" : "/data" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "2.6.0"
2026-06-23 23:45:31 -04:00
},
2026-07-18 19:55:06 -04:00
"barkd" : {
"manifest" : {
"app" : {
"container" : {
2026-07-22 03:49:19 -04:00
"data_uid" : "1000:1000" ,
2026-07-18 19:55:06 -04:00
"generated_secrets" : [
{
2026-07-22 03:49:19 -04:00
"kind" : "hex32" ,
"name" : "barkd-secret"
2026-07-18 19:55:06 -04:00
}
],
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/barkd:0.3.0" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-07-18 19:55:06 -04:00
"secret_env" : [
{
"key" : "BARKD_SECRET" ,
"secret_file" : "barkd-secret"
}
2026-07-22 03:49:19 -04:00
]
2026-07-18 19:55:06 -04:00
},
"dependencies" : [
{
"storage" : "1Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Ark protocol wallet daemon (barkd). Lets the node hold self-custodial off-chain bitcoin via an Ark server; the wallet talks to it over a local REST API. Signet by default while Ark matures." ,
2026-07-18 19:55:06 -04:00
"environment" : [
"BARKD_DATADIR=/data" ,
"BARKD_BIND_HOST=0.0.0.0" ,
"BARKD_BIND_PORT=3535"
],
"health_check" : {
"endpoint" : "localhost:3535" ,
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"retries" : 3 ,
2026-07-18 19:55:06 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "tcp"
},
"id" : "barkd" ,
"name" : "Ark Wallet" ,
"ports" : [
{
"container" : 3535 ,
"host" : 3535 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 1 ,
"disk_limit" : "1Gi" ,
"memory_limit" : "512Mi"
},
"security" : {
"network_policy" : "bridge" ,
"readonly_root" : true
},
"version" : "0.3.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/barkd" ,
"target" : "/data" ,
"type" : "bind"
}
]
2026-07-18 19:55:06 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "0.3.0"
2026-07-18 19:55:06 -04:00
},
2026-06-23 23:45:31 -04:00
"bitcoin-core" : {
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"pruning_support" : true ,
"rpc_access" : "admin" ,
"sync_required" : true ,
"testnet_support" : false
},
2026-06-23 23:45:31 -04:00
"container" : {
"custom_args" : [
2026-07-22 03:47:06 -04:00
"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_CONF=\"/tmp/rpc.conf\"; umask 077; { echo \"rpcuser=$RPC_USER\"; echo \"rpcpassword=$RPC_PASS\"; } > \"$RPC_CONF\"; 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 -conf=\"$RPC_CONF\" -printtoconsole=0 -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;\nelse\n exec \"$BITCOIND\" -datadir=/home/bitcoin/.bitcoin -conf=\"$RPC_CONF\" -printtoconsole=0 -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;\nfi"
2026-06-23 23:45:31 -04:00
],
2026-07-22 03:49:19 -04:00
"data_uid" : "100101:100101" ,
2026-06-23 23:45:31 -04:00
"derived_env" : [
{
"key" : "DISK_GB" ,
"template" : "{{DISK_GB}}"
}
],
2026-07-22 03:49:19 -04:00
"entrypoint" : [
"sh" ,
"-lc"
],
"image" : "146.59.87.168:3000/lfg2025/bitcoin:28.4" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "BITCOIN_RPC_PASS" ,
"secret_file" : "bitcoin-rpc-password"
},
{
"key" : "BITCOIN_RPC_TXRELAY_RPCAUTH" ,
"secret_file" : "bitcoin-rpc-txrelay-rpcauth"
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "bitcoin-core" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"storage" : "500Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Reference Bitcoin Core node with dynamic prune/full-mode startup based on host disk." ,
"environment" : [
"BITCOIN_RPC_USER=archipelago"
],
"health_check" : {
"endpoint" : "localhost:8332" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "bitcoin-core" ,
"name" : "Bitcoin Core" ,
"ports" : [
{
"bind" : "127.0.0.1" ,
"container" : 8332 ,
"host" : 8332 ,
"protocol" : "tcp"
},
{
"container" : 8333 ,
"host" : 8333 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
"cpu_limit" : 0 ,
2026-07-22 03:49:19 -04:00
"disk_limit" : "500Gi" ,
"memory_limit" : "4Gi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"FOWNER" ,
"SETUID" ,
"SETGID" ,
"DAC_OVERRIDE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "28.4.0" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/bitcoin" ,
"target" : "/home/bitcoin/.bitcoin" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-06-28 18:46:17 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "latest" ,
2026-06-28 18:46:17 -04:00
"versions" : [
2026-06-29 05:46:04 -04:00
{
2026-07-22 03:49:19 -04:00
"default" : true ,
2026-06-29 05:46:04 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin:latest" ,
2026-07-22 03:49:19 -04:00
"version" : "latest"
2026-06-29 05:46:04 -04:00
},
2026-06-28 18:46:17 -04:00
{
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin:31.0" ,
"version" : "31.0"
2026-06-28 18:46:17 -04:00
},
{
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin:30.2" ,
"version" : "30.2"
2026-06-28 18:46:17 -04:00
},
{
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin:29.3" ,
"version" : "29.3"
2026-06-28 18:46:17 -04:00
},
2026-06-29 05:46:04 -04:00
{
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin:29.2" ,
"version" : "29.2"
2026-06-29 05:46:04 -04:00
},
2026-06-28 18:46:17 -04:00
{
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin:28.4" ,
"version" : "28.4.0"
2026-06-28 18:46:17 -04:00
},
{
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin:27.2" ,
"version" : "27.2"
2026-06-28 18:46:17 -04:00
},
{
2026-07-22 03:49:19 -04:00
"deprecated" : true ,
2026-06-28 18:46:17 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin:26.2" ,
2026-07-22 03:49:19 -04:00
"version" : "26.2"
2026-06-28 18:46:17 -04:00
},
{
2026-07-22 03:49:19 -04:00
"deprecated" : true ,
2026-06-28 18:46:17 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin:25.2" ,
2026-07-22 03:49:19 -04:00
"version" : "25.2"
2026-06-28 18:46:17 -04:00
}
]
2026-06-23 23:45:31 -04:00
},
"bitcoin-knots" : {
"image" : "146.59.87.168:3000/lfg2025/bitcoin-knots:latest" ,
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"pruning_support" : true ,
"rpc_access" : "admin" ,
"sync_required" : true ,
"testnet_support" : false
},
2026-06-23 23:45:31 -04:00
"container" : {
"custom_args" : [
2026-07-22 03:47:06 -04:00
"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_CONF=\"/tmp/rpc.conf\"; umask 077; { echo \"rpcuser=$RPC_USER\"; echo \"rpcpassword=$RPC_PASS\"; } > \"$RPC_CONF\"; 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 -conf=\"$RPC_CONF\" -printtoconsole=0 -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;\nelse\n exec \"$BITCOIND\" -datadir=/home/bitcoin/.bitcoin -conf=\"$RPC_CONF\" -printtoconsole=0 -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;\nfi"
2026-06-23 23:45:31 -04:00
],
2026-07-22 03:49:19 -04:00
"data_uid" : "100101:100101" ,
2026-06-23 23:45:31 -04:00
"derived_env" : [
{
"key" : "DISK_GB" ,
"template" : "{{DISK_GB}}"
}
],
2026-07-22 03:49:19 -04:00
"entrypoint" : [
"sh" ,
"-lc"
],
"image" : "146.59.87.168:3000/lfg2025/bitcoin-knots:latest" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "BITCOIN_RPC_PASS" ,
"secret_file" : "bitcoin-rpc-password"
},
{
"key" : "BITCOIN_RPC_TXRELAY_RPCAUTH" ,
"secret_file" : "bitcoin-rpc-txrelay-rpcauth"
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "bitcoin-knots" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"storage" : "500Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Full Bitcoin Knots node with dynamic prune/full-mode startup based on host disk." ,
"environment" : [
"BITCOIN_RPC_USER=archipelago"
],
"health_check" : {
"endpoint" : "localhost:8332" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "bitcoin-knots" ,
"name" : "Bitcoin Knots" ,
"ports" : [
{
"bind" : "127.0.0.1" ,
"container" : 8332 ,
"host" : 8332 ,
"protocol" : "tcp"
},
{
"container" : 8333 ,
"host" : 8333 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
"cpu_limit" : 0 ,
2026-07-22 03:49:19 -04:00
"disk_limit" : "500Gi" ,
"memory_limit" : "8Gi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"FOWNER" ,
"SETUID" ,
"SETGID" ,
"DAC_OVERRIDE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "28.1.0" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/bitcoin" ,
"target" : "/home/bitcoin/.bitcoin" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-06-28 18:46:17 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "latest" ,
2026-06-28 18:46:17 -04:00
"versions" : [
{
2026-07-22 03:49:19 -04:00
"default" : true ,
2026-06-29 05:46:04 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin-knots:29.3.knots20260508" ,
2026-07-22 03:49:19 -04:00
"version" : "latest"
2026-06-28 19:56:49 -04:00
},
{
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin-knots:29.3.knots20260508" ,
"version" : "29.3.knots20260508"
2026-06-29 05:46:04 -04:00
},
{
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin-knots:29.3.knots20260507" ,
"version" : "29.3.knots20260507"
2026-06-29 05:46:04 -04:00
},
{
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin-knots:29.3.knots20260210" ,
"version" : "29.3.knots20260210"
2026-06-29 05:46:04 -04:00
},
{
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/bitcoin-knots:29.2.knots20251110" ,
"version" : "29.2.knots20251110"
2026-06-28 18:46:17 -04:00
}
]
2026-06-23 23:45:31 -04:00
},
"bitcoin-ui" : {
"image" : "146.59.87.168:3000/lfg2025/bitcoin-ui:1.7.84-alpha" ,
"manifest" : {
"app" : {
"container" : {
"build" : {
"context" : "/opt/archipelago/docker/bitcoin-ui" ,
"dockerfile" : "Dockerfile" ,
"tag" : "localhost/bitcoin-ui:local"
}
},
"dependencies" : [
{
"app_id" : "bitcoin-core"
}
],
2026-07-22 03:49:19 -04:00
"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" ,
"environment" : [],
"health_check" : {
"endpoint" : "http://127.0.0.1:8334" ,
"interval" : "30s" ,
"path" : "/" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "http"
},
"id" : "bitcoin-ui" ,
"name" : "Bitcoin UI" ,
"ports" : [],
2026-06-23 23:45:31 -04:00
"resources" : {
"memory_limit" : "128Mi"
},
"security" : {
2026-07-22 03:49:19 -04:00
"network_policy" : "host" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "1.0.0" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"ro"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/bitcoin-ui/nginx.conf" ,
"target" : "/etc/nginx/conf.d/default.conf" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "1.7.84-alpha"
2026-06-23 23:45:31 -04:00
},
"botfights" : {
"manifest" : {
"app" : {
"category" : "community" ,
"container" : {
"image" : "146.59.87.168:3000/lfg2025/botfights:1.1.0" ,
"pull_policy" : "always"
},
"dependencies" : [
{
"storage" : "500Mi"
}
],
2026-07-22 03:49:19 -04:00
"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." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"NODE_ENV=production"
],
"health_check" : {
"endpoint" : "http://localhost:9100" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/api/health" ,
2026-07-21 21:55:08 +01:00
"retries" : 3 ,
2026-07-22 03:49:19 -04:00
"start_period" : "30s" ,
"timeout" : "10s" ,
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "botfights" ,
2026-06-23 23:45:31 -04:00
"interfaces" : {
"main" : {
2026-07-21 21:55:08 +01:00
"description" : "Bot arena and arcade fighter with controller support" ,
2026-07-22 03:49:19 -04:00
"name" : "Web UI" ,
"path" : "/" ,
2026-06-23 23:45:31 -04:00
"port" : 9100 ,
"protocol" : "http" ,
2026-07-22 03:49:19 -04:00
"type" : "ui"
2026-06-23 23:45:31 -04:00
}
},
"metadata" : {
"author" : "Dorian" ,
"icon" : "/assets/img/app-icons/botfights.svg" ,
"license" : "MIT" ,
2026-07-22 03:49:19 -04:00
"repo" : "https://botfights.net" ,
2026-06-23 23:45:31 -04:00
"tags" : [
"bitcoin" ,
"gaming" ,
"arcade" ,
"fighter" ,
"bots" ,
"competition" ,
"controller"
]
2026-07-22 03:49:19 -04:00
},
"name" : "BotFights" ,
"ports" : [
{
"container" : 9100 ,
"host" : 9100 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 2 ,
"disk_limit" : "500Mi" ,
"memory_limit" : "512Mi"
},
"security" : {
"apparmor_profile" : "default" ,
"capabilities" : [],
"network_policy" : "bridge" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default" ,
"user" : 1001
},
"version" : "1.1.0" ,
"volumes" : [
{
"source" : "botfights-data" ,
"target" : "/app/server/data" ,
"type" : "bind"
},
{
"options" : [
"rw" ,
"noexec" ,
"nosuid" ,
"size=64m"
],
"target" : "/tmp" ,
"type" : "tmpfs"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "1.1.0"
2026-06-23 23:45:31 -04:00
},
"btcpay" : {
"image" : "docker.io/btcpayserver/btcpayserver:2.3.9" ,
"images" : {
2026-07-22 03:49:19 -04:00
"archy-btcpay-db" : "146.59.87.168:3000/lfg2025/postgres:15.17" ,
2026-06-23 23:45:31 -04:00
"archy-nbxplorer" : "146.59.87.168:3000/lfg2025/nbxplorer:2.6.0" ,
2026-07-22 03:49:19 -04:00
"btcpay-server" : "docker.io/btcpayserver/btcpayserver:2.3.9"
},
"version" : "2.3.9"
2026-06-23 23:45:31 -04:00
},
"btcpay-server" : {
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"rpc_access" : "read-only" ,
"sync_required" : true
},
2026-06-23 23:45:31 -04:00
"container" : {
2026-07-22 03:49:19 -04:00
"derived_env" : [
{
"key" : "BTCPAY_HOST" ,
"template" : "{{HOST_IP}}:23000"
}
],
2026-06-23 23:45:31 -04:00
"image" : "docker.io/btcpayserver/btcpayserver:2.3.9" ,
2026-07-21 21:55:08 +01:00
"network" : "archy-net" ,
2026-07-22 03:49:19 -04:00
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "BTCPAY_BTCRPCPASSWORD" ,
"secret_file" : "bitcoin-rpc-password"
},
{
"key" : "BTCPAY_DB_PASS" ,
"secret_file" : "btcpay-db-password"
2026-07-10 17:48:27 +01:00
},
{
"key" : "BTCPAY_BTCLIGHTNING" ,
2026-07-22 03:49:19 -04:00
"optional" : true ,
"secret_file" : "btcpay-lnd-connection"
2026-06-23 23:45:31 -04:00
}
]
},
"dependencies" : [
{
"app_id" : "bitcoin-core" ,
"version" : ">=26.0"
},
{
"app_id" : "archy-btcpay-db" ,
"version" : ">=15.17"
},
{
"app_id" : "archy-nbxplorer" ,
"version" : ">=2.6.0"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Self-hosted Bitcoin payment processor. Accept Bitcoin payments without intermediaries." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"ASPNETCORE_URLS=http://0.0.0.0:49392" ,
"BTCPAY_PROTOCOL=http" ,
"BTCPAY_CHAINS=btc" ,
2026-07-10 17:48:27 +01:00
"BTCPAY_PLUGINDIR=/datadir/Plugins" ,
2026-06-23 23:45:31 -04:00
"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" : {
"endpoint" : "http://localhost:49392" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/" ,
"retries" : 5 ,
2026-06-23 23:45:31 -04:00
"timeout" : "30s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-07-21 21:55:08 +01:00
},
2026-07-22 03:49:19 -04:00
"id" : "btcpay-server" ,
2026-07-21 21:55:08 +01:00
"interfaces" : {
"main" : {
"description" : "BTCPay Server dashboard" ,
2026-07-22 03:49:19 -04:00
"name" : "Web UI" ,
"path" : "/" ,
2026-07-21 21:55:08 +01:00
"port" : 23000 ,
"protocol" : "http" ,
2026-07-22 03:49:19 -04:00
"type" : "ui"
2026-07-21 21:55:08 +01:00
}
2026-07-21 06:29:48 -04:00
},
2026-07-22 03:49:19 -04:00
"lightning_integration" : {
"invoice_management" : true ,
"payment_processing" : false
},
2026-06-23 23:45:31 -04:00
"metadata" : {
"launch" : {
"open_in_new_tab" : true
}
2026-07-22 03:49:19 -04:00
},
"name" : "BTCPay Server" ,
"ports" : [
{
"container" : 49392 ,
"host" : 23000 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 2 ,
"disk_limit" : "20Gi" ,
"memory_limit" : "2Gi"
},
"security" : {
"capabilities" : [],
"network_policy" : "isolated" ,
"readonly_root" : false
},
"version" : "2.3.9" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/btcpay" ,
"target" : "/datadir" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "2.3.9"
2026-06-23 23:45:31 -04:00
},
"core-lightning" : {
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"rpc_access" : "admin" ,
"sync_required" : true
},
2026-06-23 23:45:31 -04:00
"container" : {
"image" : "elementsproject/lightningd:v23.08.2" ,
"image_signature" : "cosign://..." ,
"pull_policy" : "verify-signature"
},
"dependencies" : [
{
"app_id" : "bitcoin-core" ,
"version" : ">=26.0"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Lightning Network implementation in C. Lightweight alternative to LND." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"BITCOIND_RPCURL=http://bitcoin-core:8332" ,
"BITCOIND_RPCUSER=${BITCOIN_RPC_USER}" ,
"BITCOIND_RPCPASS=${BITCOIN_RPC_PASSWORD}" ,
"NETWORK=bitcoin"
],
"health_check" : {
"endpoint" : "lightning-cli getinfo" ,
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"retries" : 3 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "exec"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "core-lightning" ,
2026-06-23 23:45:31 -04:00
"lightning_integration" : {
"channel_management" : true ,
"payment_routing" : true
2026-07-22 03:49:19 -04:00
},
"name" : "Core Lightning (CLN)" ,
"ports" : [
{
"container" : 9735 ,
"host" : 9736 ,
"protocol" : "tcp"
},
{
"container" : 9835 ,
"host" : 9835 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 1 ,
"disk_limit" : "5Gi" ,
"memory_limit" : "512Mi"
},
"security" : {
"apparmor_profile" : "core-lightning" ,
"capabilities" : [
"NET_BIND_SERVICE"
],
"network_policy" : "isolated" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default" ,
"user" : 1000
},
"version" : "23.08.2" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/core-lightning" ,
"target" : "/home/clightning/.lightning" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "23.08.2"
2026-06-23 23:45:31 -04:00
},
"cryptpad" : {
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/cryptpad:2024.12.0" ,
"version" : "2024.12.0"
2026-06-23 23:45:31 -04:00
},
"did-wallet" : {
"manifest" : {
"app" : {
"container" : {
"image" : "archipelago/did-wallet:1.0.0" ,
"image_signature" : "cosign://..." ,
"pull_policy" : "if-not-present"
},
"dependencies" : [
{
"storage" : "2Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Web5 wallet with Decentralized Identifier (DID) support. Manage your digital identity and Web5 assets." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"WALLET_STORAGE=/app/wallet"
],
"health_check" : {
2026-07-10 17:48:27 +01:00
"endpoint" : "http://127.0.0.1:8080" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/health" ,
"retries" : 3 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "did-wallet" ,
"name" : "Web5 DID Wallet" ,
"ports" : [
{
"container" : 8080 ,
"host" : 8088 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 1 ,
"disk_limit" : "2Gi" ,
"memory_limit" : "512Mi"
},
"security" : {
"apparmor_profile" : "did-wallet" ,
"capabilities" : [],
"network_policy" : "isolated" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default" ,
"user" : 1000
},
"version" : "1.0.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/did-wallet" ,
"target" : "/app/wallet" ,
"type" : "bind"
}
],
2026-06-23 23:45:31 -04:00
"web5_integration" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : true ,
2026-06-23 23:45:31 -04:00
"did_support" : true ,
2026-07-22 03:49:19 -04:00
"wallet_functionality" : true
2026-06-23 23:45:31 -04:00
}
}
2026-07-22 03:49:19 -04:00
},
"version" : "1.0.0"
2026-06-23 23:45:31 -04:00
},
"electrs-ui" : {
"image" : "146.59.87.168:3000/lfg2025/electrs-ui:latest" ,
"manifest" : {
"app" : {
"container" : {
"build" : {
"context" : "/opt/archipelago/docker/electrs-ui" ,
"dockerfile" : "Dockerfile" ,
"tag" : "localhost/electrs-ui:local"
}
},
"dependencies" : [],
2026-07-22 03:49:19 -04:00
"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" ,
"environment" : [],
"health_check" : {
"endpoint" : "http://127.0.0.1:50002" ,
"interval" : "30s" ,
"path" : "/" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "http"
},
"id" : "electrs-ui" ,
"name" : "Electrs UI" ,
"ports" : [],
2026-06-23 23:45:31 -04:00
"resources" : {
"memory_limit" : "64Mi"
},
"security" : {
2026-07-22 03:49:19 -04:00
"network_policy" : "host" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "1.0.0" ,
"volumes" : []
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "latest"
2026-06-23 23:45:31 -04:00
},
"electrumx" : {
"image" : "146.59.87.168:3000/lfg2025/electrumx:v1.18.0" ,
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"pruning_support" : false ,
"rpc_access" : "read-only" ,
"sync_required" : true
},
2026-06-23 23:45:31 -04:00
"container" : {
2026-07-22 03:49:19 -04:00
"custom_args" : [
"for h in bitcoin-knots bitcoin-core; do if getent hosts \"$h\" >/dev/null 2>&1; then BTC_HOST=\"$h\"; break; fi; done; export DAEMON_URL=\"http://archipelago:$(printenv BITCOIN_RPC_PASS)@${BTC_HOST:-bitcoin-knots}:8332/\"; exec electrumx_server"
],
2026-06-23 23:45:31 -04:00
"data_uid" : "1000:1000" ,
"entrypoint" : [
"sh" ,
"-lc"
],
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/electrumx:v1.18.0" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "BITCOIN_RPC_PASS" ,
"secret_file" : "bitcoin-rpc-password"
}
]
},
"dependencies" : [
{
"app_id" : "bitcoin-knots" ,
"version" : ">=26.0"
},
{
"storage" : "50Gi"
2026-07-08 21:03:03 -04:00
},
"bitcoin:archival"
2026-06-23 23:45:31 -04:00
],
2026-07-22 03:49:19 -04:00
"description" : "Electrum server indexing Bitcoin chain data for lightweight wallet queries." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"COIN=Bitcoin" ,
"DB_DIRECTORY=/data" ,
"SERVICES=tcp://:50001,rpc://0.0.0.0:8000" ,
"CACHE_MB=1024" ,
"MAX_SEND=10000000"
],
2026-07-21 21:55:08 +01:00
"health_check" : {
"endpoint" : "localhost:50001" ,
"interval" : "30s" ,
"retries" : 3 ,
2026-07-22 03:49:19 -04:00
"start_period" : "10m" ,
"timeout" : "5s" ,
"type" : "tcp"
2026-07-21 06:29:48 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "electrumx" ,
"interfaces" : {
"main" : {
"description" : "ElectrumX server status and connection details" ,
"name" : "Web UI" ,
"port" : 50002 ,
"protocol" : "http" ,
"type" : "ui"
}
},
"name" : "ElectrumX" ,
"ports" : [
{
"container" : 50001 ,
"host" : 50001 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 0 ,
"disk_limit" : "50Gi" ,
"memory_limit" : "6Gi"
},
"security" : {
"capabilities" : [
"DAC_OVERRIDE"
],
"network_policy" : "isolated" ,
"readonly_root" : false
},
"version" : "1.18.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/electrumx" ,
"target" : "/data" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "v1.18.0"
2026-06-23 23:45:31 -04:00
},
"fedimint" : {
"image" : "146.59.87.168:3000/lfg2025/fedimintd:v0.10.0" ,
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"rpc_access" : "admin" ,
"sync_required" : true
},
2026-06-23 23:45:31 -04:00
"container" : {
"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"
],
2026-07-22 03:49:19 -04:00
"data_uid" : "1000:1000" ,
2026-06-23 23:45:31 -04:00
"derived_env" : [
{
"key" : "FM_P2P_URL" ,
"template" : "fedimint://{{HOST_MDNS}}:8173"
},
{
"key" : "FM_API_URL" ,
"template" : "ws://{{HOST_MDNS}}:8174"
2026-07-22 22:07:15 -04:00
},
{
"key" : "FM_BITCOIND_URL" ,
"template" : "http://{{BITCOIN_HOST}}:8332"
2026-06-23 23:45:31 -04:00
}
],
2026-07-22 03:49:19 -04:00
"entrypoint" : [
"sh" ,
"-lc"
],
"image" : "146.59.87.168:3000/lfg2025/fedimintd:v0.10.0" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "FM_BITCOIND_PASSWORD" ,
"secret_file" : "bitcoin-rpc-password"
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"app_id" : "bitcoin-core" ,
"version" : ">=26.0"
},
{
"storage" : "20Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Federated Bitcoin minting service with built-in Guardian UI. Privacy-preserving Bitcoin custody." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"FM_DATA_DIR=/data" ,
"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" : {
"endpoint" : "http://localhost:8175" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/" ,
"retries" : 3 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "fedimint" ,
2026-06-23 23:45:31 -04:00
"interfaces" : {
"main" : {
2026-07-21 21:55:08 +01:00
"description" : "Fedimint Guardian wait/proxy UI" ,
2026-07-22 03:49:19 -04:00
"name" : "Guardian UI" ,
"path" : "/" ,
2026-06-23 23:45:31 -04:00
"port" : 8175 ,
"protocol" : "http" ,
2026-07-22 03:49:19 -04:00
"type" : "ui"
2026-06-23 23:45:31 -04:00
}
},
2026-07-22 03:49:19 -04:00
"name" : "Fedimint Guardian" ,
"ports" : [
{
"container" : 8173 ,
"host" : 8173 ,
"protocol" : "tcp"
},
{
"container" : 8174 ,
"host" : 8174 ,
"protocol" : "tcp"
},
{
"container" : 8175 ,
"host" : 8177 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 4 ,
"disk_limit" : "20Gi" ,
"memory_limit" : "4Gi"
},
"security" : {
"capabilities" : [],
"network_policy" : "isolated" ,
"readonly_root" : true
},
"version" : "0.10.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/fedimint" ,
"target" : "/data" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "v0.10.0"
2026-06-23 23:45:31 -04:00
},
"fedimint-clientd" : {
"manifest" : {
"app" : {
"container" : {
2026-07-22 03:49:19 -04:00
"data_uid" : "1000:1000" ,
2026-06-23 23:45:31 -04:00
"generated_secrets" : [
{
2026-07-22 03:49:19 -04:00
"kind" : "hex16" ,
"name" : "fmcd-password"
2026-06-23 23:45:31 -04:00
}
],
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/fmcd:0.8.1" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "FMCD_PASSWORD" ,
"secret_file" : "fmcd-password"
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"storage" : "2Gi"
}
],
2026-07-22 03:49:19 -04:00
"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." ,
"environment" : [
"FMCD_ADDR=0.0.0.0:8080" ,
"FMCD_MODE=rest" ,
"FMCD_DATA_DIR=/data" ,
"FMCD_INVITE_CODE=fed11qgqyj3mfwfhksw309uuxywtxxfjrjc35xuexverpxdsnxcnrxucxvenzveskgc3kvvun2c34xp3k2ep38yunzdpexcekxe3hvd3rvvmx8pnrvdenx5mnzvtzqqqjqt0t6pc3s5z0ynqjw9s4njf6svwgu59kweawc0vvrddcjeemw6yyn4pcdp"
],
"health_check" : {
"endpoint" : "localhost:8080" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "fedimint-clientd" ,
"name" : "Fedimint Client" ,
"ports" : [
{
"container" : 8080 ,
"host" : 8178 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-02 09:01:34 -04:00
"cpu_limit" : 1 ,
2026-07-22 03:49:19 -04:00
"disk_limit" : "2Gi" ,
"memory_limit" : "1Gi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"DAC_OVERRIDE" ,
"FOWNER" ,
"SETUID" ,
"SETGID"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "bridge" ,
"readonly_root" : true
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "0.8.0" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/fmcd" ,
"target" : "/data" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "0.8.0"
2026-06-23 23:45:31 -04:00
},
"fedimint-gateway" : {
"image" : "146.59.87.168:3000/lfg2025/gatewayd:v0.10.0" ,
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"rpc_access" : "admin" ,
"sync_required" : true
},
2026-06-23 23:45:31 -04:00
"container" : {
2026-07-22 03:49:19 -04:00
"custom_args" : [
2026-07-22 22:07:15 -04:00
"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 \"$FM_BITCOIND_URL\" --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 \"$FM_BITCOIND_URL\" --bitcoind-username \"$FM_BITCOIND_USERNAME\" --bitcoind-password \"$FM_BITCOIND_PASSWORD\" ldk --ldk-lightning-port 9737 --ldk-alias archipelago-gateway;\nfi"
2026-07-22 03:49:19 -04:00
],
"data_uid" : "1000:1000" ,
2026-07-22 22:07:15 -04:00
"derived_env" : [
{
"key" : "FM_BITCOIND_URL" ,
"template" : "http://{{BITCOIN_HOST}}:8332"
}
],
2026-06-23 23:45:31 -04:00
"entrypoint" : [
"sh" ,
"-lc"
],
"generated_secrets" : [
{
2026-07-22 03:49:19 -04:00
"kind" : "bcrypt" ,
"name" : "fedimint-gateway-hash"
2026-06-23 23:45:31 -04:00
}
],
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/gatewayd:v0.10.0" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "FM_BITCOIND_PASSWORD" ,
"secret_file" : "bitcoin-rpc-password"
},
{
"key" : "FEDI_HASH" ,
"secret_file" : "fedimint-gateway-hash"
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"app_id" : "bitcoin-core" ,
"version" : ">=26.0"
},
{
"app_id" : "fedimint" ,
"version" : ">=0.10.0"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Fedimint gateway service with automatic LND-or-LDK backend selection." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"FM_BITCOIND_USERNAME=archipelago"
],
"health_check" : {
"endpoint" : "http://localhost:8176" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/" ,
"retries" : 3 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "fedimint-gateway" ,
"name" : "Fedimint Gateway" ,
"ports" : [
{
"container" : 8176 ,
"host" : 8176 ,
"protocol" : "tcp"
},
{
"container" : 9737 ,
"host" : 9737 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 2 ,
"disk_limit" : "10Gi" ,
"memory_limit" : "2Gi"
},
"security" : {
"capabilities" : [],
"network_policy" : "isolated" ,
"readonly_root" : true
},
"version" : "0.10.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/fedimint-gateway" ,
"target" : "/data" ,
"type" : "bind"
},
{
"options" : [
"ro"
],
"source" : "/var/lib/archipelago/lnd" ,
"target" : "/lnd" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "v0.10.0"
2026-06-23 23:45:31 -04:00
},
"filebrowser" : {
"image" : "146.59.87.168:3000/lfg2025/filebrowser:v2.27.0" ,
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"rpc_access" : "none" ,
"sync_required" : false
},
2026-06-23 23:45:31 -04:00
"container" : {
"custom_args" : [
"--config" ,
"/data/.filebrowser.json"
],
2026-07-22 03:49:19 -04:00
"data_uid" : "100000:100000" ,
"image" : "146.59.87.168:3000/lfg2025/filebrowser:v2.27.0" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"storage" : "10Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Baseline Archipelago file manager service." ,
"environment" : [],
"health_check" : {
"endpoint" : "http://localhost:80" ,
"interval" : "30s" ,
"path" : "/health" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "http"
},
"id" : "filebrowser" ,
"name" : "File Browser" ,
"ports" : [
{
"container" : 80 ,
"host" : 8083 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "10Gi" ,
"memory_limit" : "256Mi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"FOWNER" ,
"SETUID" ,
"SETGID" ,
"DAC_OVERRIDE" ,
"NET_BIND_SERVICE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "2.27.0" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-22 03:49:19 -04:00
"options" : [
"rw"
],
2026-06-23 23:45:31 -04:00
"source" : "/var/lib/archipelago/filebrowser" ,
"target" : "/srv" ,
2026-07-22 03:49:19 -04:00
"type" : "bind"
2026-07-21 21:55:08 +01:00
},
{
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/filebrowser-data" ,
"target" : "/data" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "v2.27.0"
2026-06-23 23:45:31 -04:00
},
"fips" : {
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/fips:v0.1.0" ,
"version" : "v0.1.0"
2026-06-23 23:45:31 -04:00
},
"fips-ui" : {
"manifest" : {
"app" : {
"container" : {
"build" : {
"context" : "/opt/archipelago/docker/fips-ui" ,
"dockerfile" : "Dockerfile" ,
"tag" : "localhost/fips-ui:local"
}
},
2026-07-22 03:49:19 -04:00
"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 — there is no separate secret to manage.\n" ,
"environment" : [],
"health_check" : {
"endpoint" : "http://127.0.0.1:8336" ,
"interval" : "30s" ,
"path" : "/" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "http"
},
"id" : "fips-ui" ,
"name" : "FIPS Mesh" ,
"ports" : [],
2026-06-23 23:45:31 -04:00
"resources" : {
"memory_limit" : "128Mi"
},
"security" : {
2026-07-22 03:49:19 -04:00
"network_policy" : "host" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "1.0.0" ,
"volumes" : []
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "1.0.0"
2026-06-23 23:45:31 -04:00
},
"gitea" : {
"manifest" : {
"app" : {
"category" : "development" ,
"container" : {
"image" : "docker.io/gitea/gitea:1.23" ,
"pull_policy" : "if-not-present"
},
"dependencies" : [
{
"storage" : "500Mi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Self-hosted Git service with built-in container registry, CI/CD, and package hosting." ,
2026-07-21 21:55:08 +01:00
"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" : {
"endpoint" : "http://localhost:3000" ,
"interval" : "120s" ,
2026-07-22 03:49:19 -04:00
"path" : "/" ,
"retries" : 5 ,
2026-07-21 21:55:08 +01:00
"timeout" : "30s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-07-21 21:55:08 +01:00
},
2026-07-22 03:49:19 -04:00
"id" : "gitea" ,
2026-07-21 21:55:08 +01:00
"interfaces" : {
"main" : {
"description" : "Gitea web interface" ,
2026-07-22 03:49:19 -04:00
"name" : "Web UI" ,
"path" : "/" ,
2026-07-21 21:55:08 +01:00
"port" : 3001 ,
"protocol" : "http" ,
2026-07-22 03:49:19 -04:00
"type" : "ui"
2026-07-21 21:55:08 +01:00
}
},
"metadata" : {
"features" : [
"Git repositories with web UI" ,
"Built-in container/package registry" ,
"Issue tracking and pull requests" ,
"CI/CD via Gitea Actions" ,
"Lightweight SQLite deployment"
2026-07-22 03:49:19 -04:00
],
"icon" : "/assets/img/app-icons/gitea.svg" ,
"launch" : {
"open_in_new_tab" : true
},
"repo" : "https://gitea.com" ,
"tier" : "optional"
2026-07-21 21:55:08 +01:00
},
2026-07-22 03:49:19 -04:00
"name" : "Gitea" ,
2026-07-21 21:55:08 +01:00
"nginx_proxy" : {
"extra_headers" : [
"proxy_hide_header X-Frame-Options" ,
"proxy_hide_header Content-Security-Policy"
2026-07-22 03:49:19 -04:00
],
"listen" : 3000 ,
"proxy_pass" : "http://127.0.0.1:3001"
},
"ports" : [
{
"container" : 3000 ,
"host" : 3001 ,
"protocol" : "tcp"
},
{
"container" : 22 ,
"host" : 2222 ,
"protocol" : "tcp"
}
],
"resources" : {
"disk_limit" : "500Mi" ,
"memory_limit" : "256Mi"
},
"security" : {
"capabilities" : [
"CHOWN" ,
"FOWNER" ,
"SETUID" ,
"SETGID" ,
"DAC_OVERRIDE" ,
"NET_BIND_SERVICE"
],
"network_policy" : "bridge" ,
"no_new_privileges" : false ,
"readonly_root" : false
},
"version" : "1.23" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/gitea/data" ,
"target" : "/data" ,
"type" : "bind"
},
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/gitea/config" ,
"target" : "/etc/gitea" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "1.23"
2026-06-23 23:45:31 -04:00
},
"grafana" : {
"image" : "146.59.87.168:3000/lfg2025/grafana:10.2.0" ,
"manifest" : {
"app" : {
"container" : {
2026-07-22 03:49:19 -04:00
"data_uid" : "472:472" ,
2026-06-23 23:45:31 -04:00
"image" : "grafana/grafana:10.2.0" ,
"image_signature" : "cosign://..." ,
2026-07-22 03:49:19 -04:00
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"storage" : "5Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Analytics and monitoring platform. Visualize metrics and create dashboards." ,
2026-06-23 23:45:31 -04:00
"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" : {
"endpoint" : "http://localhost:3000" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/api/health" ,
"retries" : 5 ,
2026-06-23 23:45:31 -04:00
"timeout" : "30s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "grafana" ,
2026-06-23 23:45:31 -04:00
"metadata" : {
"launch" : {
"open_in_new_tab" : true
}
2026-07-22 03:49:19 -04:00
},
"name" : "Grafana" ,
"ports" : [
{
"container" : 3000 ,
"host" : 3000 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 2 ,
"disk_limit" : "5Gi" ,
"memory_limit" : "1Gi"
},
"security" : {
"apparmor_profile" : "grafana" ,
"capabilities" : [],
"network_policy" : "isolated" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default" ,
"user" : 1000
},
"version" : "10.2.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/grafana" ,
"target" : "/var/lib/grafana" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "10.2.0"
2026-06-23 23:45:31 -04:00
},
"homeassistant" : {
2026-07-21 21:55:08 +01:00
"image" : "146.59.87.168:3000/lfg2025/home-assistant:2026.7.3" ,
2026-06-23 23:45:31 -04:00
"manifest" : {
"app" : {
"container" : {
2026-07-21 21:55:08 +01:00
"image" : "146.59.87.168:3000/lfg2025/home-assistant:2026.7.3" ,
2026-07-22 03:49:19 -04:00
"network" : "pasta" ,
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"storage" : "10Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Open source home automation platform. Control and monitor your smart home devices." ,
"devices" : [],
"environment" : [
"TZ=UTC"
],
"health_check" : {
"endpoint" : "localhost:8123" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "homeassistant" ,
"interfaces" : {
"main" : {
"description" : "Home Assistant dashboard" ,
"name" : "Web UI" ,
"path" : "/" ,
"port" : 8123 ,
"protocol" : "http" ,
"type" : "ui"
}
},
"metadata" : {
"author" : "Home Assistant" ,
"category" : "home" ,
"icon" : "/assets/img/app-icons/homeassistant.png" ,
"launch" : {
"open_in_new_tab" : true
},
"repo" : "https://github.com/home-assistant/core"
},
"name" : "Home Assistant" ,
"ports" : [
{
"container" : 8123 ,
"host" : 8123 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
"cpu_limit" : 2 ,
2026-07-22 03:49:19 -04:00
"disk_limit" : "10Gi" ,
"memory_limit" : "512Mi"
2026-06-23 23:45:31 -04:00
},
"security" : {
2026-07-22 03:49:19 -04:00
"apparmor_profile" : "home-assistant" ,
2026-06-23 23:45:31 -04:00
"capabilities" : [
"CHOWN" ,
"FOWNER" ,
"SETUID" ,
"SETGID" ,
"DAC_OVERRIDE" ,
"NET_BIND_SERVICE" ,
"NET_RAW"
],
2026-07-21 21:55:08 +01:00
"network_policy" : "isolated" ,
2026-07-22 03:49:19 -04:00
"no_new_privileges" : true ,
"readonly_root" : false ,
"seccomp_profile" : "default" ,
"user" : 1000
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "2026.7.3" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/home-assistant" ,
"target" : "/config" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "2026.7.3"
2026-06-23 23:45:31 -04:00
},
"immich" : {
"image" : "146.59.87.168:3000/lfg2025/immich-server:release" ,
"images" : {
"immich_postgres" : "146.59.87.168:3000/lfg2025/immich-postgres:14-vectorchord0.4.3-pgvectors0.2.0" ,
2026-07-22 03:49:19 -04:00
"immich_redis" : "146.59.87.168:3000/lfg2025/redis:7.4.8" ,
"immich_server" : "146.59.87.168:3000/lfg2025/immich-server:release"
2026-06-23 23:45:31 -04:00
},
"manifest" : {
"app" : {
"container" : {
"image" : "146.59.87.168:3000/lfg2025/immich-server:release" ,
2026-07-21 21:55:08 +01:00
"network" : "archy-net" ,
2026-07-22 03:49:19 -04:00
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "DB_PASSWORD" ,
"secret_file" : "immich-db-password"
}
]
},
2026-07-22 03:49:19 -04:00
"container_name" : "immich_server" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"app_id" : "immich-postgres"
},
{
"app_id" : "immich-redis"
},
{
"storage" : "200Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Self-hosted photo and video backup with mobile apps and search." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"DB_HOSTNAME=immich_postgres" ,
"DB_USERNAME=postgres" ,
"DB_DATABASE_NAME=immich" ,
"REDIS_HOSTNAME=immich_redis" ,
"UPLOAD_LOCATION=/usr/src/app/upload"
],
"health_check" : {
"endpoint" : "http://localhost:2283" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/api/server/ping" ,
"retries" : 20 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "immich" ,
2026-06-23 23:45:31 -04:00
"interfaces" : {
"main" : {
2026-07-21 21:55:08 +01:00
"description" : "Immich photo library" ,
2026-07-22 03:49:19 -04:00
"name" : "Web UI" ,
"path" : "/" ,
2026-06-23 23:45:31 -04:00
"port" : 2283 ,
"protocol" : "http" ,
2026-07-22 03:49:19 -04:00
"type" : "ui"
2026-06-23 23:45:31 -04:00
}
},
"metadata" : {
"launch" : {
"open_in_new_tab" : true
}
2026-07-22 03:49:19 -04:00
},
"name" : "Immich" ,
"ports" : [
{
"container" : 2283 ,
"host" : 2283 ,
"protocol" : "tcp"
}
],
"resources" : {
"disk_limit" : "200Gi" ,
"memory_limit" : "2Gi"
},
"security" : {
"capabilities" : [
"CHOWN" ,
"DAC_OVERRIDE" ,
"FOWNER"
],
"network_policy" : "isolated" ,
"readonly_root" : false
},
"version" : "2.7.4" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/immich" ,
"target" : "/usr/src/app/upload" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "release"
2026-06-23 23:45:31 -04:00
},
"immich-postgres" : {
"manifest" : {
"app" : {
"container" : {
"data_uid" : "100998:100998" ,
"generated_secrets" : [
{
2026-07-22 03:49:19 -04:00
"kind" : "hex32" ,
"name" : "immich-db-password"
2026-06-23 23:45:31 -04:00
}
],
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/immich-postgres:14-vectorchord0.4.3-pgvectors0.2.0" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "POSTGRES_PASSWORD" ,
"secret_file" : "immich-db-password"
}
]
},
2026-07-22 03:49:19 -04:00
"container_name" : "immich_postgres" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"storage" : "40Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Postgres (pgvecto.rs / vectorchord) backend for Immich." ,
"environment" : [
"POSTGRES_USER=postgres" ,
"POSTGRES_DB=immich"
],
"health_check" : {
"endpoint" : "localhost:5432" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "immich-postgres" ,
"name" : "Immich Postgres" ,
"ports" : [],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "40Gi" ,
"memory_limit" : "2Gi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"DAC_OVERRIDE" ,
"FOWNER" ,
"SETGID" ,
"SETUID"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "14-vectorchord0.4.3-pgvectors0.2.0" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/immich-db" ,
"target" : "/var/lib/postgresql/data" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "14-vectorchord0.4.3-pgvectors0.2.0"
2026-06-23 23:45:31 -04:00
},
"immich-redis" : {
"manifest" : {
"app" : {
2026-07-21 21:55:08 +01:00
"container" : {
"image" : "146.59.87.168:3000/lfg2025/valkey:7-alpine" ,
2026-07-22 03:49:19 -04:00
"network" : "archy-net" ,
"pull_policy" : "if-not-present"
2026-07-21 21:55:08 +01:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "immich_redis" ,
2026-07-21 21:55:08 +01:00
"dependencies" : [],
2026-07-22 03:49:19 -04:00
"description" : "Valkey (Redis-compatible) cache for Immich." ,
"environment" : [],
"health_check" : {
"endpoint" : "localhost:6379" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "immich-redis" ,
"name" : "Immich Redis" ,
"ports" : [],
2026-06-23 23:45:31 -04:00
"resources" : {
"memory_limit" : "128Mi"
},
"security" : {
"capabilities" : [
"SETGID" ,
"SETUID"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "7-alpine" ,
"volumes" : []
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "7-alpine"
2026-06-23 23:45:31 -04:00
},
"indeedhub" : {
"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" : {
"category" : "community" ,
"container" : {
"image" : "146.59.87.168:3000/lfg2025/indeedhub:1.0.0" ,
2026-07-22 03:49:19 -04:00
"network" : "indeedhub-net" ,
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "indeedhub" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"app_id" : "indeedhub-api"
},
{
"storage" : "1Gi"
}
],
2026-07-22 03:49:19 -04:00
"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." ,
2026-07-21 21:55:08 +01:00
"environment" : [],
2026-07-22 03:49:19 -04:00
"health_check" : {
"endpoint" : "localhost:7777" ,
"interval" : "30s" ,
"retries" : 5 ,
"start_period" : "30s" ,
"timeout" : "5s" ,
"type" : "tcp"
},
2026-06-23 23:45:31 -04:00
"hooks" : {
"post_install" : [
{
"exec" : [
"sed" ,
"-i" ,
"/X-Frame-Options/d" ,
"/etc/nginx/conf.d/default.conf"
]
},
{
"copy_from_host" : {
2026-07-22 03:49:19 -04:00
"dest" : "/usr/share/nginx/html/nostr-provider.js" ,
"src" : "web-ui/nostr-provider.js"
2026-06-23 23:45:31 -04:00
}
},
{
"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"
]
}
]
},
2026-07-22 03:49:19 -04:00
"id" : "indeedhub" ,
2026-06-23 23:45:31 -04:00
"interfaces" : {
"main" : {
2026-07-21 21:55:08 +01:00
"description" : "Stream Bitcoin documentaries with Nostr identity" ,
2026-07-22 03:49:19 -04:00
"name" : "Web UI" ,
"path" : "/" ,
2026-06-23 23:45:31 -04:00
"port" : 7778 ,
"protocol" : "http" ,
2026-07-22 03:49:19 -04:00
"type" : "ui"
2026-06-23 23:45:31 -04:00
}
},
"metadata" : {
"author" : "Indeehub Team" ,
"icon" : "/assets/img/app-icons/indeedhub.png" ,
2026-07-21 21:55:08 +01:00
"license" : "MIT" ,
2026-07-22 03:49:19 -04:00
"repo" : "https://github.com/indeedhub/indeedhub" ,
2026-06-23 23:45:31 -04:00
"tags" : [
"bitcoin" ,
"documentary" ,
"streaming" ,
"media" ,
"education" ,
"nostr"
2026-07-22 03:49:19 -04:00
],
"website" : "https://indeedhub.com"
},
"name" : "IndeeHub" ,
"ports" : [
{
"container" : 7777 ,
"host" : 7778 ,
"protocol" : "tcp"
}
],
"resources" : {
"disk_limit" : "1Gi" ,
"memory_limit" : "512Mi"
},
"security" : {
"capabilities" : [
"CHOWN" ,
"DAC_OVERRIDE" ,
"SETGID" ,
"SETUID"
],
"network_policy" : "isolated" ,
"readonly_root" : false
},
"version" : "1.0.0" ,
"volumes" : [
{
"options" : [
"rw" ,
"nosuid" ,
"nodev" ,
"size=16m"
],
"target" : "/run" ,
"type" : "tmpfs"
},
{
"options" : [
"rw" ,
"nosuid" ,
"nodev" ,
"size=32m"
],
"target" : "/var/cache/nginx" ,
"type" : "tmpfs"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "1.0.0"
2026-06-23 23:45:31 -04:00
},
"indeedhub-api" : {
"manifest" : {
"app" : {
"category" : "community" ,
"container" : {
2026-07-22 03:49:19 -04:00
"generated_secrets" : [
{
"kind" : "hex32" ,
"name" : "indeedhub-jwt"
}
],
2026-06-23 23:45:31 -04:00
"image" : "146.59.87.168:3000/lfg2025/indeedhub-api:1.0.0" ,
"network" : "indeedhub-net" ,
"network_aliases" : [
"api"
],
2026-07-22 03:49:19 -04:00
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"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"
}
]
},
2026-07-22 03:49:19 -04:00
"container_name" : "indeedhub-api" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"app_id" : "indeedhub-postgres"
},
{
"app_id" : "indeedhub-redis"
},
{
"app_id" : "indeedhub-minio"
}
],
2026-07-22 03:49:19 -04:00
"description" : "IndeedHub backend API (Nostr auth, media, payments)." ,
2026-06-23 23:45:31 -04:00
"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" : {
"endpoint" : "localhost:4000" ,
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"retries" : 10 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "tcp"
},
"id" : "indeedhub-api" ,
"name" : "IndeedHub API" ,
"ports" : [],
"resources" : {
"memory_limit" : "2Gi"
},
"security" : {
"capabilities" : [],
"network_policy" : "isolated" ,
"readonly_root" : false
},
"version" : "1.0.0" ,
"volumes" : []
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "1.0.0"
2026-06-23 23:45:31 -04:00
},
"indeedhub-ffmpeg" : {
"manifest" : {
"app" : {
"category" : "community" ,
"container" : {
"image" : "146.59.87.168:3000/lfg2025/indeedhub-ffmpeg:1.0.0" ,
2026-07-21 21:55:08 +01:00
"network" : "indeedhub-net" ,
2026-07-22 03:49:19 -04:00
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "DATABASE_PASSWORD" ,
"secret_file" : "indeedhub-db-password"
},
{
"key" : "AWS_SECRET_KEY" ,
"secret_file" : "indeedhub-minio-password"
}
]
},
2026-07-22 03:49:19 -04:00
"container_name" : "indeedhub-ffmpeg" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"app_id" : "indeedhub-api"
}
],
2026-07-22 03:49:19 -04:00
"description" : "IndeedHub background media transcoding worker." ,
2026-06-23 23:45:31 -04:00
"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"
2026-07-22 03:49:19 -04:00
],
"id" : "indeedhub-ffmpeg" ,
"name" : "IndeedHub FFmpeg Worker" ,
"ports" : [],
"resources" : {
"memory_limit" : "4Gi"
},
"security" : {
"capabilities" : [],
"network_policy" : "isolated" ,
"readonly_root" : false
},
"version" : "1.0.0" ,
"volumes" : []
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "1.0.0"
2026-06-23 23:45:31 -04:00
},
"indeedhub-minio" : {
"manifest" : {
"app" : {
"category" : "community" ,
"container" : {
"custom_args" : [
"server" ,
"/data"
],
"generated_secrets" : [
{
2026-07-22 03:49:19 -04:00
"kind" : "hex32" ,
"name" : "indeedhub-minio-password"
2026-06-23 23:45:31 -04:00
}
],
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/minio:RELEASE.2024-11-07T00-52-20Z" ,
"network" : "indeedhub-net" ,
"network_aliases" : [
"minio"
],
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "MINIO_ROOT_PASSWORD" ,
"secret_file" : "indeedhub-minio-password"
}
]
},
2026-07-22 03:49:19 -04:00
"container_name" : "indeedhub-minio" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"storage" : "50Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "MinIO S3-compatible object storage for IndeedHub media." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"MINIO_ROOT_USER=indeeadmin"
],
"health_check" : {
"endpoint" : "http://localhost:9000" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/minio/health/live" ,
"retries" : 5 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
},
"id" : "indeedhub-minio" ,
"name" : "IndeedHub MinIO" ,
"ports" : [],
"resources" : {
"disk_limit" : "50Gi" ,
"memory_limit" : "1Gi"
},
"security" : {
"capabilities" : [],
"network_policy" : "isolated" ,
"readonly_root" : false
},
"version" : "RELEASE.2024-11-07T00-52-20Z" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "indeedhub-minio-data" ,
"target" : "/data" ,
"type" : "volume"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "RELEASE.2024-11-07T00-52-20Z"
2026-06-23 23:45:31 -04:00
},
"indeedhub-postgres" : {
"manifest" : {
"app" : {
"category" : "community" ,
"container" : {
2026-07-22 03:49:19 -04:00
"generated_secrets" : [
{
"kind" : "hex32" ,
"name" : "indeedhub-db-password"
}
],
2026-06-23 23:45:31 -04:00
"image" : "146.59.87.168:3000/lfg2025/postgres:16.13-alpine" ,
"network" : "indeedhub-net" ,
"network_aliases" : [
"postgres"
],
2026-07-22 03:49:19 -04:00
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "POSTGRES_PASSWORD" ,
"secret_file" : "indeedhub-db-password"
}
]
},
2026-07-22 03:49:19 -04:00
"container_name" : "indeedhub-postgres" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"storage" : "10Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Postgres database backend for IndeedHub." ,
"environment" : [
"POSTGRES_USER=indeedhub" ,
"POSTGRES_DB=indeedhub"
],
"health_check" : {
"endpoint" : "localhost:5432" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "indeedhub-postgres" ,
"name" : "IndeedHub Postgres" ,
"ports" : [],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "10Gi" ,
"memory_limit" : "1Gi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"DAC_OVERRIDE" ,
"FOWNER" ,
"SETGID" ,
"SETUID"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "16.13-alpine" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "indeedhub-postgres-data" ,
"target" : "/var/lib/postgresql/data" ,
"type" : "volume"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "16.13-alpine"
2026-06-23 23:45:31 -04:00
},
"indeedhub-redis" : {
"manifest" : {
"app" : {
"category" : "community" ,
"container" : {
"image" : "146.59.87.168:3000/lfg2025/redis:7.4.8-alpine" ,
"network" : "indeedhub-net" ,
"network_aliases" : [
"redis"
2026-07-22 03:49:19 -04:00
],
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "indeedhub-redis" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"storage" : "1Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Redis queue/cache backend for IndeedHub." ,
"environment" : [],
"health_check" : {
"endpoint" : "localhost:6379" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "indeedhub-redis" ,
"name" : "IndeedHub Redis" ,
"ports" : [],
2026-06-23 23:45:31 -04:00
"resources" : {
"memory_limit" : "256Mi"
},
"security" : {
"capabilities" : [
"SETGID" ,
"SETUID"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "7.4.8-alpine" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "indeedhub-redis-data" ,
"target" : "/data" ,
"type" : "volume"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "7.4.8-alpine"
2026-06-23 23:45:31 -04:00
},
"indeedhub-relay" : {
"manifest" : {
"app" : {
"category" : "community" ,
"container" : {
"image" : "146.59.87.168:3000/lfg2025/nostr-rs-relay:0.9.0" ,
"network" : "indeedhub-net" ,
"network_aliases" : [
"relay"
2026-07-22 03:49:19 -04:00
],
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "indeedhub-relay" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"storage" : "2Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "nostr-rs-relay backing IndeedHub's Nostr identity + comments." ,
"environment" : [],
"health_check" : {
"endpoint" : "localhost:8080" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "indeedhub-relay" ,
"name" : "IndeedHub Nostr Relay" ,
"ports" : [],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "2Gi" ,
"memory_limit" : "256Mi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "0.9.0" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "indeedhub-relay-data" ,
"target" : "/usr/src/app/db" ,
"type" : "volume"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "0.9.0"
2026-06-23 23:45:31 -04:00
},
"jellyfin" : {
"image" : "146.59.87.168:3000/lfg2025/jellyfin:10.8.13" ,
"manifest" : {
"app" : {
"container" : {
"image" : "146.59.87.168:3000/lfg2025/jellyfin:10.8.13" ,
2026-07-22 03:49:19 -04:00
"network" : "pasta" ,
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"storage" : "10Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Free media server. Stream movies, music, and photos." ,
"environment" : [],
"health_check" : {
"endpoint" : "localhost:8096" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "jellyfin" ,
"interfaces" : {
"main" : {
"description" : "Jellyfin media dashboard" ,
"name" : "Web UI" ,
"path" : "/" ,
"port" : 8096 ,
"protocol" : "http" ,
"type" : "ui"
}
},
"metadata" : {
"author" : "Jellyfin" ,
"category" : "data" ,
"icon" : "/assets/img/app-icons/jellyfin.webp" ,
"repo" : "https://github.com/jellyfin/jellyfin"
},
"name" : "Jellyfin" ,
"ports" : [
{
"container" : 8096 ,
"host" : 8096 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "10Gi" ,
"memory_limit" : "1Gi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"FOWNER" ,
"SETUID" ,
"SETGID" ,
"DAC_OVERRIDE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "10.8.13" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-22 03:49:19 -04:00
"options" : [
"rw"
],
2026-06-23 23:45:31 -04:00
"source" : "/var/lib/archipelago/jellyfin/config" ,
"target" : "/config" ,
2026-07-22 03:49:19 -04:00
"type" : "bind"
2026-07-21 21:55:08 +01:00
},
{
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/jellyfin/cache" ,
"target" : "/cache" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "10.8.13"
2026-06-23 23:45:31 -04:00
},
"lightning-stack" : {
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"rpc_access" : "admin" ,
"sync_required" : true
},
2026-06-23 23:45:31 -04:00
"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"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Complete Lightning Network implementation. Includes LND, CLN, and management tools." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"BITCOIND_HOST=bitcoin-core" ,
"BITCOIND_RPCUSER=${BITCOIN_RPC_USER}" ,
"BITCOIND_RPCPASS=${BITCOIN_RPC_PASSWORD}" ,
"NETWORK=mainnet"
],
"health_check" : {
2026-07-10 17:48:27 +01:00
"endpoint" : "http://127.0.0.1:8080" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/v1/getinfo" ,
"retries" : 3 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "lightning-stack" ,
"lightning_integration" : {
"channel_management" : true ,
"payment_routing" : true
},
"name" : "Lightning Stack" ,
"ports" : [
{
"container" : 9735 ,
"host" : 9738 ,
"protocol" : "tcp"
},
{
"container" : 10009 ,
"host" : 10010 ,
"protocol" : "tcp"
},
{
"container" : 8080 ,
"host" : 8091 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 4 ,
"disk_limit" : "50Gi" ,
"memory_limit" : "4Gi"
},
"security" : {
"apparmor_profile" : "lightning-stack" ,
"capabilities" : [
"NET_BIND_SERVICE"
],
"network_policy" : "isolated" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default" ,
"user" : 1000
},
"version" : "0.12.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/lightning-stack" ,
"target" : "/root/.lightning" ,
"type" : "bind"
}
]
}
},
"version" : "0.12.0"
},
"lnd" : {
"image" : "146.59.87.168:3000/lfg2025/lnd:v0.18.4-beta" ,
"manifest" : {
"app" : {
2026-06-23 23:45:31 -04:00
"bitcoin_integration" : {
"rpc_access" : "admin" ,
"sync_required" : true
},
"container" : {
2026-07-22 03:49:19 -04:00
"data_uid" : "100000:100000" ,
2026-07-08 21:03:03 -04:00
"derived_env" : [
{
"key" : "BITCOIND_HOST" ,
"template" : "{{BITCOIN_HOST}}"
}
],
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/lnd:v0.18.4-beta" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"secret_env" : [
{
"key" : "BITCOIND_RPCPASS" ,
"secret_file" : "bitcoin-rpc-password"
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"app_id" : "bitcoin-core" ,
"version" : ">=26.0"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Lightning Network implementation by Lightning Labs. Enables instant, low-cost Bitcoin payments." ,
"environment" : [
"BITCOIND_RPCUSER=archipelago" ,
"NETWORK=mainnet"
],
"health_check" : {
"endpoint" : "localhost:10009" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "lnd" ,
"lightning_integration" : {
"channel_management" : true ,
"payment_routing" : true
},
"name" : "LND" ,
"ports" : [
{
"container" : 9735 ,
"host" : 9735 ,
"protocol" : "tcp"
},
{
"container" : 10009 ,
"host" : 10009 ,
"protocol" : "tcp"
},
{
"container" : 8080 ,
"host" : 18080 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
"cpu_limit" : 2 ,
2026-07-22 03:49:19 -04:00
"disk_limit" : "10Gi" ,
"memory_limit" : "1Gi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"FOWNER" ,
"SETUID" ,
"SETGID" ,
"DAC_OVERRIDE" ,
"NET_RAW"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "0.18.4" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/lnd" ,
"target" : "/root/.lnd" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "v0.18.4-beta"
2026-06-23 23:45:31 -04:00
},
"lnd-ui" : {
"image" : "146.59.87.168:3000/lfg2025/lnd-ui:latest" ,
"manifest" : {
"app" : {
"container" : {
"build" : {
"context" : "/opt/archipelago/docker/lnd-ui" ,
"dockerfile" : "Dockerfile" ,
"tag" : "localhost/lnd-ui:local"
}
},
"dependencies" : [
{
"app_id" : "lnd"
}
],
2026-07-22 03:49:19 -04:00
"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" ,
"environment" : [],
"health_check" : {
"endpoint" : "http://127.0.0.1:18083" ,
"interval" : "30s" ,
"path" : "/" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "http"
},
"id" : "lnd-ui" ,
"name" : "LND UI" ,
"ports" : [
{
"container" : 80 ,
"host" : 18083 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
"memory_limit" : "64Mi"
},
"security" : {
2026-07-22 03:49:19 -04:00
"network_policy" : "bridge" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "1.0.0" ,
"volumes" : []
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "latest"
2026-06-23 23:45:31 -04:00
},
"mempool" : {
"image" : "146.59.87.168:3000/lfg2025/mempool-frontend:v3.0.1" ,
"images" : {
2026-07-22 03:49:19 -04:00
"archy-mempool-db" : "146.59.87.168:3000/lfg2025/mariadb:11.4.10" ,
2026-06-23 23:45:31 -04:00
"archy-mempool-web" : "146.59.87.168:3000/lfg2025/mempool-frontend:v3.0.1" ,
2026-07-22 03:49:19 -04:00
"mempool-api" : "146.59.87.168:3000/lfg2025/mempool-backend:v3.0.0"
2026-06-23 23:45:31 -04:00
},
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"rpc_access" : "read-only" ,
"sync_required" : true
},
2026-06-23 23:45:31 -04:00
"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"
2026-07-08 21:03:03 -04:00
},
"bitcoin:archival"
2026-06-23 23:45:31 -04:00
],
2026-07-22 03:49:19 -04:00
"description" : "Bitcoin mempool and blockchain explorer. Real-time transaction and block visualization." ,
2026-06-23 23:45:31 -04:00
"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" : {
"endpoint" : "http://localhost:4080" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/api/health" ,
"retries" : 3 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "mempool" ,
"name" : "Mempool Explorer" ,
"ports" : [
{
"container" : 8080 ,
"host" : 4080 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 2 ,
"disk_limit" : "20Gi" ,
"memory_limit" : "2Gi"
},
"security" : {
"apparmor_profile" : "mempool" ,
"capabilities" : [],
"network_policy" : "isolated" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default" ,
"user" : 1000
},
"version" : "3.0.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/mempool" ,
"target" : "/data" ,
"type" : "bind"
}
]
2026-07-21 21:55:08 +01:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "v3.0.1"
2026-07-21 21:55:08 +01:00
},
"mempool-api" : {
"manifest" : {
"app" : {
2026-07-22 03:49:19 -04:00
"bitcoin_integration" : {
"pruning_support" : false ,
"rpc_access" : "read-only" ,
"sync_required" : true
},
2026-06-23 23:45:31 -04:00
"container" : {
"derived_env" : [
{
"key" : "CORE_RPC_HOST" ,
"template" : "{{BITCOIN_HOST}}"
}
],
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/mempool-backend:v3.0.0" ,
"network" : "archy-net" ,
"pull_policy" : "if-not-present" ,
2026-06-23 23:45:31 -04:00
"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"
2026-07-08 21:03:03 -04:00
},
"bitcoin:archival"
2026-06-23 23:45:31 -04:00
],
2026-07-22 03:49:19 -04:00
"description" : "Backend API for mempool explorer." ,
2026-06-23 23:45:31 -04:00
"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" : {
"endpoint" : "http://localhost:8999" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/api/v1/backend-info" ,
"retries" : 3 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "mempool-api" ,
"name" : "Mempool API" ,
"ports" : [
{
"container" : 8999 ,
"host" : 8999 ,
"protocol" : "tcp"
}
],
"resources" : {
"disk_limit" : "20Gi" ,
"memory_limit" : "2Gi"
},
"security" : {
"capabilities" : [],
"network_policy" : "isolated" ,
"readonly_root" : false
},
"version" : "3.0.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/mempool" ,
"target" : "/data" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "3.0.0"
2026-06-23 23:45:31 -04:00
},
"morphos-server" : {
"manifest" : {
"app" : {
"container" : {
"image" : "archipelago/morphos-server:1.0.0" ,
"image_signature" : "cosign://..." ,
"pull_policy" : "if-not-present"
},
"dependencies" : [
{
"storage" : "5Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "MorphOS server platform. Decentralized application server." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"MORPHOS_ENV=production" ,
"MORPHOS_DATA_DIR=/app/data"
],
"health_check" : {
2026-07-10 17:48:27 +01:00
"endpoint" : "http://127.0.0.1:8080" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/health" ,
"retries" : 3 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
},
"id" : "morphos-server" ,
"name" : "MorphOS Server" ,
"ports" : [
{
"container" : 8080 ,
"host" : 8089 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 2 ,
"disk_limit" : "5Gi" ,
"memory_limit" : "2Gi"
},
"security" : {
"apparmor_profile" : "morphos-server" ,
"capabilities" : [],
"network_policy" : "isolated" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default" ,
"user" : 1000
},
"version" : "1.0.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/morphos-server" ,
"target" : "/app/data" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "1.0.0"
2026-06-23 23:45:31 -04:00
},
"netbird" : {
"manifest" : {
"app" : {
"category" : "networking" ,
"container" : {
"generated_certs" : [
{
"crt" : "/var/lib/archipelago/netbird/tls.crt" ,
"key" : "/var/lib/archipelago/netbird/tls.key"
}
2026-07-22 03:49:19 -04:00
],
"image" : "docker.io/library/nginx:1.27-alpine" ,
"network" : "netbird-net" ,
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "netbird" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"app_id" : "netbird-server"
},
{
"app_id" : "netbird-dashboard"
},
{
"storage" : "1Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Self-hosted WireGuard mesh VPN control plane with dashboard, embedded identity provider, management API, signal, relay, and STUN. The user-facing entry point — a TLS proxy in front of the dashboard + server." ,
"environment" : [],
"files" : [
{
"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 —\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" ,
"overwrite" : true ,
"path" : "/var/lib/archipelago/netbird/nginx.conf"
}
],
"health_check" : {
"endpoint" : "localhost:443" ,
"interval" : "30s" ,
"retries" : 5 ,
"start_period" : "20s" ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "netbird" ,
"interfaces" : {
"main" : {
"description" : "Manage your self-hosted NetBird mesh VPN" ,
"name" : "Dashboard" ,
"path" : "/" ,
"port" : 8087 ,
"protocol" : "https" ,
"type" : "ui"
}
},
"metadata" : {
"author" : "NetBird" ,
"icon" : "/assets/img/app-icons/netbird.svg" ,
"license" : "BSD-3-Clause" ,
"repo" : "https://github.com/netbirdio/netbird" ,
"tags" : [
"networking" ,
"vpn" ,
"wireguard" ,
"mesh"
],
"website" : "https://netbird.io"
},
"name" : "NetBird" ,
"ports" : [
{
"container" : 443 ,
"host" : 8087 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
"memory_limit" : "256Mi"
},
"security" : {
"capabilities" : [
"CHOWN" ,
"DAC_OVERRIDE" ,
"SETGID" ,
"SETUID" ,
"NET_BIND_SERVICE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "2.38.0" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-22 03:49:19 -04:00
"options" : [
"ro"
],
2026-06-23 23:45:31 -04:00
"source" : "/var/lib/archipelago/netbird/nginx.conf" ,
"target" : "/etc/nginx/conf.d/default.conf" ,
2026-07-22 03:49:19 -04:00
"type" : "bind"
2026-07-21 21:55:08 +01:00
},
{
2026-07-22 03:49:19 -04:00
"options" : [
"ro"
],
2026-06-23 23:45:31 -04:00
"source" : "/var/lib/archipelago/netbird/tls.crt" ,
"target" : "/etc/nginx/tls.crt" ,
2026-07-22 03:49:19 -04:00
"type" : "bind"
2026-07-21 21:55:08 +01:00
},
{
"options" : [
"ro"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/netbird/tls.key" ,
"target" : "/etc/nginx/tls.key" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "2.38.0"
2026-06-23 23:45:31 -04:00
},
"netbird-dashboard" : {
"manifest" : {
"app" : {
"category" : "networking" ,
"container" : {
"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"
}
2026-07-22 03:49:19 -04:00
],
"image" : "docker.io/netbirdio/dashboard:v2.38.0" ,
"network" : "netbird-net" ,
"network_aliases" : [
"netbird-dashboard"
],
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "netbird-dashboard" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"app_id" : "netbird-server"
}
],
2026-07-22 03:49:19 -04:00
"description" : "NetBird management dashboard (SPA). Internal stack member served through the netbird proxy." ,
2026-06-23 23:45:31 -04:00
"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" : {
"endpoint" : "localhost:80" ,
"interval" : "30s" ,
2026-07-21 21:55:08 +01:00
"retries" : 5 ,
2026-07-22 03:49:19 -04:00
"start_period" : "20s" ,
"timeout" : "5s" ,
"type" : "tcp"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "netbird-dashboard" ,
2026-06-23 23:45:31 -04:00
"metadata" : {
"author" : "NetBird" ,
"icon" : "/assets/img/app-icons/netbird.svg" ,
2026-07-21 21:55:08 +01:00
"license" : "BSD-3-Clause" ,
2026-07-22 03:49:19 -04:00
"repo" : "https://github.com/netbirdio/dashboard" ,
2026-06-23 23:45:31 -04:00
"tags" : [
"networking" ,
"vpn" ,
"dashboard"
2026-07-22 03:49:19 -04:00
],
"website" : "https://netbird.io"
},
"name" : "NetBird Dashboard" ,
"ports" : [],
"resources" : {
"memory_limit" : "256Mi"
},
"security" : {
"capabilities" : [
"CHOWN" ,
"DAC_OVERRIDE" ,
"SETGID" ,
"SETUID" ,
"NET_BIND_SERVICE"
],
"network_policy" : "isolated" ,
"readonly_root" : false
},
"version" : "2.38.0" ,
"volumes" : []
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "2.38.0"
2026-06-23 23:45:31 -04:00
},
"netbird-server" : {
"manifest" : {
"app" : {
"category" : "networking" ,
"container" : {
2026-07-22 03:49:19 -04:00
"custom_args" : [
"--config" ,
"/etc/netbird/config.yaml"
],
"generated_secrets" : [
{
"kind" : "base64" ,
"name" : "netbird-relay-auth-secret"
},
{
"kind" : "base64" ,
"name" : "netbird-store-encryption-key"
}
],
2026-06-23 23:45:31 -04:00
"image" : "docker.io/netbirdio/netbird-server:0.71.2" ,
"network" : "netbird-net" ,
"network_aliases" : [
"netbird-server"
],
2026-07-22 03:49:19 -04:00
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "netbird-server" ,
2026-06-23 23:45:31 -04:00
"dependencies" : [
{
"storage" : "1Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "NetBird combined management / signal / relay server with an embedded identity provider and STUN. Backend for the self-hosted NetBird mesh VPN." ,
"environment" : [],
"files" : [
{
"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" ,
"overwrite" : true ,
"path" : "/var/lib/archipelago/netbird/config.yaml"
}
],
"health_check" : {
"endpoint" : "localhost:80" ,
"interval" : "30s" ,
"retries" : 10 ,
"start_period" : "30s" ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "netbird-server" ,
"metadata" : {
"author" : "NetBird" ,
"icon" : "/assets/img/app-icons/netbird.svg" ,
"license" : "BSD-3-Clause" ,
"repo" : "https://github.com/netbirdio/netbird" ,
"tags" : [
"networking" ,
"vpn" ,
"wireguard" ,
"mesh"
],
"website" : "https://netbird.io"
},
"name" : "NetBird Server" ,
"ports" : [
{
"container" : 80 ,
"host" : 8086 ,
"protocol" : "tcp"
},
{
"container" : 3478 ,
"host" : 3478 ,
"protocol" : "udp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
"memory_limit" : "1Gi"
},
"security" : {
"capabilities" : [
"NET_BIND_SERVICE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "0.71.2" ,
2026-07-21 21:55:08 +01:00
"volumes" : [
{
2026-07-10 17:48:27 +01:00
"options" : [
2026-07-21 21:55:08 +01:00
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/netbird/data" ,
"target" : "/var/lib/netbird" ,
"type" : "bind"
2026-07-21 21:55:08 +01:00
},
{
"options" : [
"ro"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/netbird/config.yaml" ,
"target" : "/etc/netbird/config.yaml" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "0.71.2"
2026-06-23 23:45:31 -04:00
},
"nextcloud" : {
"image" : "146.59.87.168:3000/lfg2025/nextcloud:29" ,
"manifest" : {
"app" : {
"container" : {
"image" : "146.59.87.168:3000/lfg2025/nextcloud:29" ,
2026-07-22 03:49:19 -04:00
"network" : "pasta" ,
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"storage" : "10Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Your own private cloud. File sync, calendars, contacts." ,
"environment" : [],
"health_check" : {
"endpoint" : "localhost:80" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "nextcloud" ,
"interfaces" : {
"main" : {
"description" : "Nextcloud file and collaboration dashboard" ,
"name" : "Web UI" ,
"path" : "/" ,
"port" : 8085 ,
"protocol" : "http" ,
"type" : "ui"
}
},
"metadata" : {
"author" : "Nextcloud" ,
"category" : "data" ,
"icon" : "/assets/img/app-icons/nextcloud.webp" ,
"launch" : {
"open_in_new_tab" : true
},
"repo" : "https://github.com/nextcloud/server"
},
"name" : "Nextcloud" ,
"ports" : [
{
"container" : 80 ,
"host" : 8085 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "10Gi" ,
"memory_limit" : "1Gi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"SETUID" ,
"SETGID" ,
"DAC_OVERRIDE" ,
"NET_BIND_SERVICE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "29" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/nextcloud" ,
"target" : "/var/www/html" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "29"
2026-06-23 23:45:31 -04:00
},
"nginx-proxy-manager" : {
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/nginx-proxy-manager:latest" ,
"version" : "latest"
2026-06-23 23:45:31 -04:00
},
"nostr-rs-relay" : {
"image" : "146.59.87.168:3000/lfg2025/nostr-rs-relay:0.9.0" ,
"manifest" : {
"app" : {
"container" : {
2026-07-22 03:49:19 -04:00
"data_uid" : "1000:1000" ,
2026-06-23 23:45:31 -04:00
"image" : "scsibug/nostr-rs-relay:0.8.9" ,
"image_signature" : "cosign://..." ,
2026-07-22 03:49:19 -04:00
"pull_policy" : "verify-signature"
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"storage" : "10Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "High-performance Nostr relay written in Rust. Host your own decentralized social media relay and earn networking profits." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"RELAY_NAME=Archipelago Nostr Relay" ,
"RELAY_DESCRIPTION=Self-hosted Nostr relay on Archipelago" ,
"MAX_EVENTS=1000000" ,
"MAX_SUBSCRIPTIONS=100"
],
"health_check" : {
"endpoint" : "http://localhost:8080" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/" ,
"retries" : 5 ,
2026-06-23 23:45:31 -04:00
"timeout" : "30s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "nostr-rs-relay" ,
"name" : "Nostr Relay (Rust)" ,
2026-06-23 23:45:31 -04:00
"nostr_integration" : {
2026-07-22 03:49:19 -04:00
"event_storage" : "sqlite" ,
2026-06-23 23:45:31 -04:00
"monetization_enabled" : true ,
2026-07-22 03:49:19 -04:00
"relay_type" : "public"
},
"ports" : [
{
"container" : 8080 ,
"host" : 18081 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 2 ,
"disk_limit" : "10Gi" ,
"memory_limit" : "1Gi"
},
"security" : {
"apparmor_profile" : "nostr-relay" ,
"capabilities" : [],
"network_policy" : "isolated" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default" ,
"user" : 1000
},
"version" : "0.8.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/nostr-relay" ,
"target" : "/usr/src/app/db" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "0.9.0"
2026-06-23 23:45:31 -04:00
},
"nostr-vpn" : {
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/nostr-vpn:v0.3.7" ,
"version" : "v0.3.7"
2026-06-23 23:45:31 -04:00
},
"ollama" : {
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/ollama:latest" ,
"version" : "latest"
2026-06-23 23:45:31 -04:00
},
"penpot" : {
"image" : "146.59.87.168:3000/lfg2025/penpot-frontend:2.4" ,
"images" : {
"penpot-backend" : "146.59.87.168:3000/lfg2025/penpot-backend:2.4" ,
"penpot-exporter" : "146.59.87.168:3000/lfg2025/penpot-exporter:2.4" ,
2026-07-22 03:49:19 -04:00
"penpot-frontend" : "146.59.87.168:3000/lfg2025/penpot-frontend:2.4" ,
2026-06-23 23:45:31 -04:00
"penpot-postgres" : "146.59.87.168:3000/lfg2025/postgres:15" ,
"penpot-valkey" : "146.59.87.168:3000/lfg2025/valkey:8.1"
2026-07-22 03:49:19 -04:00
},
"version" : "2.4"
2026-06-23 23:45:31 -04:00
},
"photoprism" : {
"image" : "146.59.87.168:3000/lfg2025/photoprism:240915" ,
"manifest" : {
"app" : {
"container" : {
"image" : "146.59.87.168:3000/lfg2025/photoprism:240915" ,
"pull_policy" : "if-not-present"
},
"dependencies" : [
{
"storage" : "10Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "AI-powered photo management with facial recognition." ,
"environment" : [
"PHOTOPRISM_ADMIN_PASSWORD=archipelago" ,
"PHOTOPRISM_DEFAULT_LOCALE=en"
],
"health_check" : {
"endpoint" : "localhost:2342" ,
"interval" : "60s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "photoprism" ,
"interfaces" : {
"main" : {
"description" : "PhotoPrism photo library" ,
"name" : "Web UI" ,
"path" : "/" ,
"port" : 2342 ,
"protocol" : "http" ,
"type" : "ui"
}
},
"metadata" : {
"author" : "PhotoPrism" ,
"category" : "data" ,
"icon" : "/assets/img/app-icons/photoprism.svg" ,
"launch" : {
"open_in_new_tab" : true
},
"repo" : "https://github.com/photoprism/photoprism"
},
"name" : "PhotoPrism" ,
"ports" : [
{
"container" : 2342 ,
"host" : 2342 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "10Gi" ,
"memory_limit" : "1Gi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"SETUID" ,
"SETGID"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "240915" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/photoprism" ,
"target" : "/photoprism/storage" ,
"type" : "bind"
2026-07-21 06:29:48 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-07-21 06:29:48 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "240915"
2026-07-21 06:29:48 -04:00
},
"pine" : {
"manifest" : {
"app" : {
"category" : "home" ,
"container" : {
2026-07-21 08:25:24 -04:00
"generated_certs" : [
{
"crt" : "/var/lib/archipelago/pine/tls.crt" ,
"key" : "/var/lib/archipelago/pine/tls.key"
}
2026-07-22 03:49:19 -04:00
],
"image" : "docker.io/library/nginx:1.27-alpine" ,
"network" : "archy-net" ,
"network_aliases" : [
"pine"
],
"pull_policy" : "if-not-present"
2026-07-21 06:29:48 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "pine" ,
2026-07-21 06:29:48 -04:00
"dependencies" : [
{
"app_id" : "pine-whisper"
},
{
"app_id" : "pine-piper"
},
2026-07-22 02:59:34 -04:00
{
"app_id" : "pine-openwakeword"
},
2026-07-21 06:29:48 -04:00
{
"storage" : "128Mi"
2026-06-23 23:45:31 -04:00
}
2026-07-10 17:48:27 +01:00
],
2026-07-22 03:49:19 -04:00
"description" : "A private voice assistant for your home. Pine runs speech-to-text (Whisper), text-to-speech (Piper) and wake-word detection (openWakeWord) on your own node and pairs with a PineVoice satellite speaker, so Home Assistant Assist works locally with nothing sent to the cloud. Ask it about your node — block height, sync, peers, Lightning balance — and, when a Claude API key is set, anything else." ,
"environment" : [],
"files" : [
{
"content" : "server {\n listen 80;\n server_name _;\n return 301 https://$host:10381$request_uri;\n}\nserver {\n listen 443 ssl;\n server_name _;\n ssl_certificate /etc/nginx/tls.crt;\n ssl_certificate_key /etc/nginx/tls.key;\n root /usr/share/nginx/html;\n index index.html;\n # Live node facts for the status card — proxied to the node's\n # public status tier so the (https) page can fetch same-origin.\n location = /node-status {\n proxy_pass http://host.containers.internal:80/api/pine/status;\n proxy_http_version 1.1;\n proxy_set_header Host $host;\n proxy_connect_timeout 5s;\n proxy_read_timeout 10s;\n }\n location / { try_files $uri $uri/ /index.html; }\n}\n" ,
"overwrite" : true ,
"path" : "/var/lib/archipelago/pine/nginx.conf"
},
{
"content" : "<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Pine — connect your speaker</title>\n <style>\n :root { color-scheme: dark; }\n * { box-sizing: border-box; }\n body { margin: 0; font: 16px/1.6 system-ui, -apple-system, sans-serif;\n background: #0f1512; color: #e7efe9; }\n .wrap { max-width: 520px; margin: 0 auto; padding: 40px 22px 64px; }\n header { display: flex; align-items: center; gap: 14px; margin-bottom: 6px; }\n header svg { width: 52px; height: 52px; flex: 0 0 auto; }\n h1 { font-size: 26px; margin: 0; }\n .tag { color: #8fbfa5; font-size: 14px; margin: 2px 0 0; }\n .card { background: #16201b; border: 1px solid #24332b;\n border-radius: 14px; padding: 20px; margin: 20px 0; }\n .status .row { display: flex; gap: 10px; align-items: baseline; font-size: 14px; }\n .status .row b { min-width: 84px; color: #9fd3b6; }\n .status code { background: #0f1512; padding: 1px 6px; border-radius: 5px;\n font-size: 13px; color: #cfe9d9; }\n label { display: block; font-size: 13px; color: #9fbfad; margin: 14px 0 5px; }\n input { width: 100%; padding: 11px 12px; font-size: 15px; color: #e7efe9;\n background: #0f1512; border: 1px solid #2b3d33; border-radius: 9px;\n outline: none; }\n input:focus { border-color: #4fae82; }\n button { width: 100%; margin-top: 18px; padding: 13px; font-size: 15px;\n font-weight: 600; color: #06110b; background: #7fd6a6; border: 0;\n border-radius: 10px; cursor: pointer; transition: filter .15s; }\n button:hover:not(:disabled) { filter: brightness(1.08); }\n button:disabled { opacity: .45; cursor: default; }\n #log { margin-top: 16px; padding: 12px; min-height: 68px; font-size: 13px;\n font-family: ui-monospace, monospace; white-space: pre-wrap;\n background: #0b100d; border: 1px solid #1e2a23; border-radius: 9px;\n color: #a9c6b6; max-height: 220px; overflow-y: auto; }\n .ok { color: #7fd6a6; } .err { color: #ee8f8f; } .warn { color: #e8c878; }\n .ha { color: #6d8578; font-size: 13px; margin-top: 22px; }\n .ha b { color: #9fbfad; }\n .insecure { display: none; background: #2a1f12; border-color: #4a3418;\n color: #e8c878; font-size: 13px; }\n </style>\n</head>\n<body>\n <div class=\"wrap\">\n <header>\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\"><g fill=\"#7fd6a6\">\n <rect x=\"236\" y=\"396\" width=\"40\" height=\"72\" rx=\"6\"/>\n <path d=\"M256 44 L336 168 L296 168 L256 108 L216 168 L176 168 Z\"/>\n <path d=\"M256 150 L360 300 L300 300 L256 236 L212 300 L152 300 Z\"/>\n <path d=\"M256 262 L392 430 L120 430 L256 262 Z\"/>\n </g></svg>\n <div><h1>Pine</h1>\n <p class=\"tag\">Connect your speaker — everything stays on your node.</p></div>\n </header>\n\n <div class=\"card status\">\n <div class=\"row\"><b>Whisper</b><span>speech-to-text ready on <code>:10300</code></span></div>\n <div class=\"row\"><b>Piper</b><span>text-to-speech ready on <code>:10200</code></span></div>\n <div class=\"row\"><b>Wake word</b><span>“Hey Jarvis” on the speaker (openWakeWord on <code>:10400</code>)</span></div>\n <div class=\"row\"><b>Speaker</b><span>put it in pairing mode — ring LED blinking yellow</span></div>\n </div>\n\n <div class=\"card status\">\n <div class=\"row\"><b>Node</b><span id=\"ns-node\">checking…</span></div>\n <div class=\"row\"><b>Bitcoin</b><span id=\"ns-btc\">—</span></div>\n <div class=\"row\"><b>Peers</b><span id=\"ns-peers\">—</span></div>\n </div>\n\n <div class=\"card insecure\" id=\"insecure\">\n This page isn’ t running over HTTPS, so the browser blocks Bluetooth.\n Open it via its <b>https://…:10380</b> address (accept the self-signed\n certificate) and the button below will work.\n </div>\n\n <div class=\
" overwrite ": true,
" path ": " /var/lib/archipelago/pine/index.html "
}
],
" health_check ": {
" endpoint ": " localhost : 443 ",
" interval ": " 30 s ",
" retries ": 5,
" start_period ": " 10 s ",
" timeout ": " 5 s ",
" type ": " tcp "
},
" id ": " pine ",
" interfaces ": {
" main ": {
" description ": " Connect your speaker to WiFi and check the voice assistant ",
" name ": " Pine ",
" path ": " / ",
" port ": 10380,
" protocol ": " http ",
" type ": " ui "
}
},
" metadata ": {
" author ": " Archipelago ",
" category ": " home ",
" icon ": " /assets/img/app-icons/pine.svg ",
" launch ": {
" open_in_new_tab ": true
},
" license ": " MIT ",
" repo ": " https : //github.com/rhasspy/wyoming",
"tags" : [
"home" ,
"voice" ,
"assistant" ,
"privacy"
],
"website" : "https://github.com/rhasspy/wyoming"
},
"name" : "Pine" ,
"ports" : [
{
"container" : 80 ,
"host" : 10380 ,
"protocol" : "tcp"
},
{
"container" : 443 ,
"host" : 10381 ,
"protocol" : "tcp"
}
],
2026-07-21 06:29:48 -04:00
"resources" : {
"memory_limit" : "64Mi"
},
"security" : {
"capabilities" : [
"CHOWN" ,
"DAC_OVERRIDE" ,
"SETGID" ,
"SETUID" ,
"NET_BIND_SERVICE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
2026-07-21 06:29:48 -04:00
"no_new_privileges" : true ,
2026-07-22 03:49:19 -04:00
"readonly_root" : false
2026-07-21 06:29:48 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "1.3.0" ,
2026-07-21 06:29:48 -04:00
"volumes" : [
2026-07-21 08:25:24 -04:00
{
2026-07-22 03:49:19 -04:00
"options" : [
"ro"
],
2026-07-21 08:25:24 -04:00
"source" : "/var/lib/archipelago/pine/nginx.conf" ,
"target" : "/etc/nginx/conf.d/default.conf" ,
2026-07-22 03:49:19 -04:00
"type" : "bind"
2026-07-21 21:55:08 +01:00
},
{
2026-07-22 03:49:19 -04:00
"options" : [
"ro"
],
2026-07-21 08:25:24 -04:00
"source" : "/var/lib/archipelago/pine/tls.crt" ,
"target" : "/etc/nginx/tls.crt" ,
2026-07-22 03:49:19 -04:00
"type" : "bind"
2026-07-21 21:55:08 +01:00
},
{
2026-07-22 03:49:19 -04:00
"options" : [
"ro"
],
2026-07-21 08:25:24 -04:00
"source" : "/var/lib/archipelago/pine/tls.key" ,
"target" : "/etc/nginx/tls.key" ,
2026-07-22 03:49:19 -04:00
"type" : "bind"
2026-07-21 21:55:08 +01:00
},
{
2026-07-22 03:49:19 -04:00
"options" : [
"ro"
],
2026-07-21 06:29:48 -04:00
"source" : "/var/lib/archipelago/pine/index.html" ,
"target" : "/usr/share/nginx/html/index.html" ,
2026-07-22 03:49:19 -04:00
"type" : "bind"
2026-07-21 06:29:48 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
} ,
"version" : "1.3.0"
2026-07-21 06:29:48 -04:00
} ,
2026-07-22 02:59:34 -04:00
"pine-openwakeword" : {
"manifest" : {
"app" : {
"category" : "home" ,
"container" : {
"custom_args" : [
"--preload-model" ,
"ok_nabu" ,
"--custom-model-dir" ,
"/custom"
2026-07-22 03:49:19 -04:00
],
"image" : "docker.io/rhasspy/wyoming-openwakeword:2.1.0" ,
"network" : "archy-net" ,
"network_aliases" : [
"pine-openwakeword"
],
"pull_policy" : "if-not-present"
2026-07-22 02:59:34 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "pine-openwakeword" ,
2026-07-22 02:59:34 -04:00
"dependencies" : [
{
"storage" : "512Mi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Wyoming-protocol openWakeWord wake-word engine. Internal Pine voice-assistant stack member — lets Assist pipelines run wake-word detection on the node (groundwork for the custom \"Yo Archy\" wake word; stock models like \"ok nabu\" ship with the image)." ,
2026-07-22 02:59:34 -04:00
"environment" : [],
"health_check" : {
"endpoint" : "localhost:10400" ,
"interval" : "30s" ,
"retries" : 5 ,
2026-07-22 03:49:19 -04:00
"start_period" : "30s" ,
"timeout" : "5s" ,
"type" : "tcp"
2026-07-22 02:59:34 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "pine-openwakeword" ,
2026-07-22 02:59:34 -04:00
"metadata" : {
"author" : "Rhasspy / Home Assistant" ,
"icon" : "/assets/img/app-icons/pine.svg" ,
"license" : "MIT" ,
2026-07-22 03:49:19 -04:00
"repo" : "https://github.com/rhasspy/wyoming-openwakeword" ,
2026-07-22 02:59:34 -04:00
"tags" : [
"home" ,
"voice" ,
"wake-word" ,
"wyoming"
2026-07-21 06:29:48 -04:00
],
2026-07-22 03:49:19 -04:00
"website" : "https://github.com/rhasspy/wyoming-openwakeword"
2026-07-21 06:29:48 -04:00
},
2026-07-22 03:49:19 -04:00
"name" : "Pine Wake Word (openWakeWord)" ,
"ports" : [
2026-07-21 06:29:48 -04:00
{
2026-07-22 03:49:19 -04:00
"container" : 10400 ,
"host" : 10400 ,
"protocol" : "tcp"
2026-07-21 06:29:48 -04:00
}
],
"resources" : {
"memory_limit" : "512Mi"
},
"security" : {
"capabilities" : [],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
2026-07-21 06:29:48 -04:00
"no_new_privileges" : true ,
2026-07-22 03:49:19 -04:00
"readonly_root" : false
2026-07-21 06:29:48 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "2.1.0" ,
2026-07-21 06:29:48 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/pine-openwakeword" ,
"target" : "/custom" ,
"type" : "bind"
}
]
}
},
"version" : "2.1.0"
},
"pine-piper" : {
"manifest" : {
"app" : {
"category" : "home" ,
"container" : {
"custom_args" : [
"--voice" ,
"en_GB-alba-medium"
],
"image" : "docker.io/rhasspy/wyoming-piper:2.2.2" ,
"network" : "archy-net" ,
"network_aliases" : [
"pine-piper"
],
"pull_policy" : "if-not-present"
},
"container_name" : "pine-piper" ,
"dependencies" : [
{
"storage" : "1Gi"
2026-07-21 06:29:48 -04:00
}
2026-07-21 21:55:08 +01:00
],
2026-07-22 03:49:19 -04:00
"description" : "Wyoming-protocol Piper text-to-speech engine. Internal Pine voice-assistant stack member — gives Home Assistant Assist a natural voice for spoken responses on the PineVoice satellite." ,
2026-07-21 21:55:08 +01:00
"environment" : [],
"health_check" : {
"endpoint" : "localhost:10200" ,
"interval" : "30s" ,
"retries" : 5 ,
2026-07-22 03:49:19 -04:00
"start_period" : "60s" ,
"timeout" : "5s" ,
"type" : "tcp"
2026-07-21 21:55:08 +01:00
},
2026-07-22 03:49:19 -04:00
"id" : "pine-piper" ,
2026-07-21 21:55:08 +01:00
"metadata" : {
"author" : "Rhasspy / Home Assistant" ,
"icon" : "/assets/img/app-icons/pine.svg" ,
"license" : "MIT" ,
2026-07-22 03:49:19 -04:00
"repo" : "https://github.com/rhasspy/wyoming-piper" ,
2026-07-21 21:55:08 +01:00
"tags" : [
"home" ,
"voice" ,
"text-to-speech" ,
"wyoming"
2026-07-22 03:49:19 -04:00
],
"website" : "https://github.com/rhasspy/wyoming-piper"
},
"name" : "Pine Piper (TTS)" ,
"ports" : [
{
"container" : 10200 ,
"host" : 10200 ,
"protocol" : "tcp"
}
],
"resources" : {
"memory_limit" : "512Mi"
},
"security" : {
"capabilities" : [],
"network_policy" : "isolated" ,
"no_new_privileges" : true ,
"readonly_root" : false
},
"version" : "2.2.2" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/pine-piper" ,
"target" : "/data" ,
"type" : "bind"
}
]
2026-07-21 06:29:48 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "2.2.2"
2026-07-21 06:29:48 -04:00
},
"pine-whisper" : {
"manifest" : {
"app" : {
"category" : "home" ,
"container" : {
"custom_args" : [
"--model" ,
"base-int8" ,
"--language" ,
2026-07-22 22:07:15 -04:00
"en" ,
"--beam-size" ,
"1"
2026-07-22 03:49:19 -04:00
],
"image" : "docker.io/rhasspy/wyoming-whisper:3.4.1" ,
"network" : "archy-net" ,
"network_aliases" : [
"pine-whisper"
],
"pull_policy" : "if-not-present"
2026-07-21 06:29:48 -04:00
},
2026-07-22 03:49:19 -04:00
"container_name" : "pine-whisper" ,
2026-07-21 06:29:48 -04:00
"dependencies" : [
{
"storage" : "2Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Wyoming-protocol faster-whisper speech-to-text engine. Internal Pine voice-assistant stack member — turns speech captured by a PineVoice satellite into text for Home Assistant Assist." ,
"environment" : [],
"health_check" : {
"endpoint" : "localhost:10300" ,
"interval" : "30s" ,
"retries" : 5 ,
"start_period" : "60s" ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "pine-whisper" ,
"metadata" : {
"author" : "Rhasspy / Home Assistant" ,
"icon" : "/assets/img/app-icons/pine.svg" ,
"license" : "MIT" ,
"repo" : "https://github.com/rhasspy/wyoming-faster-whisper" ,
"tags" : [
"home" ,
"voice" ,
"speech-to-text" ,
"wyoming"
],
"website" : "https://github.com/rhasspy/wyoming-faster-whisper"
},
"name" : "Pine Whisper (STT)" ,
"ports" : [
{
"container" : 10300 ,
"host" : 10300 ,
"protocol" : "tcp"
}
],
2026-07-21 06:29:48 -04:00
"resources" : {
"memory_limit" : "2Gi"
},
"security" : {
"capabilities" : [],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
2026-07-21 06:29:48 -04:00
"no_new_privileges" : true ,
2026-07-22 03:49:19 -04:00
"readonly_root" : false
2026-07-21 06:29:48 -04:00
},
2026-07-22 22:07:15 -04:00
"version" : "3.4.2" ,
2026-07-21 06:29:48 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/pine-whisper" ,
"target" : "/data" ,
"type" : "bind"
2026-07-21 06:29:48 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-07-21 06:29:48 -04:00
}
2026-07-22 03:49:19 -04:00
},
2026-07-22 22:07:15 -04:00
"version" : "3.4.2"
2026-06-23 23:45:31 -04:00
},
"portainer" : {
"image" : "146.59.87.168:3000/lfg2025/portainer:2.19.4" ,
"manifest" : {
"app" : {
"category" : "development" ,
"container" : {
2026-07-22 03:49:19 -04:00
"data_uid" : "1000:1000" ,
2026-06-23 23:45:31 -04:00
"image" : "146.59.87.168:3000/lfg2025/portainer:2.19.4" ,
2026-07-22 03:49:19 -04:00
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"storage" : "1Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Container management web UI for the local Podman socket." ,
"environment" : [],
"id" : "portainer" ,
"interfaces" : {
"main" : {
"description" : "Portainer web interface" ,
"name" : "Web UI" ,
"path" : "/" ,
"port" : 9000 ,
"protocol" : "http" ,
"type" : "ui"
}
},
"metadata" : {
"features" : [
"Container management dashboard" ,
"Local Podman socket access" ,
"Compose stack storage"
],
"icon" : "/assets/img/app-icons/portainer.webp" ,
"launch" : {
"open_in_new_tab" : true
},
"tier" : "optional"
},
"name" : "Portainer" ,
"ports" : [
{
"container" : 9000 ,
"host" : 9000 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "1Gi" ,
"memory_limit" : "256Mi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"SETUID" ,
"SETGID" ,
"DAC_OVERRIDE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
2026-06-23 23:45:31 -04:00
"no_new_privileges" : true ,
2026-07-22 03:49:19 -04:00
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "2.19.4" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-22 03:49:19 -04:00
"options" : [
"rw"
],
2026-06-23 23:45:31 -04:00
"source" : "/var/lib/archipelago/portainer" ,
"target" : "/data" ,
2026-07-22 03:49:19 -04:00
"type" : "bind"
2026-07-21 21:55:08 +01:00
},
{
2026-07-22 03:49:19 -04:00
"options" : [
"rw"
],
2026-06-23 23:45:31 -04:00
"source" : "/var/lib/archipelago/portainer/compose" ,
"target" : "/data/compose" ,
2026-07-22 03:49:19 -04:00
"type" : "bind"
2026-07-21 21:55:08 +01:00
},
{
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/run/user/1000/podman/podman.sock" ,
"target" : "/var/run/docker.sock" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "2.19.4"
2026-06-23 23:45:31 -04:00
},
"router" : {
"manifest" : {
"app" : {
"container" : {
"image" : "archipelago/router:1.0.0" ,
"image_signature" : "cosign://..." ,
"pull_policy" : "if-not-present"
},
"dependencies" : [
{
"storage" : "500Mi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Mesh routing and local network management. Provides device discovery, routing, and network topology visualization." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"NETWORK_INTERFACE=eth0" ,
"MESH_ENABLED=true" ,
"DEVICE_DISCOVERY=true"
],
"health_check" : {
"endpoint" : "http://localhost:8084" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/health" ,
"retries" : 3 ,
2026-06-23 23:45:31 -04:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"id" : "router" ,
"name" : "Mesh Router" ,
2026-06-23 23:45:31 -04:00
"networking" : {
2026-07-21 21:55:08 +01:00
"device_discovery" : true ,
2026-07-22 03:49:19 -04:00
"local_network_access" : true ,
"mesh_enabled" : true ,
2026-06-23 23:45:31 -04:00
"routing_protocols" : [
"olsr" ,
"babel"
]
2026-07-22 03:49:19 -04:00
},
"ports" : [
{
"container" : 8080 ,
"host" : 8084 ,
"protocol" : "tcp"
},
{
"container" : 5353 ,
"host" : 5353 ,
"protocol" : "udp"
},
{
"container" : 1900 ,
"host" : 1900 ,
"protocol" : "udp"
}
],
"resources" : {
"cpu_limit" : 2 ,
"disk_limit" : "500Mi" ,
"memory_limit" : "512Mi"
},
"security" : {
"apparmor_profile" : "router" ,
"capabilities" : [
"NET_ADMIN" ,
"NET_RAW"
],
"network_policy" : "host" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default" ,
"user" : 1000
},
"version" : "1.0.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/router" ,
"target" : "/app/data" ,
"type" : "bind"
},
{
"options" : [
"ro"
],
"source" : "/var/run/dbus" ,
"target" : "/var/run/dbus" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "1.0.0"
2026-06-23 23:45:31 -04:00
},
"routstr" : {
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/routstr:v0.4.3" ,
"version" : "v0.4.3"
2026-06-23 23:45:31 -04:00
},
"searxng" : {
"image" : "146.59.87.168:3000/lfg2025/searxng:latest" ,
"manifest" : {
"app" : {
"container" : {
"image" : "146.59.87.168:3000/lfg2025/searxng:latest" ,
"pull_policy" : "if-not-present"
},
"dependencies" : [
{
"storage" : "2Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Privacy-respecting metasearch engine. Search the web without tracking." ,
2026-06-23 23:45:31 -04:00
"environment" : [
"SEARXNG_HOSTNAME=localhost" ,
"SEARXNG_BIND_ADDRESS=0.0.0.0:8080"
],
"health_check" : {
"endpoint" : "http://localhost:8080" ,
2026-07-21 21:55:08 +01:00
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/" ,
"retries" : 5 ,
2026-06-23 23:45:31 -04:00
"timeout" : "30s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
},
"id" : "searxng" ,
"name" : "SearXNG" ,
"ports" : [
{
"container" : 8080 ,
"host" : 8888 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 2 ,
"disk_limit" : "2Gi" ,
"memory_limit" : "1Gi"
},
"security" : {
"apparmor_profile" : "searxng" ,
"capabilities" : [],
"network_policy" : "isolated" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default" ,
"user" : 1000
},
"version" : "1.0.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/searxng" ,
"target" : "/etc/searxng" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "latest"
2026-06-23 23:45:31 -04:00
},
"strfry" : {
"manifest" : {
"app" : {
"container" : {
"image" : "dockurr/strfry:1.0.4" ,
"image_signature" : "cosign://..." ,
"pull_policy" : "verify-signature"
},
"dependencies" : [
{
"storage" : "5Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Lightweight Nostr relay written in C++. Alternative to nostr-rs-relay with lower resource usage." ,
2026-07-21 21:55:08 +01:00
"files" : [
{
2026-07-22 03:49:19 -04:00
"content" : "##\n## Default strfry config\n##\n\n# Directory that contains the strfry LMDB database (restart required)\ndb = \"./strfry-db/\"\n\ndbParams {\n # Maximum number of threads/processes that can simultaneously have LMDB transactions open (restart required)\n maxreaders = 256\n\n # Size of mmap() to use when loading LMDB (default is 10TB, does *not* correspond to disk-space used) (restart required)\n mapsize = 10995116277760\n\n # Disables read-ahead when accessing the LMDB mapping. Reduces IO activity when DB size is larger than RAM. (restart required)\n noReadAhead = false\n}\n\nevents {\n # Maximum size of normalised JSON, in bytes\n maxEventSize = 65536\n\n # Events newer than this will be rejected\n rejectEventsNewerThanSeconds = 900\n\n # Events older than this will be rejected\n rejectEventsOlderThanSeconds = 94608000\n\n # Ephemeral events older than this will be rejected\n rejectEphemeralEventsOlderThanSeconds = 60\n\n # Ephemeral events will be deleted from the DB when older than this\n ephemeralEventsLifetimeSeconds = 300\n\n # Maximum number of tags allowed\n maxNumTags = 2000\n\n # Maximum size for tag values, in bytes\n maxTagValSize = 1024\n}\n\nrelay {\n # Interface to listen on. Use 0.0.0.0 to listen on all interfaces (restart required)\n bind = \"0.0.0.0\"\n\n # Port to open for the nostr websocket protocol (restart required)\n port = 7777\n\n # Set OS-limit on maximum number of open files/sockets (if 0, don't attempt to set) (restart required)\n nofiles = 0\n\n # HTTP header that contains the client's real IP, before reverse proxying (ie x-real-ip) (MUST be all lower-case)\n realIpHeader = \"\"\n\n info {\n # NIP-11: Name of this server. Short/descriptive (< 30 characters)\n name = \"Archipelago Strfry Relay\"\n\n # NIP-11: Detailed information about relay, free-form\n description = \"Self-hosted strfry Nostr relay on Archipelago.\"\n\n # NIP-11: Administrative nostr pubkey, for contact purposes\n pubkey = \"\"\n\n # NIP-11: Alternative administrative contact (email, website, etc)\n contact = \"\"\n\n # NIP-11: URL pointing to an image to be used as an icon for the relay\n icon = \"\"\n\n # List of supported lists as JSON array, or empty string to use default. Example: \"[1,2]\"\n nips = \"\"\n }\n\n # Maximum accepted incoming websocket frame size (should be larger than max event) (restart required)\n maxWebsocketPayloadSize = 131072\n\n # Maximum number of filters allowed in a REQ\n maxReqFilterSize = 200\n\n # Websocket-level PING message frequency (should be less than any reverse proxy idle timeouts) (restart required)\n autoPingSeconds = 55\n\n # If TCP keep-alive should be enabled (detect dropped connections to upstream reverse proxy)\n enableTcpKeepalive = false\n\n # How much uninterrupted CPU time a REQ query should get during its DB scan\n queryTimesliceBudgetMicroseconds = 10000\n\n # Maximum records that can be returned per filter\n maxFilterLimit = 500\n\n # Maximum number of subscriptions (concurrent REQs) a connection can have open at any time\n maxSubsPerConnection = 20\n\n writePolicy {\n # If non-empty, path to an executable script that implements the writePolicy plugin logic\n plugin = \"/app/write-policy.py\"\n }\n\n compression {\n # Use permessage-deflate compression if supported by client. Reduces bandwidth, but slight increase in CPU (restart required)\n enabled = true\n\n # Maintain a sliding window buffer for each connection. Improves compression, but uses more memory (restart required)\n slidingWindow = true\n }\n\n logging {\n # Dump all incoming messages\n dumpInAll = false\n\n # Dump all incoming EVENT messages\n dumpInEvents = false\n\n # Dump all incoming REQ/CLOSE messages\n dumpInReqs = false\n\n # Log performance metrics for init
2026-07-21 21:55:08 +01:00
" overwrite ": true,
2026-07-22 03:49:19 -04:00
" path ": " /var/lib/archipelago/strfry-config/strfry.conf "
2026-07-21 21:55:08 +01:00
}
],
" health_check ": {
" endpoint ": " http : //127.0.0.1:7777",
"interval" : "30s" ,
2026-07-22 03:49:19 -04:00
"path" : "/health" ,
"retries" : 3 ,
2026-07-21 21:55:08 +01:00
"timeout" : "5s" ,
2026-07-22 03:49:19 -04:00
"type" : "http"
2026-07-21 21:55:08 +01:00
},
2026-07-22 03:49:19 -04:00
"id" : "strfry" ,
"name" : "Strfry Nostr Relay" ,
2026-07-21 21:55:08 +01:00
"nostr_integration" : {
2026-07-22 03:49:19 -04:00
"monetization_enabled" : true ,
"relay_type" : "public"
},
"ports" : [
{
"container" : 7777 ,
"host" : 8090 ,
"protocol" : "tcp"
}
],
"resources" : {
"cpu_limit" : 1 ,
"disk_limit" : "5Gi" ,
"memory_limit" : "512Mi"
},
"security" : {
"apparmor_profile" : "nostr-relay" ,
"capabilities" : [],
"network_policy" : "isolated" ,
"no_new_privileges" : true ,
"readonly_root" : true ,
"seccomp_profile" : "default"
},
"version" : "0.9.0" ,
"volumes" : [
{
"options" : [
"rw"
],
"source" : "/var/lib/archipelago/strfry" ,
"target" : "/app/strfry-db" ,
"type" : "bind"
},
{
"options" : [
"ro"
],
"source" : "/var/lib/archipelago/strfry-config/strfry.conf" ,
"target" : "/etc/strfry.conf" ,
"type" : "bind"
}
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
} ,
"version" : "0.9.0"
2026-06-23 23:45:31 -04:00
} ,
"tailscale" : {
2026-07-22 03:49:19 -04:00
"image" : "146.59.87.168:3000/lfg2025/tailscale:stable" ,
"version" : "stable"
2026-06-23 23:45:31 -04:00
},
"uptime-kuma" : {
"image" : "146.59.87.168:3000/lfg2025/uptime-kuma:1" ,
"manifest" : {
"app" : {
"container" : {
"custom_args" : [
"--" ,
"node" ,
"server/server.js"
2026-07-22 03:49:19 -04:00
],
"image" : "146.59.87.168:3000/lfg2025/uptime-kuma:1" ,
"network" : "pasta" ,
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"storage" : "1Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Self-hosted uptime monitoring." ,
"environment" : [
"TZ=UTC"
],
"health_check" : {
"endpoint" : "localhost:3001" ,
"interval" : "30s" ,
"path" : "/" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "http"
},
"id" : "uptime-kuma" ,
"metadata" : {
"author" : "Uptime Kuma" ,
"category" : "data" ,
"icon" : "/assets/img/app-icons/uptime-kuma.webp" ,
"launch" : {
"open_in_new_tab" : true
},
"repo" : "https://github.com/louislam/uptime-kuma" ,
"tier" : "recommended"
},
"name" : "Uptime Kuma" ,
"ports" : [
{
"container" : 3001 ,
"host" : 3002 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "1Gi" ,
"memory_limit" : "256Mi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"FOWNER" ,
"SETUID" ,
"SETGID"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "1.23.0" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/uptime-kuma" ,
"target" : "/app/data" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "1"
2026-06-23 23:45:31 -04:00
},
"vaultwarden" : {
"image" : "146.59.87.168:3000/lfg2025/vaultwarden:1.30.0-alpine" ,
"manifest" : {
"app" : {
"container" : {
"image" : "146.59.87.168:3000/lfg2025/vaultwarden:1.30.0-alpine" ,
2026-07-22 03:49:19 -04:00
"network" : "pasta" ,
"pull_policy" : "if-not-present"
2026-06-23 23:45:31 -04:00
},
"dependencies" : [
{
"storage" : "1Gi"
}
],
2026-07-22 03:49:19 -04:00
"description" : "Self-hosted password vault with zero-knowledge encryption." ,
"environment" : [],
"health_check" : {
"endpoint" : "localhost:80" ,
"interval" : "30s" ,
"retries" : 3 ,
"timeout" : "5s" ,
"type" : "tcp"
},
"id" : "vaultwarden" ,
"interfaces" : {
"main" : {
"description" : "Vaultwarden web vault" ,
"name" : "Web UI" ,
"path" : "/" ,
"port" : 8082 ,
"protocol" : "http" ,
"type" : "ui"
}
},
"metadata" : {
"author" : "Vaultwarden" ,
"category" : "data" ,
"icon" : "/assets/img/app-icons/vaultwarden.webp" ,
"launch" : {
"open_in_new_tab" : true
},
"repo" : "https://github.com/dani-garcia/vaultwarden" ,
"tier" : "recommended"
},
"name" : "Vaultwarden" ,
"ports" : [
{
"container" : 80 ,
"host" : 8082 ,
"protocol" : "tcp"
}
],
2026-06-23 23:45:31 -04:00
"resources" : {
2026-07-22 03:49:19 -04:00
"disk_limit" : "1Gi" ,
"memory_limit" : "256Mi"
2026-06-23 23:45:31 -04:00
},
"security" : {
"capabilities" : [
"CHOWN" ,
"SETUID" ,
"SETGID" ,
"NET_BIND_SERVICE"
],
2026-07-22 03:49:19 -04:00
"network_policy" : "isolated" ,
"readonly_root" : false
2026-06-23 23:45:31 -04:00
},
2026-07-22 03:49:19 -04:00
"version" : "1.30.0" ,
2026-06-23 23:45:31 -04:00
"volumes" : [
{
2026-07-21 21:55:08 +01:00
"options" : [
"rw"
2026-07-22 03:49:19 -04:00
],
"source" : "/var/lib/archipelago/vaultwarden" ,
"target" : "/data" ,
"type" : "bind"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
]
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
},
"version" : "1.30.0-alpine"
2026-06-23 23:45:31 -04:00
}
2026-07-22 03:49:19 -04:00
} ,
"schema" : 1 ,
2026-07-22 22:07:15 -04:00
"signature" : "4054b2a8659b75a3810ed153798c0e8a08db49ce6237b8ae985e87ace8a35163c24a0190074abd2a8296309ebe9dd583f153642d46d4d7f0a6a4db255743380b" ,
2026-07-22 03:49:19 -04:00
"signed_by" : "did:key:z6MkkidEnEpo6qHMCNSZoNKWtvQvxq3whnaME9wGgEFhq7ur" ,
2026-07-22 22:07:15 -04:00
"updated" : "2026-07-23"
2026-06-23 23:45:31 -04:00
}