Browse Source

feat(network): add NodeManager to construct docker compose file

feat/auto-update
jamaljsr 5 years ago
parent
commit
37bcb06c5e
  1. 2
      TODO.md
  2. 24
      docker/bitcoind/Dockerfile
  3. 16
      docker/bitcoind/docker-entrypoint.sh
  4. 90
      docker/docker-compose.yml
  5. 24
      docker/lnd/Dockerfile
  6. 16
      docker/lnd/docker-entrypoint.sh
  7. 41
      src/lib/docker/ComposeFile.ts
  8. 20
      src/lib/docker/NetworkManager.ts
  9. 74
      src/lib/docker/nodeTemplates.ts
  10. 12
      src/react-app-env.d.ts
  11. 8
      src/store/models/network.ts

2
TODO.md

@ -2,6 +2,6 @@
- update app icon - update app icon
- live theme changer (https://medium.com/@mzohaib.qc/ant-design-dynamic-runtime-theme-1f9a1a030ba0) - live theme changer (https://medium.com/@mzohaib.qc/ant-design-dynamic-runtime-theme-1f9a1a030ba0)
- POC for styled-components (https://github.com/styled-components/styled-components) - POC for styled-components (https://www.styled-components.com) (https://emotion.sh)
- better UI design (https://material.io/design/color/dark-theme.html) - better UI design (https://material.io/design/color/dark-theme.html)
- add network designer (https://github.com/projectstorm/react-diagrams) - add network designer (https://github.com/projectstorm/react-diagrams)

24
docker/bitcoind/Dockerfile

@ -0,0 +1,24 @@
FROM debian:stable-slim
ARG BITCOIN_VERSION
ENV PATH=/opt/bitcoin-${BITCOIN_VERSION}/bin:$PATH
RUN useradd -r bitcoin \
&& apt-get update -y \
&& apt-get install -y curl gosu \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN curl -SLO https://bitcoin.org/bin/bitcoin-core-${BITCOIN_VERSION}/bitcoin-${BITCOIN_VERSION}-x86_64-linux-gnu.tar.gz \
&& tar -xzf *.tar.gz -C /opt \
&& rm *.tar.gz
COPY docker-entrypoint.sh /entrypoint.sh
VOLUME ["/home/bitcoin/.bitcoin"]
EXPOSE 8332 8333 18332 18333 18443 18444
ENTRYPOINT ["/entrypoint.sh"]
CMD ["bitcoind"]

16
docker/bitcoind/docker-entrypoint.sh

@ -0,0 +1,16 @@
#!/bin/sh
set -e
if [ $(echo "$1" | cut -c1) = "-" ]; then
echo "$0: assuming arguments for bitcoind"
set -- bitcoind "$@"
fi
if [ "$1" = "bitcoind" ] || [ "$1" = "bitcoin-cli" ] || [ "$1" = "bitcoin-tx" ]; then
echo
exec gosu bitcoin "$@"
fi
echo
exec "$@"

90
docker/docker-compose.yml

@ -0,0 +1,90 @@
version: '3.3'
services:
bitcoind:
image: bitcoind:0.18.0
container_name: bitcoind
user: bitcoin
# Note: need to escape the dollar sign ($$) in rpcauth. there is only one in the actual password
command: bitcoind
-server=1
-regtest=1
-rpcauth=kiteuser:d81315a082bcf36bcdcd640e816566f3$$a7a42c95772b9e7461f016a8c797f5729b494ad569555aea28f5c42ee2b3fcda
-debug=0
-zmqpubrawblock=tcp://0.0.0.0:28334
-zmqpubrawtx=tcp://0.0.0.0:28335
-txindex=1
-dnsseed=0
-upnp=0
-rpcbind=0.0.0.0
-rpcallowip=0.0.0.0/0
volumes:
- ${PWD}/_data/bitcoind:/home/bitcoin/.bitcoin
expose:
- '18443' # RPC
- '18444' # p2p
- '28334' # ZMQ blocks
- '28335' # ZMQ txns
ports:
- '18443:18443' # RPC
- '28334:28334' # ZMQ blocks
- '28335:28335' # ZMQ txns
alice:
image: lnd:0.7.1-beta
container_name: lnd_alice
user: lnd
command: wait-for-it bitcoind:18443 -- lnd
--noseedbackup
--tlsextradomain=lnd
--listen=0.0.0.0:9735
--rpclisten=0.0.0.0:10009
--restlisten=0.0.0.0:8080
--bitcoin.active
--bitcoin.regtest
--bitcoin.node=bitcoind
--bitcoind.rpchost=bitcoind
--bitcoind.rpcuser=kiteuser
--bitcoind.rpcpass=kitepass
--bitcoind.zmqpubrawblock=tcp://bitcoind:28334
--bitcoind.zmqpubrawtx=tcp://bitcoind:28335
restart: always
volumes:
- ${PWD}/_data/lnd/alice:/home/lnd/.lnd
expose:
- '10000' # gRPC
- '8080' # REST
- '9735' # p2p
ports:
- '11001:10000' # gRPC
- '8001:8080' # REST
- '9001:9735' # p2p
bob:
image: lnd:0.7.1-beta
container_name: lnd_bob
user: lnd
command: wait-for-it bitcoind:18443 -- lnd
--noseedbackup
--tlsextradomain=lnd
--listen=0.0.0.0:9735
--rpclisten=0.0.0.0:10009
--restlisten=0.0.0.0:8080
--bitcoin.active
--bitcoin.regtest
--bitcoin.node=bitcoind
--bitcoind.rpchost=bitcoind
--bitcoind.rpcuser=kiteuser
--bitcoind.rpcpass=kitepass
--bitcoind.zmqpubrawblock=tcp://bitcoind:28334
--bitcoind.zmqpubrawtx=tcp://bitcoind:28335
restart: always
volumes:
- ${PWD}/_data/lnd/bob:/home/lnd/.lnd
expose:
- '10000' # gRPC
- '8080' # REST
- '9735' # p2p
ports:
- '11002:10000' # gRPC
- '8002:8080' # REST
- '9002:9735' # p2p

24
docker/lnd/Dockerfile

@ -0,0 +1,24 @@
FROM debian:stable-slim
ARG LND_VERSION
ENV PATH=/opt/lnd-linux-amd64-v${LND_VERSION}:$PATH
RUN useradd -r lnd \
&& apt-get update -y \
&& apt-get install -y curl gosu wait-for-it \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN curl -SLO https://github.com/lightningnetwork/lnd/releases/download/v${LND_VERSION}/lnd-linux-amd64-v${LND_VERSION}.tar.gz \
&& tar -xzf *.tar.gz -C /opt \
&& rm *.tar.gz
COPY docker-entrypoint.sh /entrypoint.sh
VOLUME ["/home/lnd/.lnd"]
EXPOSE 8332 8333 18332 18333 18443 18444
ENTRYPOINT ["/entrypoint.sh"]
CMD ["lnd"]

16
docker/lnd/docker-entrypoint.sh

@ -0,0 +1,16 @@
#!/bin/sh
set -e
if [ $(echo "$1" | cut -c1) = "-" ]; then
echo "$0: assuming arguments for lnd"
set -- lnd "$@"
fi
if [ "$1" = "lnd" ] || [ "$1" = "lncli" ]; then
echo
exec gosu lnd "$@"
fi
echo
exec "$@"

41
src/lib/docker/ComposeFile.ts

@ -0,0 +1,41 @@
/* eslint-disable @typescript-eslint/camelcase */
import { bitcoind, lnd } from './nodeTemplates';
export interface ComposeService {
[key: string]: {
image: string;
container_name: string;
user: string;
command: string;
volumes: string[];
expose: string[];
ports: string[];
restart?: 'always';
};
}
export interface ComposeContent {
version: string;
services: ComposeService[];
}
class ComposeFile {
content: ComposeContent;
constructor() {
this.content = {
version: '3.3',
services: [],
};
}
addBitcoind(name: string) {
this.content.services.push(bitcoind(name));
}
addLnd(name: string) {
this.content.services.push(lnd(name));
}
}
export default ComposeFile;

20
src/lib/docker/NetworkManager.ts

@ -0,0 +1,20 @@
import ComposeFile from './ComposeFile';
class NetworkManager {
start(network: Network) {
this._buildComposeFile(network);
}
private _buildComposeFile(network: Network) {
const file = new ComposeFile();
network.nodes.bitcoin.forEach(node => {
file.addBitcoind(node.name);
});
network.nodes.lightning.forEach(node => {
file.addLnd(node.name);
});
console.log(JSON.stringify(file.content, null, 2));
}
}
export default new NetworkManager();

74
src/lib/docker/nodeTemplates.ts

@ -0,0 +1,74 @@
/* eslint-disable @typescript-eslint/camelcase */
/* eslint-disable no-template-curly-in-string */
import { ComposeService } from './ComposeFile';
const trimInside = (text: string): string => text.replace(/\s+/g, ' ').trim();
export const bitcoind = (name: string): ComposeService => ({
bitcoind: {
image: 'bitcoind:0.18.0',
container_name: name,
user: 'bitcoin',
command: trimInside(`
bitcoind
-server=1
-regtest=1
-rpcauth=kiteuser:d81315a082bcf36bcdcd640e816566f3$$a7a42c95772b9e7461f016a8c797f5729b494ad569555aea28f5c42ee2b3fcda
-debug=0
-zmqpubrawblock=tcp://0.0.0.0:28334
-zmqpubrawtx=tcp://0.0.0.0:28335
-txindex=1
-dnsseed=0
-upnp=0
-rpcbind=0.0.0.0
-rpcallowip=0.0.0.0/0
`),
volumes: ['${PWD}/_data/bitcoind:/home/bitcoin/.bitcoin'],
expose: [
'18443', // RPC
'18444', // p2p
'28334', // ZMQ blocks
'28335', // ZMQ txns
],
ports: [
'18443:18443', // RPC
'28334:28334', // ZMQ blocks
'28335:28335', // ZMQ txns
],
},
});
export const lnd = (name: string): ComposeService => ({
lnd: {
image: 'lnd:0.7.1-beta',
container_name: name,
user: 'lnd',
command: trimInside(`
wait-for-it bitcoind:18443 -- lnd
--noseedbackup
--tlsextradomain=lnd
--listen=0.0.0.0:9735
--rpclisten=0.0.0.0:10009
--restlisten=0.0.0.0:8080
--bitcoin.active
--bitcoin.regtest
--bitcoin.node=bitcoind
--bitcoind.rpchost=bitcoind
--bitcoind.rpcuser=kiteuser
--bitcoind.rpcpass=kitepass
--bitcoind.zmqpubrawblock=tcp://bitcoind:28334
--bitcoind.zmqpubrawtx=tcp://bitcoind:28335
`),
volumes: ['${PWD}/_data/lnd/alice:/home/lnd/.lnd'],
expose: [
'10000', // gRPC
'8080', // REST
'9735', // p2p
],
ports: [
'11001:10000', // gRPC
'8001:8080', // REST
'9001:9735', // p2p
],
},
});

12
src/react-app-env.d.ts

@ -9,14 +9,18 @@ interface LocalConfig {
}; };
} }
interface BitcoinNode { interface FogNode {
id: number; id: number;
name: string; name: string;
type: 'bitcoin' | 'lightning';
} }
interface LightningNode { interface BitcoinNode extends FogNode {
id: number; type: 'bitcoin';
name: string; }
interface LightningNode extends FogNode {
type: 'lightning';
bitcoinNodeId: number; bitcoinNodeId: number;
} }

8
src/store/models/network.ts

@ -1,6 +1,7 @@
import { Action, action, Thunk, thunk } from 'easy-peasy'; import { Action, action, Thunk, thunk } from 'easy-peasy';
import { info } from 'electron-log'; import { info } from 'electron-log';
import { push } from 'connected-react-router'; import { push } from 'connected-react-router';
import networkManager from 'lib/docker/NetworkManager';
export interface NetworkModel { export interface NetworkModel {
networks: Network[]; networks: Network[];
@ -16,17 +17,20 @@ const basicNetwork: Network = {
{ {
id: 0, id: 0,
name: 'bitcoind1', name: 'bitcoind1',
type: 'bitcoin',
}, },
], ],
lightning: [ lightning: [
{ {
id: 0, id: 0,
name: 'alice', name: 'alice',
type: 'lightning',
bitcoinNodeId: 0, bitcoinNodeId: 0,
}, },
{ {
id: 0, id: 0,
name: 'bob', name: 'bob',
type: 'lightning',
bitcoinNodeId: 0, bitcoinNodeId: 0,
}, },
], ],
@ -42,8 +46,10 @@ const networkModel: NetworkModel = {
state.networks.push(network); state.networks.push(network);
info(`Added new network '${network.name}' to redux sate`); info(`Added new network '${network.name}' to redux sate`);
}), }),
addNetwork: thunk(async (actions, payload, { dispatch }) => { addNetwork: thunk(async (actions, payload, { dispatch, getState }) => {
actions.add(payload); actions.add(payload);
const { networks } = getState();
networkManager.start(networks[networks.length - 1]);
dispatch(push('/')); dispatch(push('/'));
}), }),
}; };

Loading…
Cancel
Save