This commit is contained in:
zazawowow 2026-01-24 23:20:54 +00:00
parent 1ac70634bd
commit a81f655133
28 changed files with 367 additions and 75 deletions

View File

@ -5,10 +5,13 @@ This directory contains all prepackaged containerized applications for Archipela
## App Overview ## App Overview
### Bitcoin & Lightning ### Bitcoin & Lightning
- **bitcoin-core**: Full Bitcoin node (ports: 8332, 8333) - **bitcoin-core**: Full Bitcoin node (ports: 8332, 8333) - v24.0.0
- **lnd**: Lightning Network Daemon (ports: 9735, 10009, 8080) - **lnd**: Lightning Network Daemon (ports: 9735, 10009, 8080)
- **core-lightning**: Core Lightning implementation (ports: 9736, 9835) - **core-lightning**: Core Lightning implementation (ports: 9736, 9835)
- **btcpay-server**: Bitcoin payment processor (ports: 80, 443) - **lightning-stack**: Complete Lightning implementation (ports: 9737, 10010, 8087) - v0.12.0
- **btcpay-server**: Bitcoin payment processor (ports: 80, 443) - v1.12.0
- **mempool**: Blockchain explorer (port: 4080) - v2.5.0
- **fedimint**: Federated Bitcoin minting (ports: 8173, 8174) - v0.3.0
### Nostr Relays ### Nostr Relays
- **nostr-rs-relay**: High-performance Rust relay (port: 8081) - **nostr-rs-relay**: High-performance Rust relay (port: 8081)
@ -18,6 +21,18 @@ This directory contains all prepackaged containerized applications for Archipela
- **web5-dwn**: Decentralized Web Node (port: 3000) - **web5-dwn**: Decentralized Web Node (port: 3000)
- **did-wallet**: Web5 DID Wallet (port: 8083) - **did-wallet**: Web5 DID Wallet (port: 8083)
### Self-Hosted Services
- **home-assistant**: Home automation (port: 8123) - v2024.1.0
- **grafana**: Monitoring and dashboards (port: 3001) - v10.2.0
- **ollama**: Local AI models (port: 11434) - v0.1.0
- **searxng**: Privacy search engine (port: 8888) - v2024.1.0
- **onlyoffice**: Office suite (port: 8088) - v7.5.0
- **penpot**: Design platform (port: 8089) - v2.0.0
### Custom Applications
- **endurain**: Application platform (port: 8085) - v1.0.0
- **morphos-server**: MorphOS server (port: 8086) - v1.0.0
### Mesh Networking ### Mesh Networking
- **router**: Mesh routing and network management (ports: 8084, 5353, 1900) - **router**: Mesh routing and network management (ports: 8084, 5353, 1900)
- **meshtastic**: LoRa mesh networking (ports: 4403, 1883) - **meshtastic**: LoRa mesh networking (ports: 4403, 1883)
@ -26,18 +41,16 @@ This directory contains all prepackaged containerized applications for Archipela
All apps use unique base ports. In development mode, ports are offset by 10000 (configurable). All apps use unique base ports. In development mode, ports are offset by 10000 (configurable).
| App | Base Ports | Dev Ports (offset +10000) | See [PORTS.md](./PORTS.md) for complete port mapping.
|-----|------------|---------------------------|
| bitcoin-core | 8332, 8333 | 18332, 18333 | Key apps:
| lnd | 9735, 10009, 8080 | 19735, 20009, 18080 | - **bitcoin-core**: 8332, 8333 → 18332, 18333
| core-lightning | 9736, 9835 | 19736, 19835 | - **btcpay-server**: 80, 443 → 10080, 10443
| btcpay-server | 80, 443 | 10080, 10443 | - **home-assistant**: 8123 → 18123
| nostr-rs-relay | 8081 | 18081 | - **grafana**: 3001 → 13001
| strfry | 8082 | 18082 | - **mempool**: 4080 → 14080
| did-wallet | 8083 | 18083 | - **ollama**: 11434 → 21434
| router | 8084, 5353, 1900 | 18084, 15353, 11900 | - **lightning-stack**: 9737, 10010, 8087 → 19737, 20010, 18087
| web5-dwn | 3000 | 13000 |
| meshtastic | 4403, 1883 | 14403, 11883 |
## Building Apps ## Building Apps

View File

