aboutsummaryrefslogtreecommitdiffstats
path: root/compose.yml.sample
blob: 8b774520cb14fc595b0bf1a4df569637bc3a78c4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
version: '3.6'
services:
  app:
    image: asoltys/coinos-server
    container_name: app
    depends_on:
      - db
      - bc
      - cl
    command: "bun run dev"
    environment:
      NODE_OPTIONS: "--import ./hooks.js"
      NODE_ENV: development
      URL: http://localhost:5173
    ports:
      - '3119:3119'
    volumes:
      - .aws/:/root/.aws
      - ./:/home/bun/app
      - ./logs:/logs
      - ./data/bitcoin/bitcoin.conf:/bitcoin.conf
    restart: always
  bc:
    image: asoltys/bitcoin
    container_name: bc
    ports:
      - '18443:18443'
    volumes:
      - ./data/bitcoin:/home/bitcoin/.bitcoin
    restart: always
  lq:
    image: asoltys/liquid:23.x
    container_name: lq
    volumes:
      - ./data/liquid:/home/elements/.elements
    restart: always
    ports:
      - 7043:7040
  cl:
    image: asoltys/cln
    container_name: cl
    environment:
      LIGHTNINGD_NETWORK: regtest
    volumes:
      - ./data/lightning:/root/.lightning
    restart: always
  clb:
    image: ghcr.io/coinos/lightningd:v26.06.2
    container_name: clb
    environment:
      LIGHTNINGD_NETWORK: regtest
    volumes:
      - ./data/lightningb:/root/.lightning
    restart: always
  clc:
    image: ghcr.io/coinos/lightningd:v26.06.2
    container_name: clc
    environment:
      LIGHTNINGD_NETWORK: regtest
    volumes:
      - ./data/lightningc:/root/.lightning
    restart: always
  db:
    image: eqalpha/keydb:alpine_x86_64_v6.3.4
    container_name: db
    ports:
      - '6379:6379'
    volumes:
      - ./data/db:/data
      - ./data/db/keydb.conf:/etc/keydb/keydb.conf
    restart: always
  archive:
    image: eqalpha/keydb:alpine_x86_64_v6.3.4
    container_name: archive
    ports:
      - '6380:6379'
    volumes:
      - ./data/archive:/data
    restart: always
  nostr:
    container_name: nostr
    image: asoltys/nostr-rs-relay
    restart: always
    user: 100:100
    volumes:
      - "./data/nostr/data:/usr/src/app/db" 
      - "./data/nostr/config.toml:/usr/src/app/config.toml" 
    ports:
      - '8082:8080'
  mint:
    image: asoltys/nutshell
    container_name: mint
    ports:
      - "3338:3338"
    environment:
      - MINT_CLNREST_URL=http://cl:3010
      - MINT_CLNREST_RUNE=lC9j5Z8-x7uN3oPqEGbpcNk2yknxQ4h5To5Z2Dp8ONE9Mg==
      - MINT_BACKEND_BOLT11_SAT=CLNRestWallet
      # - MINT_BACKEND_BOLT11_SAT=FakeWallet
      - MINT_LISTEN_HOST=0.0.0.0
      - MINT_LISTEN_PORT=3338
      - MINT_PRIVATE_KEY=TEST_PRIVATE_KEY
      - MINT_CLNREST_COINOS_URL=http://app:3119
      - MINT_CLNREST_COINOS_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVjYTM0YWU4LTdiMTItNDU4OS04ODMyLTUyMTNjOWVhMjc5NyIsImlhdCI6MTcyNDA0NjI3OH0.bdX1YLnpgqpjmjrkCdIdDbdmZUdViNSVrAJ0OX3ByPo
    command: ["poetry", "run", "mint"]
    volumes:
      - "./data/nutshell:/app"
      - "./data/mint:/app/data/mint"
  mintb:
    image: asoltys/nutshell
    container_name: mintb
    ports:
      - "3339:3338"
    environment:
      - MINT_CLNREST_URL=http://clb:3010
      - MINT_CLNREST_RUNE=kTyXJ6yJwESVezCl4yB4z0zGMjXi11qggnKRQ4nnc2Y9MA==
      - MINT_BACKEND_BOLT11_SAT=CLNRestWallet
      # - MINT_BACKEND_BOLT11_SAT=FakeWallet
      - MINT_LISTEN_HOST=0.0.0.0
      - MINT_LISTEN_PORT=3338
      - MINT_PRIVATE_KEY=TEST_PRIVATE_KEYB
      - MINT_CLNREST_COINOS_URL=http://app:3119
      - MINT_CLNREST_COINOS_JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVjYTM0YWU4LTdiMTItNDU4OS04ODMyLTUyMTNjOWVhMjc5NyIsImlhdCI6MTcyNDA0NjI3OH0.bdX1YLnpgqpjmjrkCdIdDbdmZUdViNSVrAJ0OX3ByPo
    command: ["poetry", "run", "mint"]
    volumes:
      - "./data/nutshell:/app"
      - "./data/mint:/app/data/mint"

  wallet:
    image: asoltys/nutshell
    container_name: wallet
    ports:
      - "4448:4448"
    depends_on:
      - mint
    environment:
      - MINT_URL=http://mint:3338
      - API_HOST=0.0.0.0
    command: ["poetry", "run", "cashu", "-d"]
