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
### 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)
- **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-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)
- **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
- **router**: Mesh routing and network management (ports: 8084, 5353, 1900)
- **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).
| App | Base Ports | Dev Ports (offset +10000) |
|-----|------------|---------------------------|
| bitcoin-core | 8332, 8333 | 18332, 18333 |
| lnd | 9735, 10009, 8080 | 19735, 20009, 18080 |
| core-lightning | 9736, 9835 | 19736, 19835 |
| btcpay-server | 80, 443 | 10080, 10443 |
| nostr-rs-relay | 8081 | 18081 |
| strfry | 8082 | 18082 |
| did-wallet | 8083 | 18083 |
| router | 8084, 5353, 1900 | 18084, 15353, 11900 |
| web5-dwn | 3000 | 13000 |
| meshtastic | 4403, 1883 | 14403, 11883 |
See [PORTS.md](./PORTS.md) for complete port mapping.
Key apps:
- **bitcoin-core**: 8332, 8333 → 18332, 18333
- **btcpay-server**: 80, 443 → 10080, 10443
- **home-assistant**: 8123 → 18123
- **grafana**: 3001 → 13001
- **mempool**: 4080 → 14080
- **ollama**: 11434 → 21434
- **lightning-stack**: 9737, 10010, 8087 → 19737, 20010, 18087
## Building Apps

View File

@ -4,35 +4,59 @@ This document lists all port assignments for Archipelago apps.
## Production Ports
| App | Port(s) | Protocol | Service |
|-----|---------|----------|---------|
| bitcoin-core | 8332, 8333 | TCP | RPC, P2P |
| lnd | 9735, 10009, 8080 | TCP | P2P, gRPC, REST |
| core-lightning | 9736, 9835 | TCP | P2P, gRPC |
| btcpay-server | 80, 443 | TCP | HTTP, HTTPS |
| nostr-rs-relay | 8081 | TCP | HTTP/WebSocket |
| strfry | 8082 | TCP | HTTP/WebSocket |
| did-wallet | 8083 | TCP | Web UI |
| router | 8084, 5353, 1900 | TCP/UDP | Web UI, mDNS, SSDP |
| web5-dwn | 3000 | TCP | HTTP API |
| meshtastic | 4403, 1883 | TCP | HTTP API, MQTT |
| App | Port(s) | Protocol | Service | Dev Port(s) |
|-----|---------|----------|---------|-------------|
| bitcoin-core | 8332, 8333 | TCP | RPC, P2P | 18332, 18333 |
| btcpay-server | 80, 443 | TCP | HTTP, HTTPS | 10080, 10443 |
| home-assistant | 8123 | TCP | Web UI | 18123 |
| grafana | 3001 | TCP | Web UI | 13001 |
| endurain | 8085 | TCP | Web UI | 18085 |
| fedimint | 8173, 8174 | TCP | API, Web UI | 18173, 18174 |
| morphos-server | 8086 | TCP | Web UI | 18086 |
| lightning-stack | 9737, 10010, 8087 | TCP | P2P, gRPC, REST | 19737, 20010, 18087 |
| mempool | 4080 | TCP | Web UI | 14080 |
| 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)
In development mode, all ports are offset by 10000 to avoid conflicts with production services.
| App | Dev Port(s) | Access URL |
|-----|-------------|------------|
| bitcoin-core | 18332, 18333 | http://localhost:18332 |
| lnd | 19735, 20009, 18080 | http://localhost:18080 |
| core-lightning | 19736, 19835 | http://localhost:19835 |
| btcpay-server | 10080, 10443 | http://localhost:10080 |
| nostr-rs-relay | 18081 | http://localhost:18081 |
| strfry | 18082 | http://localhost:18082 |
| did-wallet | 18083 | http://localhost:18083 |
| router | 18084, 15353, 11900 | http://localhost:18084 |
| web5-dwn | 13000 | http://localhost:13000 |
| meshtastic | 14403, 11883 | http://localhost:14403 |
### Quick Access URLs (Development)
| App | Dev URL |
|-----|----------|
| Bitcoin Core RPC | http://localhost:18332 |
| BTCPay Server | http://localhost:10080 |
| Home Assistant | http://localhost:18123 |
| Grafana | http://localhost:13001 |
| Endurain | http://localhost:18085 |
| Fedimint | http://localhost:18174 |
| MorphOS Server | http://localhost:18086 |
| 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
@ -55,3 +79,10 @@ Or in the Archipelago config:
[dev]
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
### Bitcoin & Lightning
- `bitcoin-core/` - Bitcoin Core full node
- `bitcoin-core/` - Bitcoin Core full node (v24.0.0)
- `lnd/` - Lightning Network Daemon
- `core-lightning/` - Core Lightning (CLN)
- `btcpay-server/` - BTCPay Server payment processor
- `mempool/` - Mempool blockchain explorer
- `lightning-stack/` - Complete Lightning implementation (v0.12.0)
- `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
- `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
- `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
- `meshtastic/` - Meshtastic LoRa mesh networking
- `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
@ -46,3 +46,25 @@ Each app has a `manifest.yml` file defining:
- Network configuration
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>>>
where
B: http_body::Body<Data = Bytes> + Send + 'static,
B::Error: std::fmt::Display,
{
let path = req.uri().path();
let method = req.method();
pub async fn handle_request(
&self,
req: Request<http_body_util::Incoming>,
) -> Result<Response<Full<Bytes>>> {
// Extract path and method before consuming req
let path = req.uri().path().to_string();
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();
// hyper::body::Incoming implements http_body::Body, and BodyExt extends it
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"))?;
let body_bytes = collected.to_bytes();
@ -47,10 +46,10 @@ impl ApiHandler {
// Route requests
match (method, path.as_str()) {
(&Method::POST, "/rpc/v1") => {
(Method::POST, "/rpc/v1") => {
self.rpc_handler.handle(req_with_bytes).await
}
(&Method::GET, "/health") => {
(Method::GET, "/health") => {
Ok(Response::builder()
.status(StatusCode::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>