@ -4,35 +4,59 @@ This document lists all port assignments for Archipelago apps.
## Production Ports ## Production Ports
| App | Port(s) | Protocol | Service | | App | Port(s) | Protocol | Service | Dev Port(s) |
|-----|---------|----------|---------| |-----|---------|----------|---------|-------------|
| bitcoin-core | 8332, 8333 | TCP | RPC, P2P | | bitcoin-core | 8332, 8333 | TCP | RPC, P2P | 18332, 18333 |
| lnd | 9735, 10009, 8080 | TCP | P2P, gRPC, REST | | btcpay-server | 80, 443 | TCP | HTTP, HTTPS | 10080, 10443 |
| core-lightning | 9736, 9835 | TCP | P2P, gRPC | | home-assistant | 8123 | TCP | Web UI | 18123 |
| btcpay-server | 80, 443 | TCP | HTTP, HTTPS | | grafana | 3001 | TCP | Web UI | 13001 |
| nostr-rs-relay | 8081 | TCP | HTTP/WebSocket | | endurain | 8085 | TCP | Web UI | 18085 |
| strfry | 8082 | TCP | HTTP/WebSocket | | fedimint | 8173, 8174 | TCP | API, Web UI | 18173, 18174 |
| did-wallet | 8083 | TCP | Web UI | | morphos-server | 8086 | TCP | Web UI | 18086 |
| router | 8084, 5353, 1900 | TCP/UDP | Web UI, mDNS, SSDP | | lightning-stack | 9737, 10010, 8087 | TCP | P2P, gRPC, REST | 19737, 20010, 18087 |
| web5-dwn | 3000 | TCP | HTTP API | | mempool | 4080 | TCP | Web UI | 14080 |
| meshtastic | 4403, 1883 | TCP | HTTP API, MQTT | | ollama | 11434 | TCP | API | 21434 |
| searxng | 8888 | TCP | Web UI | 18888 |
| onlyoffice | 8088 | TCP | Web UI | 18088 |
| penpot | 8089 | TCP | Web UI | 18089 |
| lnd | 9735, 10009, 8080 | TCP | P2P, gRPC, REST | 19735, 20009, 18080 |
| core-lightning | 9736, 9835 | TCP | P2P, gRPC | 19736, 19835 |
| nostr-rs-relay | 8081 | TCP | HTTP/WebSocket | 18081 |
| strfry | 8082 | TCP | HTTP/WebSocket | 18082 |
| did-wallet | 8083 | TCP | Web UI | 18083 |
| router | 8084, 5353, 1900 | TCP/UDP | Web UI, mDNS, SSDP | 18084, 15353, 11900 |
| web5-dwn | 3000 | TCP | HTTP API | 13000 |
| meshtastic | 4403, 1883 | TCP | HTTP API, MQTT | 14403, 11883 |
## Development Ports (Offset: +10000) ## Development Ports (Offset: +10000)
In development mode, all ports are offset by 10000 to avoid conflicts with production services. In development mode, all ports are offset by 10000 to avoid conflicts with production services.
| App | Dev Port(s) | Access URL | ### Quick Access URLs (Development)
|-----|-------------|------------|
| bitcoin-core | 18332, 18333 | http://localhost:18332 | | App | Dev URL |
| lnd | 19735, 20009, 18080 | http://localhost:18080 | |-----|----------|
| core-lightning | 19736, 19835 | http://localhost:19835 | | Bitcoin Core RPC | http://localhost:18332 |
| btcpay-server | 10080, 10443 | http://localhost:10080 | | BTCPay Server | http://localhost:10080 |
| nostr-rs-relay | 18081 | http://localhost:18081 | | Home Assistant | http://localhost:18123 |
| strfry | 18082 | http://localhost:18082 | | Grafana | http://localhost:13001 |
| did-wallet | 18083 | http://localhost:18083 | | Endurain | http://localhost:18085 |
| router | 18084, 15353, 11900 | http://localhost:18084 | | Fedimint | http://localhost:18174 |
| web5-dwn | 13000 | http://localhost:13000 | | MorphOS Server | http://localhost:18086 |
| meshtastic | 14403, 11883 | http://localhost:14403 | | Lightning Stack | http://localhost:18087 |
| Mempool | http://localhost:14080 |
| Ollama | http://localhost:21434 |
| SearXNG | http://localhost:18888 |
| OnlyOffice | http://localhost:18088 |
| Penpot | http://localhost:18089 |
| LND REST | http://localhost:18080 |
| Core Lightning | http://localhost:19835 |
| Nostr RS Relay | http://localhost:18081 |
| Strfry | http://localhost:18082 |
| DID Wallet | http://localhost:18083 |
| Router | http://localhost:18084 |
| Web5 DWN | http://localhost:13000 |
| Meshtastic | http://localhost:14403 |
## Port Conflict Resolution ## Port Conflict Resolution
@ -55,3 +79,10 @@ Or in the Archipelago config:
[dev] [dev]
port_offset = 10000 port_offset = 10000
``` ```
## Port Ranges
- **Bitcoin/Lightning**: 8000-10000 range
- **Web Services**: 3000-9000 range
- **System Services**: 10000+ range
- **Custom Apps**: 8000-9000 range