class="p">, headers) => fetch(base + url, { headers }) .then((r) => r.text()) .then((body) => { try { return JSON.parse(body); } catch (e) { throw new Error(body); } }); export const get = (url, headers = {}) => fetch(base + url, { headers }) .then((r) => r.text()) .then((body) => { try { return JSON.parse(body); } catch (e) { throw new Error(body); } }); export const post = (url, body, headers) => { headers = { ...headers, 'content-type': 'application/json', accept: 'application/json' }; return fetch(base + url, { method: 'POST', body: JSON.stringify(body), headers }) .then((r) => r.text()) .then((body) => { try { body = JSON.parse(body); } catch (e) { throw new Error(body); } if (body.error) throw body.error; if (body instanceof Error) throw body; if (body.name === 'Error') throw new Error(body.message); return body; }); }; export const copy = (text) => { navigator.clipboard.writeText(text); success('Copied!'); }; export function reverseFormat(val, locale) { let parts = new Intl.NumberFormat(locale).formatToParts(1111.1); let group = parts.find((part) => part.type === 'group').value; let decimal = parts.find((part) => part.type === 'decimal').value; let reversedVal = val.replace(new RegExp('\\' + group, 'g'), ''); reversedVal = reversedVal.replace(new RegExp('\\' + decimal, 'g'), '.'); return Number.isNaN(reversedVal) ? 0 : +reversedVal; } export let protectedRoutes = [/customers/, /dashboard/, /settings/, /transactions/, /support/]; export const success = (m) => { toast.pop(); toast.push(m, { theme: { '--toastBarBackground': '#F5F7FA' } }); }; export const warning = (m) => { toast.pop(); toast.push(m, { theme: { '--toastBarBackground': '#FFCE22' } }); }; export const failure = (m) => { toast.pop(); toast.push(m, { theme: { '--toastBarBackground': '#E93535' } }); }; export const info = (m) => { toast.pop(); toast.push(m, { theme: { '--toastBarBackground': 'white' } }); }; export const login = async (user, cookies) => { let maxAge = 30 * 24 * 60 * 60; let res = await fetch(base + '/login', { method: 'POST', body: JSON.stringify(user), headers: { 'content-type': 'application/json', accept: 'application/json' } }); if (res.status === 401) { let text = await res.text(); if (text.startsWith('2fa')) throw new Error('2fa'); } let { token } = await res.json(); if (!token) throw new Error('Login failed'); let expires = new Date(); expires.setSeconds(expires.getSeconds() + maxAge); cookies.set('token', token, { path: '/', expires }); }; export const auth = (cookies) => ({ authorization: `Bearer ${cookies.get('token')}` }); export const f = (s, currency) => new Intl.NumberFormat('en-US', { style: 'currency', currency }) .format(s) .replace('CA', ''); export const s = (s) => new Intl.NumberFormat('en-US', { maximumFractionDigits: 0 }).format(s); export const sat = (s) => { s = Math.abs(s); let p = Math.floor(Math.log(s) / Math.LN10 + 0.000000001); let d = Math.floor((p + 1) / 3); return ( '⚡️' + (parseInt(s) > 0 ? new Intl.NumberFormat('en-US', { maximumFractionDigits: 1 }).format(s / Math.pow(1000, d)) + ['', 'K', 'M', 'G'][d] : 0 ).toString() ); }; export const sats = 100000000; export const back = () => browser && history.go(-1); export const focus = (el) => setTimeout(() => el.focus()); export const wait = async (f, s = 300) => { let i = 0; while (!(await f()) && i < s) (await sleep(1000)) && i++; if (i >= s) throw new Error('timeout'); return f(); };