View File

@ -5,11 +5,13 @@ This directory contains app manifest definitions for containerized applications
## App Categories ## App Categories
### Bitcoin & Lightning ### Bitcoin & Lightning
- `bitcoin-core/` - Bitcoin Core full node - `bitcoin-core/` - Bitcoin Core full node (v24.0.0)
- `lnd/` - Lightning Network Daemon - `lnd/` - Lightning Network Daemon
- `core-lightning/` - Core Lightning (CLN) - `core-lightning/` - Core Lightning (CLN)
- `btcpay-server/` - BTCPay Server payment processor - `lightning-stack/` - Complete Lightning implementation (v0.12.0)
- `mempool/` - Mempool blockchain explorer - `btcpay-server/` - BTCPay Server payment processor (v1.12.0)
- `mempool/` - Mempool blockchain explorer (v2.5.0)
- `fedimint/` - Federated Bitcoin minting (v0.3.0)
### Web5 & Decentralized Protocols ### Web5 & Decentralized Protocols
- `nostr-rs-relay/` - High-performance Nostr relay (Rust) - `nostr-rs-relay/` - High-performance Nostr relay (Rust)
@ -17,23 +19,21 @@ This directory contains app manifest definitions for containerized applications
- `web5-dwn/` - Decentralized Web Node - `web5-dwn/` - Decentralized Web Node
- `did-wallet/` - Web5 wallet with DID support - `did-wallet/` - Web5 wallet with DID support
### Self-Hosted Services
- `home-assistant/` - Home automation (v2024.1.0)
- `grafana/` - Monitoring and dashboards (v10.2.0)
- `ollama/` - Local AI models (v0.1.0)
- `searxng/` - Privacy-respecting search engine (v2024.1.0)
- `onlyoffice/` - Office suite (v7.5.0)
- `penpot/` - Design platform (v2.0.0)
### Custom Applications
- `endurain/` - Endurain application platform (v1.0.0)
- `morphos-server/` - MorphOS server (v1.0.0)
### Mesh Networking & Routing ### Mesh Networking & Routing
- `meshtastic/` - Meshtastic LoRa mesh networking - `meshtastic/` - Meshtastic LoRa mesh networking
- `router/` - Mesh routing and local network management - `router/` - Mesh routing and local network management
- `cjdns/` - Encrypted mesh networking (cjdns)
### Self-Hosted Services
- `homeassistant/` - Home automation
- `grafana/` - Monitoring and dashboards
- `searxng/` - Privacy-respecting search engine
- `onlyoffice/` - Office suite
- `ollama/` - Local AI models
- `penpot/` - Design tool
### Other
- `fedimint/` - Federated e-cash mint
- `morphos-server/` - MorphOS server
- `a-b/` - A to B protocol
## Manifest Format ## Manifest Format
@ -46,3 +46,25 @@ Each app has a `manifest.yml` file defining:
- Network configuration - Network configuration
See `docs/app-manifest-spec.md` for the complete specification. See `docs/app-manifest-spec.md` for the complete specification.
## Quick Start
### Build All Apps
```bash
./build.sh
```
### Build Specific App
```bash
./build.sh <app-id>
```
### Development
See [DEVELOPMENT.md](./DEVELOPMENT.md) for development guide and [QUICKSTART.md](./QUICKSTART.md) for quick start instructions.
## Port Assignments
See [PORTS.md](./PORTS.md) for complete port mapping. All apps use unique ports and are automatically offset in development mode.

5
apps/ollama/Dockerfile Normal file
View File

@ -0,0 +1,5 @@
# Ollama - uses official image
FROM ollama/ollama:latest
# Default configuration is in the image
# No additional setup needed

47
apps/ollama/manifest.yml Normal file
View File

@ -0,0 +1,47 @@
app:
id: ollama
name: Ollama
version: 0.1.0
description: Run large language models locally. Privacy-preserving AI on your node.
container:
image: ollama/ollama:latest
image_signature: cosign://...
pull_policy: if-not-present
dependencies:
- storage: 50Gi # Models can be large
resources:
cpu_limit: 4
memory_limit: 8Gi # LLMs need lots of RAM
disk_limit: 50Gi
security:
capabilities: []
readonly_root: false # Ollama needs write access for models
network_policy: isolated
apparmor_profile: ollama
ports:
- host: 11434
container: 11434
protocol: tcp # API
volumes:
- type: bind
source: /var/lib/archipelago/ollama
target: /root/.ollama
options: [rw]
environment:
- OLLAMA_HOST=0.0.0.0:11434
- OLLAMA_KEEP_ALIVE=24h
health_check:
type: http
endpoint: http://localhost:11434
path: /api/tags
interval: 30s
timeout: 10s
retries: 3

View File

@ -0,0 +1,5 @@
# OnlyOffice - uses official image
FROM onlyoffice/documentserver:7.5.0
# Default configuration is in the image
# No additional setup needed

View File

@ -0,0 +1,47 @@
app:
id: onlyoffice
name: OnlyOffice
version: 7.5.0
description: Office suite and document collaboration. Edit documents, spreadsheets, and presentations.
container:
image: onlyoffice/documentserver:7.5.0
image_signature: cosign://...
pull_policy: if-not-present
dependencies:
- storage: 10Gi
resources:
cpu_limit: 4
memory_limit: 4Gi
disk_limit: 10Gi
security:
capabilities: []
readonly_root: false # OnlyOffice needs write access
network_policy: isolated
apparmor_profile: onlyoffice
ports:
- host: 8088
container: 80
protocol: tcp # Web UI
volumes:
- type: bind
source: /var/lib/archipelago/onlyoffice
target: /var/www/onlyoffice/Data
options: [rw]
environment:
- JWT_ENABLED=false
- JWT_SECRET=${ONLYOFFICE_JWT_SECRET}
health_check:
type: http
endpoint: http://localhost:8088
path: /healthcheck
interval: 30s
timeout: 5s
retries: 3

5
apps/penpot/Dockerfile Normal file
View File

@ -0,0 +1,5 @@
# Penpot - uses official image
FROM penpot/penpot:latest
# Default configuration is in the image
# No additional setup needed

48
apps/penpot/manifest.yml Normal file
View File

@ -0,0 +1,48 @@
app:
id: penpot
name: Penpot
version: 2.0.0
description: Open-source design and prototyping platform. Design tools for teams.
container:
image: penpot/penpot:latest
image_signature: cosign://...
pull_policy: if-not-present
dependencies:
- storage: 10Gi
resources:
cpu_limit: 4
memory_limit: 4Gi
disk_limit: 10Gi
security:
capabilities: []
readonly_root: true
network_policy: isolated
apparmor_profile: penpot
ports:
- host: 8089
container: 80
protocol: tcp # Web UI
volumes:
- type: bind
source: /var/lib/archipelago/penpot
target: /app/data
options: [rw]
environment:
- PENPOT_PUBLIC_URI=http://localhost:8089
- PENPOT_DATABASE_URI=postgresql://penpot:penpot@penpot-db:5432/penpot
- PENPOT_REDIS_URI=redis://penpot-redis:6379
health_check:
type: http
endpoint: http://localhost:8089
path: /api/health
interval: 30s
timeout: 5s
retries: 3

5
apps/searxng/Dockerfile Normal file
View File

@ -0,0 +1,5 @@
# SearXNG - uses official image
FROM searxng/searxng:2024.1.0
# Default configuration is in the image
# No additional setup needed

47
apps/searxng/manifest.yml Normal file
View File

@ -0,0 +1,47 @@
app:
id: searxng
name: SearXNG
version: 2024.1.0
description: Privacy-respecting metasearch engine. Search the web without tracking.
container:
image: searxng/searxng:2024.1.0
image_signature: cosign://...
pull_policy: if-not-present
dependencies:
- storage: 2Gi
resources:
cpu_limit: 2
memory_limit: 1Gi
disk_limit: 2Gi
security:
capabilities: []
readonly_root: true
network_policy: isolated
apparmor_profile: searxng
ports:
- host: 8888
container: 8080
protocol: tcp # Web UI
volumes:
- type: bind
source: /var/lib/archipelago/searxng
target: /etc/searxng
options: [rw]
environment:
- SEARXNG_HOSTNAME=localhost
- SEARXNG_BIND_ADDRESS=0.0.0.0:8080
health_check:
type: http
endpoint: http://localhost:8888
path: /
interval: 30s
timeout: 5s
retries: 3

View File

@ -24,19 +24,18 @@ impl ApiHandler {
}) })
} }
pub async fn handle_request<B>(&self, req: Request<B>) -> Result<Response<Full<Bytes>>> pub async fn handle_request(
where &self,
B: http_body::Body<Data = Bytes> + Send + 'static, req: Request<http_body_util::Incoming>,
B::Error: std::fmt::Display, ) -> Result<Response<Full<Bytes>>> {
{ // Extract path and method before consuming req
let path = req.uri().path(); let path = req.uri().path().to_string();
let method = req.method(); let method = req.method().clone();
// Convert Incoming body to bytes using http_body_util::BodyExt // Convert body to bytes using http_body_util::BodyExt
let (parts, body) = req.into_parts(); let (parts, body) = req.into_parts();
// hyper::body::Incoming implements http_body::Body, and BodyExt extends it
use http_body_util::BodyExt; use http_body_util::BodyExt;
let collected = body.collect().await let collected: http_body_util::Collected<Bytes> = body.collect().await
.map_err(|_e| anyhow::anyhow!("Failed to read body"))?; .map_err(|_e| anyhow::anyhow!("Failed to read body"))?;
let body_bytes = collected.to_bytes(); let body_bytes = collected.to_bytes();
@ -47,10 +46,10 @@ impl ApiHandler {
// Route requests // Route requests
match (method, path.as_str()) { match (method, path.as_str()) {
(&Method::POST, "/rpc/v1") => { (Method::POST, "/rpc/v1") => {
self.rpc_handler.handle(req_with_bytes).await self.rpc_handler.handle(req_with_bytes).await
} }
(&Method::GET, "/health") => { (Method::GET, "/health") => {
Ok(Response::builder() Ok(Response::builder()
.status(StatusCode::OK) .status(StatusCode::OK)
.body(Full::new(Bytes::from("OK"))) .body(Full::new(Bytes::from("OK")))

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>: hyper::service::service::Service<http::request::Request<hyper::body::incoming::Incoming>>
hyper_util::server::conn::auto::Connection<'_, TokioIo<tokio::net::TcpStream>, hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>, TokioExecutor>

View File

@ -0,0 +1,2 @@
hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>: hyper::service::service::Service<http::request::Request<hyper::body::incoming::Incoming>>
hyper_util::server::conn::auto::Connection<'_, TokioIo<tokio::net::TcpStream>, hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>, TokioExecutor>

View File

@ -0,0 +1,2 @@
hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>: hyper::service::service::Service<http::request::Request<hyper::body::incoming::Incoming>>
hyper_util::server::conn::auto::Connection<'_, TokioIo<tokio::net::TcpStream>, hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>, TokioExecutor>

View File

@ -0,0 +1,2 @@
hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>: hyper::service::service::Service<http::request::Request<hyper::body::incoming::Incoming>>
hyper_util::server::conn::auto::Connection<'_, TokioIo<tokio::net::TcpStream>, hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>, TokioExecutor>

View File

@ -0,0 +1,2 @@
hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>: hyper::service::service::Service<http::request::Request<hyper::body::incoming::Incoming>>
hyper_util::server::conn::auto::Connection<'_, TokioIo<tokio::net::TcpStream>, hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>, TokioExecutor>

View File

@ -0,0 +1,2 @@
hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>: hyper::service::service::Service<http::request::Request<hyper::body::incoming::Incoming>>
hyper_util::server::conn::auto::Connection<'_, TokioIo<tokio::net::TcpStream>, hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>, TokioExecutor>

View File

@ -0,0 +1,2 @@
hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>: hyper::service::service::Service<http::request::Request<hyper::body::incoming::Incoming>>
hyper_util::server::conn::auto::Connection<'_, TokioIo<tokio::net::TcpStream>, hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>, TokioExecutor>

View File

@ -0,0 +1,2 @@
hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>: hyper::service::service::Service<http::request::Request<hyper::body::incoming::Incoming>>
hyper_util::server::conn::auto::Connection<'_, TokioIo<tokio::net::TcpStream>, hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>, TokioExecutor>

View File

@ -0,0 +1,2 @@
hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:84}, _>: hyper::service::service::Service<http::request::Request<hyper::body::incoming::Incoming>>
hyper_util::server::conn::auto::Connection<'_, TokioIo<tokio::net::TcpStream>, hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:84}, _>, TokioExecutor>

View File

@ -0,0 +1,2 @@
hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>: hyper::service::service::Service<http::request::Request<hyper::body::incoming::Incoming>>
hyper_util::server::conn::auto::Connection<'_, TokioIo<tokio::net::TcpStream>, hyper::service::util::ServiceFn<{closure@archipelago/src/server.rs:43:42: 43:52}, _>, TokioExecutor>