From 526bdcc823e110faaa4896d55574931c69a09be5 Mon Sep 17 00:00:00 2001 From: vdo Date: Wed, 10 Jul 2019 19:25:25 +0200 Subject: [PATCH 01/40] Add backup --- dappnode_package.json | 13 +++++-------- docker-compose.yml | 34 +++++++++++++++++----------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/dappnode_package.json b/dappnode_package.json index 4553f12..6b1c64a 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -1,6 +1,6 @@ { "name": "lightning-network.dnp.dappnode.eth", - "version": "0.0.2", + "version": "0.0.3", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that removes the risk of delegating custody of funds to trusted third parties.", "avatar": "/ipfs/QmVrjV1ANxjYVqRJzycYKcCUAH8nU337UsMVir1CnZYNa8", "type": "service", @@ -8,12 +8,8 @@ "path": "", "hash": "", "size": "", - "ports": [ - "9735:9735" - ], - "volumes": [ - "lndconfig_data:/root/.lnd/" - ], + "ports": ["9735:9735"], + "volumes": ["lndconfig_data:/root/.lnd/"], "restart": "always", "environment": [ "RTL_PASSWORD=changeme", @@ -26,6 +22,7 @@ "EXT_IP=" ] }, + "backup": [{ "name": "data", "path": "/root/.lnd/data" }], "author": "DAppNode Association (https://github.com/dappnode)", "contributors": [ "Abel Boldú (@vdo)", @@ -49,4 +46,4 @@ "dependencies": { "bitcoin.dnp.dappnode.eth": "latest" } -} \ No newline at end of file +} diff --git a/docker-compose.yml b/docker-compose.yml index 3b62b53..97c931e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,20 +1,20 @@ version: '3.4' services: - lightning-network.dnp.dappnode.eth: - image: 'lightning-network.dnp.dappnode.eth:0.0.1' - build: ./build - volumes: - - 'lndconfig_data:/root/.lnd/' - ports: - - '9735:9735' - environment: - - RTL_PASSWORD=changeme - - RPCUSER=dappnode - - RPCPASS=dappnode - - BITCOIND_HOST=my.bitcoin.dnp.dappnode.eth - - NETWORK=mainnet - - ALIAS= - - COLOR=#5ACDC5 - - EXT_IP= + lightning-network.dnp.dappnode.eth: + image: 'lightning-network.dnp.dappnode.eth:0.0.3' + build: ./build + volumes: + - 'lndconfig_data:/root/.lnd/' + ports: + - '9735:9735' + environment: + - RTL_PASSWORD=changeme + - RPCUSER=dappnode + - RPCPASS=dappnode + - BITCOIND_HOST=my.bitcoin.dnp.dappnode.eth + - NETWORK=mainnet + - ALIAS= + - 'COLOR=#5ACDC5' + - EXT_IP= volumes: - lndconfig_data: {} + lndconfig_data: {} From 84cbea3976b5d8628e381382d775bfed66ac285e Mon Sep 17 00:00:00 2001 From: vdo Date: Thu, 11 Jul 2019 16:54:31 +0200 Subject: [PATCH 02/40] Update links --- dappnode_package.json | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/dappnode_package.json b/dappnode_package.json index 6b1c64a..0e95176 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -8,8 +8,12 @@ "path": "", "hash": "", "size": "", - "ports": ["9735:9735"], - "volumes": ["lndconfig_data:/root/.lnd/"], + "ports": [ + "9735:9735" + ], + "volumes": [ + "lndconfig_data:/root/.lnd/" + ], "restart": "always", "environment": [ "RTL_PASSWORD=changeme", @@ -22,15 +26,27 @@ "EXT_IP=" ] }, - "backup": [{ "name": "data", "path": "/root/.lnd/data" }], + "backup": [ + { + "name": "data", + "path": "/root/.lnd/data" + } + ], "author": "DAppNode Association (https://github.com/dappnode)", "contributors": [ "Abel Boldú (@vdo)", "Eduardo Antuña (https://github.com/eduadiez)" ], - "keywords": ["bitcoin", "btc", "lightning network", "lnd"], - "homepage": { - "homepage": "https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme" + "keywords": [ + "bitcoin", + "btc", + "lightning network", + "lnd" + ], + "links": { + "WebUI": "http://lightning-network.dappnode", + "API": "http://lightning-network.dappnode:8080", + "readme": "https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme" }, "repository": { "type": "git", From 3f007227b13f9f978320fb2d035b073eb70e79dc Mon Sep 17 00:00:00 2001 From: dapplion Date: Mon, 15 Jul 2019 14:17:20 +0200 Subject: [PATCH 03/40] Add new manifest fields and compress avatar --- avatar-lightning-network.png | Bin 0 -> 10247 bytes dappnode_package.json | 16 +++++++++++++--- lnd.png | Bin 68697 -> 0 bytes 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 avatar-lightning-network.png delete mode 100644 lnd.png diff --git a/avatar-lightning-network.png b/avatar-lightning-network.png new file mode 100644 index 0000000000000000000000000000000000000000..a277ca37a109e635e43683afae17faf82ad3d904 GIT binary patch literal 10247 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 (https://github.com/dappnode)", "contributors": [ "Abel Boldú (@vdo)", "Eduardo Antuña (https://github.com/eduadiez)" ], + "categories": [ + "Payment channels", + "Economic incentive" + ], "keywords": [ "bitcoin", "btc", @@ -44,9 +54,9 @@ "lnd" ], "links": { - "WebUI": "http://lightning-network.dappnode", - "API": "http://lightning-network.dappnode:8080", - "readme": "https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme" + "homepage": "https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme", + "ui": "http://lightning-network.dappnode", + "api": "http://lightning-network.dappnode:8080" }, "repository": { "type": "git", diff --git a/lnd.png b/lnd.png deleted file mode 100644 index bfffd2ede472ac144808292a59377d7aba5c5812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68697 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

WZNXcKnGB({Gz2j21o{QE9z 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 z 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 L>0^b2QPBSfrf-jf From 4c1e12f3903788061a372824e93b02126fb4a740 Mon Sep 17 00:00:00 2001 From: dapplion Date: Mon, 15 Jul 2019 16:38:57 +0200 Subject: [PATCH 04/40] Upload avatar --- dappnode_package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dappnode_package.json b/dappnode_package.json index f4d5ec3..cc083c4 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -4,7 +4,7 @@ "upstreamVersion": "0.6.1-beta", "shortDescription": "Scalable, instant Bitcoin/Blockchain transactions", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that removes the risk of delegating custody of funds to trusted third parties.", - "avatar": "/ipfs/QmVrjV1ANxjYVqRJzycYKcCUAH8nU337UsMVir1CnZYNa8", + "avatar": "/ipfs/QmYjbpLBEbPDoiJwTcWjhuHuL1Ax2HuArhXRF4Fi95HT6c", "type": "service", "image": { "path": "", From bb0235075fa1c8b3bfc88bfe0ff19da7f289bf68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Tue, 16 Jul 2019 11:44:20 +0200 Subject: [PATCH 05/40] Added upstreamVersion --- dappnode_package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dappnode_package.json b/dappnode_package.json index cc083c4..40c4afd 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -1,7 +1,7 @@ { "name": "lightning-network.dnp.dappnode.eth", "version": "0.0.3", - "upstreamVersion": "0.6.1-beta", + "upstreamVersion": "v0.7.0-beta", "shortDescription": "Scalable, instant Bitcoin/Blockchain transactions", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that removes the risk of delegating custody of funds to trusted third parties.", "avatar": "/ipfs/QmYjbpLBEbPDoiJwTcWjhuHuL1Ax2HuArhXRF4Fi95HT6c", @@ -55,8 +55,8 @@ ], "links": { "homepage": "https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme", - "ui": "http://lightning-network.dappnode", - "api": "http://lightning-network.dappnode:8080" + "WebUI": "http://lightning-network.dappnode", + "API": "http://lightning-network.dappnode:8080" }, "repository": { "type": "git", From bd49a9f3367baf0ffdacff8458fe1fae7601aa0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= <20141918+eduadiez@users.noreply.github.com> Date: Tue, 16 Jul 2019 12:08:11 +0200 Subject: [PATCH 06/40] Advance manifest to new version: 0.1.1 --- dappnode_package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dappnode_package.json b/dappnode_package.json index 40c4afd..7c1dfc5 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -1,6 +1,6 @@ { "name": "lightning-network.dnp.dappnode.eth", - "version": "0.0.3", + "version": "0.1.1", "upstreamVersion": "v0.7.0-beta", "shortDescription": "Scalable, instant Bitcoin/Blockchain transactions", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that removes the risk of delegating custody of funds to trusted third parties.", @@ -72,4 +72,4 @@ "dependencies": { "bitcoin.dnp.dappnode.eth": "latest" } -} +} \ No newline at end of file From edd2d6aa1410dabfb0b3ce87a0195943cdf19319 Mon Sep 17 00:00:00 2001 From: dapplion Date: Tue, 16 Jul 2019 17:12:39 +0200 Subject: [PATCH 07/40] Text review --- dappnode_package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dappnode_package.json b/dappnode_package.json index cc083c4..a99b701 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -2,8 +2,8 @@ "name": "lightning-network.dnp.dappnode.eth", "version": "0.0.3", "upstreamVersion": "0.6.1-beta", - "shortDescription": "Scalable, instant Bitcoin/Blockchain transactions", - "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that removes the risk of delegating custody of funds to trusted third parties.", + "shortDescription": "Scalable, instant Bitcoin transactions", + "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that remove the risk of delegating custody of funds to trusted third parties. \n\n\n **Getting started** \n\n Go to the [Lightning Network DAppNode Package readme](https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme) to learn how to get started and safely backup your data.", "avatar": "/ipfs/QmYjbpLBEbPDoiJwTcWjhuHuL1Ax2HuArhXRF4Fi95HT6c", "type": "service", "image": { From bda28e4a51ef64e5fc82b70a64f380ff6882ba5f Mon Sep 17 00:00:00 2001 From: vdo Date: Fri, 19 Jul 2019 11:08:10 +0200 Subject: [PATCH 08/40] Backup whole volume --- dappnode_package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dappnode_package.json b/dappnode_package.json index 6df739c..df67b7d 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -34,7 +34,7 @@ "backup": [ { "name": "data", - "path": "/root/.lnd/data" + "path": "/root/.lnd" } ], "style": { From 68a38a94095df251b0483738637f7bd7c0e5b19c Mon Sep 17 00:00:00 2001 From: vdo Date: Fri, 19 Jul 2019 11:22:36 +0200 Subject: [PATCH 09/40] Add lncli tool --- build/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/build/Dockerfile b/build/Dockerfile index 548922f..5e98f51 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -29,6 +29,7 @@ RUN apk add --no-cache supervisor bash curl nodejs openssl gettext COPY --from=build /rtl /rtl COPY --from=build /bin/lnd /bin/lnd +COPY --from=build /bin/lncli /bin/lncli COPY src/scripts/start-lnd.sh / COPY src/scripts/start-rtl.sh /rtl From f3d8fec01e4d241fa35e08c1a254c622c1c6233e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Wed, 7 Aug 2019 13:22:33 +0200 Subject: [PATCH 10/40] Updated LND and RTL versions * LND_VERSION "v0.7.1-beta" * RTL_TAG "v0.4.4" --- build/Dockerfile | 4 ++-- dappnode_package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/Dockerfile b/build/Dockerfile index 5e98f51..4034658 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,7 +1,7 @@ FROM node:10.15.3-alpine as build -ENV LND_VERSION "v0.7.0-beta" -ENV RTL_TAG "v0.4.2" +ENV LND_VERSION "v0.7.1-beta" +ENV RTL_TAG "v0.4.4" RUN apk add --no-cache wget ca-certificates \ && wget https://github.com/lightningnetwork/lnd/releases/download/${LND_VERSION}/lnd-linux-amd64-${LND_VERSION}.tar.gz \ diff --git a/dappnode_package.json b/dappnode_package.json index df67b7d..5584363 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -1,7 +1,7 @@ { "name": "lightning-network.dnp.dappnode.eth", "version": "0.0.3", - "upstreamVersion": "v0.7.0-beta", + "upstreamVersion": "v0.7.1-beta", "shortDescription": "Scalable, instant Bitcoin transactions", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that remove the risk of delegating custody of funds to trusted third parties. \n\n\n **Getting started** \n\n Go to the [Lightning Network DAppNode Package readme](https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme) to learn how to get started and safely backup your data.", "avatar": "/ipfs/QmYjbpLBEbPDoiJwTcWjhuHuL1Ax2HuArhXRF4Fi95HT6c", From 17c043e3f401f24455be6e087a4a7d46f7d47aa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Wed, 7 Aug 2019 13:33:48 +0200 Subject: [PATCH 11/40] Updated compose version --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 97c931e..a9ab9d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.4' services: lightning-network.dnp.dappnode.eth: - image: 'lightning-network.dnp.dappnode.eth:0.0.3' + image: 'lightning-network.dnp.dappnode.eth:0.1.1' build: ./build volumes: - 'lndconfig_data:/root/.lnd/' From 673e08a597f8a92fd6aa09f18f8a7bab2e2ad1c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Wed, 7 Aug 2019 13:36:05 +0200 Subject: [PATCH 12/40] upstreamVersion updated --- dappnode_package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dappnode_package.json b/dappnode_package.json index 7b6f80c..93c7978 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -1,15 +1,15 @@ { "name": "lightning-network.dnp.dappnode.eth", "version": "0.1.1", - "upstreamVersion": "v0.7.0-beta", + "upstreamVersion": "v0.7.1-beta", "shortDescription": "Scalable, instant Bitcoin transactions", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that remove the risk of delegating custody of funds to trusted third parties. \n\n\n **Getting started** \n\n Go to the [Lightning Network DAppNode Package readme](https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme) to learn how to get started and safely backup your data.", "avatar": "/ipfs/QmYjbpLBEbPDoiJwTcWjhuHuL1Ax2HuArhXRF4Fi95HT6c", "type": "service", "image": { - "path": "", - "hash": "", - "size": "", + "path": "lightning-network.dnp.dappnode.eth_0.1.1.tar.xz", + "hash": "/ipfs/QmcnvMe6yrh2EZuAwyEb372uuzHKMcn145sfKEhkh822b7", + "size": 81584921, "ports": [ "9735:9735" ], @@ -72,4 +72,4 @@ "message": "This software is experimental, presented 'as is' and inherently carries risks. By installing it, you acknowledge that DAppNode Association has done its best to mitigate these risks and accept to waive any liability or responsibility for DAppNode in case of any shortage, discrepancy, damage, loss or destruction of any digital asset managed within this DAppNode package.\n\nThis package stores private keys, which will be stored in your DAppNode. Neither DAppNode Association nor the developers of this software can have access to your private key, nor help you recover it if you lose it. \n\nYou are solely responsible for keeping your private keys and password safe and to perform secure backups, as well as to restrict access to your computer and other equipment. To the extent permitted by applicable law, you agree to be responsible for all activities that have been conducted from your account. You must take all necessary steps to ensure that your private key, password, and/or recovery phrase remain confidential and secured." }, "license": "GPL-3.0" -} +} \ No newline at end of file From 4c7ab5e29d92853cd27d23a655a8d1a35ba24c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Wed, 7 Aug 2019 14:44:08 +0200 Subject: [PATCH 13/40] Workaround to fix `Error: Cannot find module 'atob'` * npm install @types/node --- build/Dockerfile | 4 ++-- dappnode_package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/Dockerfile b/build/Dockerfile index 4034658..6bf16e4 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,4 +1,4 @@ -FROM node:10.15.3-alpine as build +FROM node:10.16.0-alpine as build ENV LND_VERSION "v0.7.1-beta" ENV RTL_TAG "v0.4.4" @@ -18,7 +18,7 @@ RUN git clone -b $RTL_TAG https://github.com/ShahanaFarooqui/RTL.git /rtl WORKDIR /rtl RUN npm install -RUN rm -rf ./node_modules/* && npm install --only=production +RUN rm -rf ./node_modules/* && npm install --only=production && npm install @types/node FROM alpine diff --git a/dappnode_package.json b/dappnode_package.json index 93c7978..fb83c70 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -8,8 +8,8 @@ "type": "service", "image": { "path": "lightning-network.dnp.dappnode.eth_0.1.1.tar.xz", - "hash": "/ipfs/QmcnvMe6yrh2EZuAwyEb372uuzHKMcn145sfKEhkh822b7", - "size": 81584921, + "hash": "/ipfs/QmXxbfGVFCjJxK3JHr5Cpi6kEWbDdd3gGb8aDPoWJr7Eud", + "size": 95610466, "ports": [ "9735:9735" ], From 4461b1416fd7b6f9b5c3dc32ac126f0d429b5a5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Wed, 7 Aug 2019 17:59:32 +0200 Subject: [PATCH 14/40] Added CHANNEL_BACKUP_PATH * Now channel-all.bak is included on the backup --- build/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/Dockerfile b/build/Dockerfile index 6bf16e4..5052af8 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -24,6 +24,8 @@ FROM alpine WORKDIR /rtl +ENV CHANNEL_BACKUP_PATH /root/.lnd + # Add requirements RUN apk add --no-cache supervisor bash curl nodejs openssl gettext From d78b540455344b1853411818c348e2a1668122c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lex?= Date: Thu, 8 Aug 2019 13:58:53 +0200 Subject: [PATCH 15/40] Backup / Restore section updated --- README.md | 125 +++++++++++++++++++++++++++--------------------------- 1 file changed, 62 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index e086964..9f86a67 100644 --- a/README.md +++ b/README.md @@ -18,74 +18,22 @@ For many reasons we don't save any seed to restore the wallet, and having an up # Backup LND data LND data is stored permanently in a docker volume, but it is recommended to save it apart in case of an update or migration. -Follow this steps: -``` -docker run --rm --volumes-from DAppNodePackage-lightning-network.dnp.dappnode.eth -v $(pwd):/backup alpine tar cvzf /backup/backup_lnd.tar.gz /root/.lnd -``` -A file named `backup_lnd.tar.gz` will be created in your current path. - -To restore it, proceed as follows: -``` -docker run --rm --volumes-from DAppNodePackage-lightning-network.dnp.dappnode.eth -v $(pwd):/backup alpine sh -c "cd /root/.lnd && tar xvzf /backup/backup_lnd.tar.gz --strip 2" - -``` -then restart the package from the admin interface. - - -# Prerequisites - -- git - - Install [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) commandline tool. - -- docker - - Install [docker](https://docs.docker.com/engine/installation). The community edition (docker-ce) will work. In Linux make sure you grant permissions to the current user to use docker by adding current user to docker group, `sudo usermod -aG docker $USER`. Once you update the users group, exit from the current terminal and open a new one to make effect. - -- docker-compose - - Install [docker-compose](https://docs.docker.com/compose/install) - -**Note**: Make sure you can run `git`, `docker ps`, `docker-compose` without any issue and without sudo command. - - -## Building - -`docker-compose build` - -## Running - -### Start - -`docker-compose up -d` - -### View logs - -`docker-compose logs -f` - -### Stop +When you enter the LN package (under Packages/ My Packages) you will see a Backup tab -`docker-compose down` +

-## Environment variables +Hit the "Backup now" button and select where do you want to keep your backup file safe. A tar.xz file will be downloaded to the selected path. -You can edit the `docker-compose.yml` and add extra options, such a: +# Restore LND data -| name | default | -| ---- | ------- | -| RPCUSER | dappnode | -| RPCPASS | dappnode | -| BITCOIND_HOST | my.bitcoin.dnp.dappnode.eth | -| NETWORK | mainnet | -| ALIAS | | -| COLOR | | -| EXT_IP | | +If anything happens with youur LN node and you have your backup you can always restore it from the ADMIN UI. Just go to Packages / My Packages and select the LN package and the backup tab. Aside the backup button you will see a "Restore" button. -## License +Just hit the restore button and select your tar.xz backup file and confirm. -This project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details +

+After the backup file is uploaded your LN node is restored. # Using the LN package @@ -97,7 +45,7 @@ This project is licensed under the GNU General Public License v3.0 - see the [LI * You need to have the Bitcoin node package (without pruning) installed and fully synced for the package to work properly. You don't need to wait for the Bitcoin Core node to be fully synced to install the LN package, but it won't be functional until the node is synced. -* The private keys of your LN wallet are stored in your LN node data volume. **Please follow the guide about backups below in this document to prevent loss of funds. We don't offer a seed backup mechanism so this is the only way to recover your funds in case something goes wrong**. +* The private keys of your LN wallet are stored in your LN node data volume. **Please follow the guide about backups in this document to prevent loss of funds. We don't offer a seed backup mechanism so this is the only way to recover your funds in case something goes wrong**. * When installing LN in DAppNode there will be two sets of username/password: * One to connect to the Bitcoin node, RPCUSER and RPCPASS (make sure they are the same as the Bitcoin package) and @@ -106,7 +54,7 @@ This project is licensed under the GNU General Public License v3.0 - see the [LI * You can connect your favourite LN mobile wallet by opening a private channel with your node. -* When updating this package, volumes will not be affected. You can access an updated version of your LN node witbout risk of losing any funds. Do not remove the volume though, or you will lose the funds on your node if you have not followed ths instructions for backup. +* When updating this package, volumes will not be affected. You can access an updated version of your LN node witbout risk of losing any funds. Do not remove the volume though, or you will lose the funds on your node if you have not followed the backup instructions. ## Accessing the ADMIN UI @@ -118,7 +66,7 @@ Usually Lightning Network applications require files called *macaroons* for auth To download the admin macaroon, you should go to the Admin panel of DAppnode: -Packages -> lightning-network -> File manager +Packages -> My packages -> Lightning-Network -> File manager Then input in the "Download from DNP" field: @@ -149,5 +97,56 @@ Joule is an extension available for many browsers which lets you use your node t +# Prerequisites + +- git + + Install [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) commandline tool. + +- docker + + Install [docker](https://docs.docker.com/engine/installation). The community edition (docker-ce) will work. In Linux make sure you grant permissions to the current user to use docker by adding current user to docker group, `sudo usermod -aG docker $USER`. Once you update the users group, exit from the current terminal and open a new one to make effect. + +- docker-compose + + Install [docker-compose](https://docs.docker.com/compose/install) + +**Note**: Make sure you can run `git`, `docker ps`, `docker-compose` without any issue and without sudo command. + + +## Building + +`docker-compose build` + +## Running + +### Start + +`docker-compose up -d` + +### View logs + +`docker-compose logs -f` + +### Stop + +`docker-compose down` + +## Environment variables + +You can edit the `docker-compose.yml` and add extra options, such a: + +| name | default | +| ---- | ------- | +| RPCUSER | dappnode | +| RPCPASS | dappnode | +| BITCOIND_HOST | my.bitcoin.dnp.dappnode.eth | +| NETWORK | mainnet | +| ALIAS | | +| COLOR | | +| EXT_IP | | +## License + +This project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details From afb640d3fe350f906d1cd8f2766ac87143ebfd84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lex?= Date: Fri, 9 Aug 2019 19:13:12 +0200 Subject: [PATCH 16/40] Fix typo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9f86a67..4631391 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ Hit the "Backup now" button and select where do you want to keep your backup fil # Restore LND data -If anything happens with youur LN node and you have your backup you can always restore it from the ADMIN UI. Just go to Packages / My Packages and select the LN package and the backup tab. Aside the backup button you will see a "Restore" button. +If anything happens with your LN node and you have your backup you can always restore it from the ADMIN UI. Just go to Packages / My Packages and select the LN package and the backup tab. Aside the backup button you will see a "Restore" button. -Just hit the restore button and select your tar.xz backup file and confirm. +Just hit that sweet restore button, select your tar.xz backup file and confirm.

From 26acae2bfb2534a4c79d8c03d32c0cfdd7a3cca7 Mon Sep 17 00:00:00 2001 From: vdo Date: Fri, 22 Nov 2019 19:19:03 +0100 Subject: [PATCH 17/40] Bump versions, split backup --- build/Dockerfile | 6 +++--- build/src/scripts/start-rtl.sh | 3 +++ dappnode_package.json | 28 ++++++++++++++++++++++++---- docker-compose.yml | 4 ++++ 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/build/Dockerfile b/build/Dockerfile index 5052af8..2a45bab 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,7 +1,7 @@ FROM node:10.16.0-alpine as build -ENV LND_VERSION "v0.7.1-beta" -ENV RTL_TAG "v0.4.4" +ENV LND_VERSION "v0.8.1-beta" +ENV RTL_TAG "v0.5.4" RUN apk add --no-cache wget ca-certificates \ && wget https://github.com/lightningnetwork/lnd/releases/download/${LND_VERSION}/lnd-linux-amd64-${LND_VERSION}.tar.gz \ @@ -13,7 +13,7 @@ RUN apk add --no-cache wget ca-certificates \ RUN apk add --no-cache \ bash curl openssl supervisor git make g++ -RUN git clone -b $RTL_TAG https://github.com/ShahanaFarooqui/RTL.git /rtl +RUN git clone -b $RTL_TAG https://github.com/Ride-The-Lightning/RTL.git /rtl WORKDIR /rtl diff --git a/build/src/scripts/start-rtl.sh b/build/src/scripts/start-rtl.sh index b47bdae..f9c279c 100755 --- a/build/src/scripts/start-rtl.sh +++ b/build/src/scripts/start-rtl.sh @@ -1,6 +1,9 @@ #!/usr/bin/env bash set -e +# Create restore symlink +ln -s /rtl/backup /rtl/backup/restore + # Configure settings from env vars envsubst < "source_RTL.conf" > "RTL.conf" diff --git a/dappnode_package.json b/dappnode_package.json index fb83c70..02ee3a5 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -1,27 +1,39 @@ { "name": "lightning-network.dnp.dappnode.eth", +<<<<<<< HEAD "version": "0.1.1", "upstreamVersion": "v0.7.1-beta", +======= + "version": "0.1.2", + "upstreamVersion": "v0.8.1-beta", +>>>>>>> Bump versions, split backup "shortDescription": "Scalable, instant Bitcoin transactions", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that remove the risk of delegating custody of funds to trusted third parties. \n\n\n **Getting started** \n\n Go to the [Lightning Network DAppNode Package readme](https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme) to learn how to get started and safely backup your data.", "avatar": "/ipfs/QmYjbpLBEbPDoiJwTcWjhuHuL1Ax2HuArhXRF4Fi95HT6c", "type": "service", "image": { +<<<<<<< HEAD "path": "lightning-network.dnp.dappnode.eth_0.1.1.tar.xz", "hash": "/ipfs/QmXxbfGVFCjJxK3JHr5Cpi6kEWbDdd3gGb8aDPoWJr7Eud", "size": 95610466, +======= + "path": "lightning-network.dnp.dappnode.eth_0.1.2.tar.xz", + "hash": "/ipfs/QmSW5TRfcyQuZTv69UsUJ4jBGb3KkZENq9LrnZxU7jPStL", + "size": 99651400, +>>>>>>> Bump versions, split backup "ports": [ "9735:9735" ], "volumes": [ - "lndconfig_data:/root/.lnd/" + "lndconfig_data:/root/.lnd/", + "lndconfig_backup:/rtl/backup/" ], "restart": "always", "environment": [ "RTL_PASSWORD=changeme", "RPCUSER=dappnode", "RPCPASS=dappnode", - "BITCOIND_HOST=my.bitcoin.dnp.dappnode.eth", + "BITCOIND_HOST=bitcoin.dappnode", "NETWORK=mainnet", "ALIAS=", "COLOR=#5ACDC5", @@ -33,8 +45,16 @@ }, "backup": [ { - "name": "data", - "path": "/root/.lnd" + "name": "rtl-channel", + "path": "/rtl/backup/" + }, + { + "name": "lnd-channel", + "path": "/root/.lnd/data/chain/bitcoin/mainnet/channel.backup" + }, + { + "name": "wallet", + "path": "/root/.lnd/data/chain/bitcoin/mainnet/wallet.db" } ], "style": { diff --git a/docker-compose.yml b/docker-compose.yml index a9ab9d5..dfdb386 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,11 @@ version: '3.4' services: lightning-network.dnp.dappnode.eth: +<<<<<<< HEAD image: 'lightning-network.dnp.dappnode.eth:0.1.1' +======= + image: 'lightning-network.dnp.dappnode.eth:0.1.2' +>>>>>>> Bump versions, split backup build: ./build volumes: - 'lndconfig_data:/root/.lnd/' From 06097ff8a7788b3382564e36c7ee5e12c6dfa046 Mon Sep 17 00:00:00 2001 From: vdo Date: Fri, 22 Nov 2019 20:50:50 +0100 Subject: [PATCH 18/40] Check link --- build/src/scripts/start-rtl.sh | 4 +++- dappnode_package.json | 11 ----------- docker-compose.yml | 4 ---- 3 files changed, 3 insertions(+), 16 deletions(-) diff --git a/build/src/scripts/start-rtl.sh b/build/src/scripts/start-rtl.sh index f9c279c..225bec2 100755 --- a/build/src/scripts/start-rtl.sh +++ b/build/src/scripts/start-rtl.sh @@ -2,7 +2,9 @@ set -e # Create restore symlink -ln -s /rtl/backup /rtl/backup/restore +if [ ! -f /rtl/backup/restore ]; then + ln -s /rtl/backup /rtl/backup/restore +fi # Configure settings from env vars envsubst < "source_RTL.conf" > "RTL.conf" diff --git a/dappnode_package.json b/dappnode_package.json index 02ee3a5..d3b0f21 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -1,26 +1,15 @@ { "name": "lightning-network.dnp.dappnode.eth", -<<<<<<< HEAD - "version": "0.1.1", - "upstreamVersion": "v0.7.1-beta", -======= "version": "0.1.2", "upstreamVersion": "v0.8.1-beta", ->>>>>>> Bump versions, split backup "shortDescription": "Scalable, instant Bitcoin transactions", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that remove the risk of delegating custody of funds to trusted third parties. \n\n\n **Getting started** \n\n Go to the [Lightning Network DAppNode Package readme](https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme) to learn how to get started and safely backup your data.", "avatar": "/ipfs/QmYjbpLBEbPDoiJwTcWjhuHuL1Ax2HuArhXRF4Fi95HT6c", "type": "service", "image": { -<<<<<<< HEAD - "path": "lightning-network.dnp.dappnode.eth_0.1.1.tar.xz", - "hash": "/ipfs/QmXxbfGVFCjJxK3JHr5Cpi6kEWbDdd3gGb8aDPoWJr7Eud", - "size": 95610466, -======= "path": "lightning-network.dnp.dappnode.eth_0.1.2.tar.xz", "hash": "/ipfs/QmSW5TRfcyQuZTv69UsUJ4jBGb3KkZENq9LrnZxU7jPStL", "size": 99651400, ->>>>>>> Bump versions, split backup "ports": [ "9735:9735" ], diff --git a/docker-compose.yml b/docker-compose.yml index dfdb386..ace2b3d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,11 +1,7 @@ version: '3.4' services: lightning-network.dnp.dappnode.eth: -<<<<<<< HEAD - image: 'lightning-network.dnp.dappnode.eth:0.1.1' -======= image: 'lightning-network.dnp.dappnode.eth:0.1.2' ->>>>>>> Bump versions, split backup build: ./build volumes: - 'lndconfig_data:/root/.lnd/' From ba382e811f9c0262e392572b1c520aed39997749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Mon, 25 Nov 2019 17:53:04 +0100 Subject: [PATCH 19/40] Migrate to directory version --- dappnode_package.json | 24 ------------------------ docker-compose.yml | 5 ++++- 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/dappnode_package.json b/dappnode_package.json index d3b0f21..46ba497 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -4,31 +4,7 @@ "upstreamVersion": "v0.8.1-beta", "shortDescription": "Scalable, instant Bitcoin transactions", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that remove the risk of delegating custody of funds to trusted third parties. \n\n\n **Getting started** \n\n Go to the [Lightning Network DAppNode Package readme](https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme) to learn how to get started and safely backup your data.", - "avatar": "/ipfs/QmYjbpLBEbPDoiJwTcWjhuHuL1Ax2HuArhXRF4Fi95HT6c", "type": "service", - "image": { - "path": "lightning-network.dnp.dappnode.eth_0.1.2.tar.xz", - "hash": "/ipfs/QmSW5TRfcyQuZTv69UsUJ4jBGb3KkZENq9LrnZxU7jPStL", - "size": 99651400, - "ports": [ - "9735:9735" - ], - "volumes": [ - "lndconfig_data:/root/.lnd/", - "lndconfig_backup:/rtl/backup/" - ], - "restart": "always", - "environment": [ - "RTL_PASSWORD=changeme", - "RPCUSER=dappnode", - "RPCPASS=dappnode", - "BITCOIND_HOST=bitcoin.dappnode", - "NETWORK=mainnet", - "ALIAS=", - "COLOR=#5ACDC5", - "EXT_IP=" - ] - }, "dependencies": { "bitcoin.dnp.dappnode.eth": "latest" }, diff --git a/docker-compose.yml b/docker-compose.yml index ace2b3d..7bdf24b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,16 +5,19 @@ services: build: ./build volumes: - 'lndconfig_data:/root/.lnd/' + - 'lndconfig_backup:/rtl/backup/' ports: - '9735:9735' environment: - RTL_PASSWORD=changeme - RPCUSER=dappnode - RPCPASS=dappnode - - BITCOIND_HOST=my.bitcoin.dnp.dappnode.eth + - BITCOIND_HOST=bitcoin.dappnode - NETWORK=mainnet - ALIAS= - 'COLOR=#5ACDC5' - EXT_IP= + restart: always volumes: lndconfig_data: {} + lndconfig_backup: {} From e1af76d7b64221fd435b48ce34199035dfbe1a82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Mon, 25 Nov 2019 17:53:21 +0100 Subject: [PATCH 20/40] Added wizard --- setup-target.json | 6 ++++++ setup-ui.json | 6 ++++++ setup.schema.json | 12 ++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 setup-target.json create mode 100644 setup-ui.json create mode 100644 setup.schema.json diff --git a/setup-target.json b/setup-target.json new file mode 100644 index 0000000..f1b334d --- /dev/null +++ b/setup-target.json @@ -0,0 +1,6 @@ +{ + "rtl_password": { + "type": "environment", + "name": "RTL_PASSWORD" + } +} \ No newline at end of file diff --git a/setup-ui.json b/setup-ui.json new file mode 100644 index 0000000..98e0b05 --- /dev/null +++ b/setup-ui.json @@ -0,0 +1,6 @@ +{ + "ui:order": ["rtl_password"], + "rtl_password": { + "ui:widget": "password" + } +} diff --git a/setup.schema.json b/setup.schema.json new file mode 100644 index 0000000..e17cfdb --- /dev/null +++ b/setup.schema.json @@ -0,0 +1,12 @@ +{ + "description": "# Want to run Lightning Network on DAppNode?\n\nGreat! That's probably why you are here.\n\nThis wizard will help you to configure your node", + "type": "object", + "properties": { + "rtl_password": { + "type": "string", + "title": "Password", + "description": "Your password for Ride The Lightning Web UI" + } + }, + "required": ["rtl_password"] +} From 2a8d1a89a201dca4a8796ce7dd97028448ebe74b Mon Sep 17 00:00:00 2001 From: vdo Date: Tue, 26 Nov 2019 09:15:28 +0100 Subject: [PATCH 21/40] Add alias in wizard --- setup-target.json | 4 ++++ setup-ui.json | 5 ++++- setup.schema.json | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/setup-target.json b/setup-target.json index f1b334d..6ee08e4 100644 --- a/setup-target.json +++ b/setup-target.json @@ -2,5 +2,9 @@ "rtl_password": { "type": "environment", "name": "RTL_PASSWORD" + }, + "alias": { + "type": "environment", + "name": "ALIAS" } } \ No newline at end of file diff --git a/setup-ui.json b/setup-ui.json index 98e0b05..f35fb93 100644 --- a/setup-ui.json +++ b/setup-ui.json @@ -1,6 +1,9 @@ { - "ui:order": ["rtl_password"], + "ui:order": ["rtl_password","alias"], "rtl_password": { "ui:widget": "password" + }, + "alias": { + "ui:widget": "alias" } } diff --git a/setup.schema.json b/setup.schema.json index e17cfdb..ecd2aa2 100644 --- a/setup.schema.json +++ b/setup.schema.json @@ -6,6 +6,11 @@ "type": "string", "title": "Password", "description": "Your password for Ride The Lightning Web UI" + }, + "alias": { + "type": "string", + "title": "Alias", + "description": "Alias name for your node (will be public)" } }, "required": ["rtl_password"] From cdd9379f70e5bd566e32e250b6736dfe2faf9c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Tue, 26 Nov 2019 09:32:43 +0100 Subject: [PATCH 22/40] unnecessary field is removed --- setup-ui.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/setup-ui.json b/setup-ui.json index f35fb93..7d0dd3b 100644 --- a/setup-ui.json +++ b/setup-ui.json @@ -2,8 +2,5 @@ "ui:order": ["rtl_password","alias"], "rtl_password": { "ui:widget": "password" - }, - "alias": { - "ui:widget": "alias" } } From 0c40b17b5e90edd91acbacd180d51b46a8cfede9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Tue, 26 Nov 2019 10:18:24 +0100 Subject: [PATCH 23/40] Fix symbolic link check --- build/src/scripts/start-rtl.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/src/scripts/start-rtl.sh b/build/src/scripts/start-rtl.sh index 225bec2..6976abd 100755 --- a/build/src/scripts/start-rtl.sh +++ b/build/src/scripts/start-rtl.sh @@ -2,7 +2,7 @@ set -e # Create restore symlink -if [ ! -f /rtl/backup/restore ]; then +if [ ! -L /rtl/backup/restore ]; then ln -s /rtl/backup /rtl/backup/restore fi From 6efbe8edb99fe0e41c348689111a1a05d39c2fe8 Mon Sep 17 00:00:00 2001 From: Pablo Date: Mon, 7 Dec 2020 13:00:35 +0100 Subject: [PATCH 24/40] added templates and codeowners --- .github/ISSUE_TEMPLATE/bug_report.md | 42 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 26 ++++++++++++++ .github/workflows/CODEOWNERS | 7 ++++ 3 files changed, 75 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/CODEOWNERS diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..a765d82 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,42 @@ +--- +name: Bug report +about: Create a report to help us improve +title: +labels: +assignees: +--- + + + + +**Describe the bug** + + + +**To Reproduce** + + + +**Expected behavior** + + + +**Screenshots** + + + +**DAppNode version:** + + + +- Package version: +- OS: +- Browser + +**Additional context** + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..11bbebf --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,26 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "" +labels: "" +assignees: "" +--- + + + + +**Is your feature request related to a problem? Please describe.** + + + +**Describe the solution you'd like** + + + +**Describe alternatives you've considered** + + + +**Additional context** + + diff --git a/.github/workflows/CODEOWNERS b/.github/workflows/CODEOWNERS new file mode 100644 index 0000000..3d8973b --- /dev/null +++ b/.github/workflows/CODEOWNERS @@ -0,0 +1,7 @@ +# These owners will be the default owners for everything in the repo. Unless a later match takes precedence, +# They will be requested for review when someone opens a pull request. +* @dapplion @eduadiez @pablomendezroyo + +# Order is important; the last matching pattern takes the most precedence. When someone opens a pull request that only +# modifies md files, only md owners and not the global owner(s) will be requested for a review. +*.md @Pol-Lanski @dapplion @eduadiez @pablomendezroyo \ No newline at end of file From 38af59931678d7eb57d3afb2418af817328e2e31 Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 5 Dec 2021 12:22:50 -0800 Subject: [PATCH 25/40] update lnd version, increment dnp minor version --- build/Dockerfile | 4 ++-- dappnode_package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/Dockerfile b/build/Dockerfile index 2a45bab..bc6e0d0 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,7 +1,7 @@ FROM node:10.16.0-alpine as build -ENV LND_VERSION "v0.8.1-beta" -ENV RTL_TAG "v0.5.4" +ENV LND_VERSION "v0.14.1-beta" +ENV RTL_TAG "v0.11.2" RUN apk add --no-cache wget ca-certificates \ && wget https://github.com/lightningnetwork/lnd/releases/download/${LND_VERSION}/lnd-linux-amd64-${LND_VERSION}.tar.gz \ diff --git a/dappnode_package.json b/dappnode_package.json index 46ba497..a4d7cee 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -1,7 +1,7 @@ { "name": "lightning-network.dnp.dappnode.eth", - "version": "0.1.2", - "upstreamVersion": "v0.8.1-beta", + "version": "0.3.0", + "upstreamVersion": "v0.11.2-beta", "shortDescription": "Scalable, instant Bitcoin transactions", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that remove the risk of delegating custody of funds to trusted third parties. \n\n\n **Getting started** \n\n Go to the [Lightning Network DAppNode Package readme](https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme) to learn how to get started and safely backup your data.", "type": "service", From e8fabe91c02271b8e1f3d385eadf30862d7aa914 Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 5 Dec 2021 12:23:17 -0800 Subject: [PATCH 26/40] dappnodesdk induced docker-compose format changes --- docker-compose.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 7bdf24b..fb018af 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,13 +1,13 @@ -version: '3.4' +version: "3.4" services: lightning-network.dnp.dappnode.eth: - image: 'lightning-network.dnp.dappnode.eth:0.1.2' + image: "lightning-network.dnp.dappnode.eth:0.3.0" build: ./build volumes: - - 'lndconfig_data:/root/.lnd/' - - 'lndconfig_backup:/rtl/backup/' + - "lndconfig_data:/root/.lnd/" + - "lndconfig_backup:/rtl/backup/" ports: - - '9735:9735' + - "9735:9735" environment: - RTL_PASSWORD=changeme - RPCUSER=dappnode @@ -15,7 +15,7 @@ services: - BITCOIND_HOST=bitcoin.dappnode - NETWORK=mainnet - ALIAS= - - 'COLOR=#5ACDC5' + - COLOR=#5ACDC5 - EXT_IP= restart: always volumes: From b9227b7a1aba9d403bf8995dbfb435742b8ec3f9 Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 5 Dec 2021 12:25:02 -0800 Subject: [PATCH 27/40] fix lnd version --- dappnode_package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dappnode_package.json b/dappnode_package.json index a4d7cee..0bcb4d2 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -1,7 +1,7 @@ { "name": "lightning-network.dnp.dappnode.eth", "version": "0.3.0", - "upstreamVersion": "v0.11.2-beta", + "upstreamVersion": "v0.14.1-beta", "shortDescription": "Scalable, instant Bitcoin transactions", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that remove the risk of delegating custody of funds to trusted third parties. \n\n\n **Getting started** \n\n Go to the [Lightning Network DAppNode Package readme](https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme) to learn how to get started and safely backup your data.", "type": "service", From 936589c0bc41f4c9f16c58cbc3f6b7a5fd3e1d51 Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 23 Jan 2022 12:05:19 -0800 Subject: [PATCH 28/40] update rtl tag to v0.12.0 --- build/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile b/build/Dockerfile index bc6e0d0..d3607cf 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,7 +1,7 @@ FROM node:10.16.0-alpine as build ENV LND_VERSION "v0.14.1-beta" -ENV RTL_TAG "v0.11.2" +ENV RTL_TAG "v0.12.0" RUN apk add --no-cache wget ca-certificates \ && wget https://github.com/lightningnetwork/lnd/releases/download/${LND_VERSION}/lnd-linux-amd64-${LND_VERSION}.tar.gz \ From d130d30f4880849b8cfa41fb816794378735c063 Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 23 Jan 2022 12:06:46 -0800 Subject: [PATCH 29/40] update rtl tag to v0.12.1 --- build/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Dockerfile b/build/Dockerfile index d3607cf..b65543b 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,7 +1,7 @@ FROM node:10.16.0-alpine as build ENV LND_VERSION "v0.14.1-beta" -ENV RTL_TAG "v0.12.0" +ENV RTL_TAG "v0.12.1" RUN apk add --no-cache wget ca-certificates \ && wget https://github.com/lightningnetwork/lnd/releases/download/${LND_VERSION}/lnd-linux-amd64-${LND_VERSION}.tar.gz \ From 82f4bdf57702515baa5dfd2e29764781cb69409d Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 23 Jan 2022 12:07:08 -0800 Subject: [PATCH 30/40] update/fix name of password envvar --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index fb018af..24e10ad 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,7 @@ services: ports: - "9735:9735" environment: - - RTL_PASSWORD=changeme + - APP_PASSWORD=changeme - RPCUSER=dappnode - RPCPASS=dappnode - BITCOIND_HOST=bitcoin.dappnode From 241ecb6bf70ff29c9ded6950ae7cc61093ee3ad4 Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 23 Jan 2022 14:33:26 -0800 Subject: [PATCH 31/40] fix rtl password envvar --- setup-target.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup-target.json b/setup-target.json index 6ee08e4..bf32bb6 100644 --- a/setup-target.json +++ b/setup-target.json @@ -1,7 +1,7 @@ { "rtl_password": { "type": "environment", - "name": "RTL_PASSWORD" + "name": "APP_PASSWORD" }, "alias": { "type": "environment", From 3f06479f5d93671c63ca9630a82671ab9578a9ae Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 23 Jan 2022 14:34:05 -0800 Subject: [PATCH 32/40] use exec --- build/src/scripts/start-rtl.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/src/scripts/start-rtl.sh b/build/src/scripts/start-rtl.sh index 6976abd..5a29c8d 100755 --- a/build/src/scripts/start-rtl.sh +++ b/build/src/scripts/start-rtl.sh @@ -9,4 +9,4 @@ fi # Configure settings from env vars envsubst < "source_RTL.conf" > "RTL.conf" -node rtl \ No newline at end of file +exec node rtl From 0daa91a9c551e24199ceb570a9040e0bd96c90c8 Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 23 Jan 2022 14:34:18 -0800 Subject: [PATCH 33/40] fix newlines --- dappnode_package.json | 2 +- setup-target.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dappnode_package.json b/dappnode_package.json index 0bcb4d2..8f4aff8 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -57,4 +57,4 @@ "message": "This software is experimental, presented 'as is' and inherently carries risks. By installing it, you acknowledge that DAppNode Association has done its best to mitigate these risks and accept to waive any liability or responsibility for DAppNode in case of any shortage, discrepancy, damage, loss or destruction of any digital asset managed within this DAppNode package.\n\nThis package stores private keys, which will be stored in your DAppNode. Neither DAppNode Association nor the developers of this software can have access to your private key, nor help you recover it if you lose it. \n\nYou are solely responsible for keeping your private keys and password safe and to perform secure backups, as well as to restrict access to your computer and other equipment. To the extent permitted by applicable law, you agree to be responsible for all activities that have been conducted from your account. You must take all necessary steps to ensure that your private key, password, and/or recovery phrase remain confidential and secured." }, "license": "GPL-3.0" -} \ No newline at end of file +} diff --git a/setup-target.json b/setup-target.json index bf32bb6..873adb6 100644 --- a/setup-target.json +++ b/setup-target.json @@ -7,4 +7,4 @@ "type": "environment", "name": "ALIAS" } -} \ No newline at end of file +} From 79225120cd43eb72d8f8e38dbac0ea32f7661f96 Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 23 Jan 2022 14:40:04 -0800 Subject: [PATCH 34/40] also set RTL-Config.json file --- build/Dockerfile | 2 +- build/src/config/source_RTL-Config.json | 30 +++++++++++++++++++++++++ build/src/scripts/start-rtl.sh | 2 ++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 build/src/config/source_RTL-Config.json diff --git a/build/Dockerfile b/build/Dockerfile index b65543b..19fee66 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -35,7 +35,7 @@ COPY --from=build /bin/lncli /bin/lncli COPY src/scripts/start-lnd.sh / COPY src/scripts/start-rtl.sh /rtl -COPY src/config/source_RTL.conf /rtl +COPY src/config/source_RTL-Config.json /rtl RUN ln -s /root/.lnd /config diff --git a/build/src/config/source_RTL-Config.json b/build/src/config/source_RTL-Config.json new file mode 100644 index 0000000..d3dbebd --- /dev/null +++ b/build/src/config/source_RTL-Config.json @@ -0,0 +1,30 @@ +{ + "port": "80", + "defaultNodeIndex": 1, + "SSO": { + "rtlSSO": 0, + "rtlCookiePath": "", + "logoutRedirectLink": "" + }, + "nodes": [ + { + "index": 1, + "lnNode": "Node 1", + "lnImplementation": "LND", + "Authentication": { + "macaroonPath": "/root/.lnd/data/chain/bitcoin/mainnet", + "configPath": "/root/.lnd/lnd.conf" + }, + "Settings": { + "userPersona": "MERCHANT", + "themeMode": "DAY", + "themeColor": "COLOR", + "channelBackupPath": "/root/backup/node-1", + "logLevel": "ERROR", + "lnServerUrl": "https://localhost:8080", + "fiatConversion": false + } + } + ], + "multiPassHashed": "" +} diff --git a/build/src/scripts/start-rtl.sh b/build/src/scripts/start-rtl.sh index 5a29c8d..d34f4e7 100755 --- a/build/src/scripts/start-rtl.sh +++ b/build/src/scripts/start-rtl.sh @@ -7,6 +7,8 @@ if [ ! -L /rtl/backup/restore ]; then fi # Configure settings from env vars +envsubst < "source_RTL-Config.json" > "RTL-Config.json" + envsubst < "source_RTL.conf" > "RTL.conf" exec node rtl From 059522338cdb55425022ce6888c71156f1e96370 Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 23 Jan 2022 19:34:44 -0800 Subject: [PATCH 35/40] add source_RTL.conf to docker image --- build/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/build/Dockerfile b/build/Dockerfile index 19fee66..f5f138e 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -35,6 +35,7 @@ COPY --from=build /bin/lncli /bin/lncli COPY src/scripts/start-lnd.sh / COPY src/scripts/start-rtl.sh /rtl +COPY src/config/source_RTL.conf /rtl COPY src/config/source_RTL-Config.json /rtl RUN ln -s /root/.lnd /config From bc0d31f7aed2823bd7847aa644aa7899e2705b17 Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 23 Jan 2022 19:35:12 -0800 Subject: [PATCH 36/40] set default mode + theme --- build/src/config/source_RTL-Config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/src/config/source_RTL-Config.json b/build/src/config/source_RTL-Config.json index d3dbebd..9eaa339 100644 --- a/build/src/config/source_RTL-Config.json +++ b/build/src/config/source_RTL-Config.json @@ -17,8 +17,8 @@ }, "Settings": { "userPersona": "MERCHANT", - "themeMode": "DAY", - "themeColor": "COLOR", + "themeMode": "NIGHT", + "themeColor": "TEAL", "channelBackupPath": "/root/backup/node-1", "logLevel": "ERROR", "lnServerUrl": "https://localhost:8080", From 34be68d02dc2b8b3c82d03e78beb1622443de5cc Mon Sep 17 00:00:00 2001 From: Leibniz137 Date: Sun, 23 Jan 2022 19:35:23 -0800 Subject: [PATCH 37/40] increment version to 0.4.4 --- dappnode_package.json | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dappnode_package.json b/dappnode_package.json index 8f4aff8..d372366 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -1,6 +1,6 @@ { "name": "lightning-network.dnp.dappnode.eth", - "version": "0.3.0", + "version": "0.4.4", "upstreamVersion": "v0.14.1-beta", "shortDescription": "Scalable, instant Bitcoin transactions", "description": "The Lightning Network DAppNodePackage (lnd + RTL). The Lightning Network is a decentralized system for instant, high-volume micropayments that remove the risk of delegating custody of funds to trusted third parties. \n\n\n **Getting started** \n\n Go to the [Lightning Network DAppNode Package readme](https://github.com/dappnode/DAppNodePackage-LightningNetwork#readme) to learn how to get started and safely backup your data.", diff --git a/docker-compose.yml b/docker-compose.yml index 24e10ad..e183cc3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: "3.4" services: lightning-network.dnp.dappnode.eth: - image: "lightning-network.dnp.dappnode.eth:0.3.0" + image: "lightning-network.dnp.dappnode.eth:0.4.4" build: ./build volumes: - "lndconfig_data:/root/.lnd/" From bfd520a9b97d04640aa90e6f102a1e95aa2418b0 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Wed, 18 May 2022 17:38:48 +0700 Subject: [PATCH 38/40] move build to src --- src/Dockerfile | 48 +++++++++++ {build => src/build}/Dockerfile | 0 .../build}/src/config/source_RTL-Config.json | 0 .../build}/src/config/source_RTL.conf | 0 .../build}/src/config/supervisord.conf | 0 {build => src/build}/src/scripts/start-lnd.sh | 0 {build => src/build}/src/scripts/start-rtl.sh | 0 src/src/config/source_RTL.conf | 21 +++++ src/src/config/supervisord.conf | 33 ++++++++ src/src/scripts/start-lnd.sh | 84 +++++++++++++++++++ src/src/scripts/start-rtl.sh | 7 ++ 11 files changed, 193 insertions(+) create mode 100644 src/Dockerfile rename {build => src/build}/Dockerfile (100%) rename {build => src/build}/src/config/source_RTL-Config.json (100%) rename {build => src/build}/src/config/source_RTL.conf (100%) rename {build => src/build}/src/config/supervisord.conf (100%) rename {build => src/build}/src/scripts/start-lnd.sh (100%) rename {build => src/build}/src/scripts/start-rtl.sh (100%) create mode 100644 src/src/config/source_RTL.conf create mode 100644 src/src/config/supervisord.conf create mode 100755 src/src/scripts/start-lnd.sh create mode 100755 src/src/scripts/start-rtl.sh diff --git a/src/Dockerfile b/src/Dockerfile new file mode 100644 index 0000000..5052af8 --- /dev/null +++ b/src/Dockerfile @@ -0,0 +1,48 @@ +FROM node:10.16.0-alpine as build + +ENV LND_VERSION "v0.7.1-beta" +ENV RTL_TAG "v0.4.4" + +RUN apk add --no-cache wget ca-certificates \ + && wget https://github.com/lightningnetwork/lnd/releases/download/${LND_VERSION}/lnd-linux-amd64-${LND_VERSION}.tar.gz \ + && tar --strip-components 1 -xzf lnd-linux-amd64-${LND_VERSION}.tar.gz -C /bin/ \ + && rm lnd-linux-amd64-${LND_VERSION}.tar.gz \ + && apk del wget ca-certificates + +# Add build requirements +RUN apk add --no-cache \ + bash curl openssl supervisor git make g++ + +RUN git clone -b $RTL_TAG https://github.com/ShahanaFarooqui/RTL.git /rtl + +WORKDIR /rtl + +RUN npm install +RUN rm -rf ./node_modules/* && npm install --only=production && npm install @types/node + +FROM alpine + +WORKDIR /rtl + +ENV CHANNEL_BACKUP_PATH /root/.lnd + +# Add requirements +RUN apk add --no-cache supervisor bash curl nodejs openssl gettext + +COPY --from=build /rtl /rtl +COPY --from=build /bin/lnd /bin/lnd +COPY --from=build /bin/lncli /bin/lncli + +COPY src/scripts/start-lnd.sh / +COPY src/scripts/start-rtl.sh /rtl +COPY src/config/source_RTL.conf /rtl + +RUN ln -s /root/.lnd /config + +RUN mkdir -p /var/log/supervisor +COPY src/config/supervisord.conf / + +# Expose lnd ports (server, rpc). +EXPOSE 9735 10009 80 + +CMD ["supervisord","-c","/supervisord.conf"] diff --git a/build/Dockerfile b/src/build/Dockerfile similarity index 100% rename from build/Dockerfile rename to src/build/Dockerfile diff --git a/build/src/config/source_RTL-Config.json b/src/build/src/config/source_RTL-Config.json similarity index 100% rename from build/src/config/source_RTL-Config.json rename to src/build/src/config/source_RTL-Config.json diff --git a/build/src/config/source_RTL.conf b/src/build/src/config/source_RTL.conf similarity index 100% rename from build/src/config/source_RTL.conf rename to src/build/src/config/source_RTL.conf diff --git a/build/src/config/supervisord.conf b/src/build/src/config/supervisord.conf similarity index 100% rename from build/src/config/supervisord.conf rename to src/build/src/config/supervisord.conf diff --git a/build/src/scripts/start-lnd.sh b/src/build/src/scripts/start-lnd.sh similarity index 100% rename from build/src/scripts/start-lnd.sh rename to src/build/src/scripts/start-lnd.sh diff --git a/build/src/scripts/start-rtl.sh b/src/build/src/scripts/start-rtl.sh similarity index 100% rename from build/src/scripts/start-rtl.sh rename to src/build/src/scripts/start-rtl.sh diff --git a/src/src/config/source_RTL.conf b/src/src/config/source_RTL.conf new file mode 100644 index 0000000..d7922aa --- /dev/null +++ b/src/src/config/source_RTL.conf @@ -0,0 +1,21 @@ +[Authentication] +enableLogging=true +macaroonPath=/config/ +nodeAuthType=CUSTOM +rtlPass=$RTL_PASSWORD + +[Settings] +flgSidenavOpened=true +flgSidenavPinned=true +menu=Vertical +menuType=Regular +theme=light-teal +satsToBTC=false +lndServerUrl=https://localhost:8080/v1 +enableLogging=true +port=80 + +[SSO] +rtlSSO=0 +rtlCookiePath= +logoutRedirectLink=/login diff --git a/src/src/config/supervisord.conf b/src/src/config/supervisord.conf new file mode 100644 index 0000000..e4f915f --- /dev/null +++ b/src/src/config/supervisord.conf @@ -0,0 +1,33 @@ +[supervisord] +nodaemon=true +user=root + +[unix_http_server] +file=/var/run/supervisor.sock +username=dummy +password=dummy + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///var/run/supervisor.sock +username=dummy +password=dummy + +[program:lnd] +command=bash -c '/start-lnd.sh' +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +startretries=10 + +[program:rtl] +command=bash -c '/rtl/start-rtl.sh' +directory=/rtl +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +startretries=10 diff --git a/src/src/scripts/start-lnd.sh b/src/src/scripts/start-lnd.sh new file mode 100755 index 0000000..368c60f --- /dev/null +++ b/src/src/scripts/start-lnd.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash + +# exit from script if error was raised. +set -e + +# error function is used within a bash function in order to send the error +# message directly to the stderr output and exit. +error() { + echo "$1" > /dev/stderr + exit 0 +} + +# return is used within bash function in order to return the value. +return() { + echo "$1" +} + +# set_default function gives the ability to move the setting of default +# env variable from docker file to the script thereby giving the ability to the +# user override it durin container start. +set_default() { + # docker initialized env variables with blank string and we can't just + # use -z flag as usually. + BLANK_STRING='""' + + VARIABLE="$1" + DEFAULT="$2" + + if [[ -z "$VARIABLE" || "$VARIABLE" == "$BLANK_STRING" ]]; then + + if [ -z "$DEFAULT" ]; then + error "You should specify default variable" + else + VARIABLE="$DEFAULT" + fi + fi + + return "$VARIABLE" +} + +# Generate P-256 curve certificates needed for lncli-web +if [ ! -f /$HOME/.lnd/tls.key ]; then + openssl ecparam -genkey -name prime256v1 -out tls.key + openssl req -new -sha256 -key tls.key -out csr.csr -subj '/CN=localhost/O=lnd' + openssl req -x509 -sha256 -days 36500 -key tls.key -in csr.csr -out tls.cert + rm csr.csr +fi + +if [ -z $EXT_IP ]; then + EXT_IP=$(curl -4s ident.me) +fi + +# Set default variables if needed. +BITCOIND_HOST=$(set_default "$BITCOIND_HOST" "127.0.0.1") +RPCUSER=$(set_default "$RPCUSER" "rpcuser") +RPCPASS=$(set_default "$RPCPASS" "rpcpass") +DEBUG=$(set_default "$DEBUG" "debug") +NETWORK=$(set_default "$NETWORK" "testnet") +CHAIN=$(set_default "$CHAIN" "bitcoin") +BACKEND="bitcoind" + +# Symlink for lncli-web +if [ ! -f /$HOME/.lnd/admin.macaroon ]; then + mkdir -p /$HOME/.lnd/data/chain/$CHAIN/$NETWORK/ + ln -s /$HOME/.lnd/admin.macaroon /$HOME/.lnd/data/chain/$CHAIN/$NETWORK/admin.macaroon +fi + +exec lnd \ +--noseedbackup \ +--logdir="/data" \ +"--$CHAIN.active" \ +"--$CHAIN.$NETWORK" \ +"--$CHAIN.node=bitcoind" \ +"--$BACKEND.rpchost=$BITCOIND_HOST" \ +"--$BACKEND.rpcuser=$RPCUSER" \ +"--$BACKEND.rpcpass=$RPCPASS" \ +"--$BACKEND.zmqpubrawblock=tcp://$BITCOIND_HOST:28332" \ +"--bitcoind.zmqpubrawtx=tcp://$BITCOIND_HOST:28333" \ +"--externalip=$EXT_IP" \ +"--alias=$ALIAS" \ +"--color=$COLOR" \ +"--restlisten=0.0.0.0:8080" \ +--debuglevel="$DEBUG" \ +"$@" diff --git a/src/src/scripts/start-rtl.sh b/src/src/scripts/start-rtl.sh new file mode 100755 index 0000000..b47bdae --- /dev/null +++ b/src/src/scripts/start-rtl.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -e + +# Configure settings from env vars +envsubst < "source_RTL.conf" > "RTL.conf" + +node rtl \ No newline at end of file From a51457c3cfa7468f696ef3b79f203b2c1f284b8f Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Thu, 19 May 2022 00:28:24 +0700 Subject: [PATCH 39/40] Add src to docker-compose --- .gitignore | 3 +- docker-compose.yml | 2 +- src/Dockerfile | 8 +- src/build/Dockerfile | 49 ------------ src/build/src/config/source_RTL-Config.json | 30 -------- src/build/src/scripts/start-rtl.sh | 14 ---- src/{build/src => }/config/source_RTL.conf | 0 src/{build/src => }/config/supervisord.conf | 0 src/{build/src => }/scripts/start-lnd.sh | 0 src/{src => }/scripts/start-rtl.sh | 0 src/src/config/source_RTL.conf | 21 ------ src/src/config/supervisord.conf | 33 -------- src/src/scripts/start-lnd.sh | 84 --------------------- 13 files changed, 7 insertions(+), 237 deletions(-) delete mode 100644 src/build/Dockerfile delete mode 100644 src/build/src/config/source_RTL-Config.json delete mode 100755 src/build/src/scripts/start-rtl.sh rename src/{build/src => }/config/source_RTL.conf (100%) rename src/{build/src => }/config/supervisord.conf (100%) rename src/{build/src => }/scripts/start-lnd.sh (100%) rename src/{src => }/scripts/start-rtl.sh (100%) delete mode 100644 src/src/config/source_RTL.conf delete mode 100644 src/src/config/supervisord.conf delete mode 100755 src/src/scripts/start-lnd.sh diff --git a/.gitignore b/.gitignore index cc73833..874d8d1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.tar.xz -build_* \ No newline at end of file +build_* +build \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index e183cc3..f92f40f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.4" services: lightning-network.dnp.dappnode.eth: image: "lightning-network.dnp.dappnode.eth:0.4.4" - build: ./build + build: ./src volumes: - "lndconfig_data:/root/.lnd/" - "lndconfig_backup:/rtl/backup/" diff --git a/src/Dockerfile b/src/Dockerfile index 5052af8..d4a55b5 100644 --- a/src/Dockerfile +++ b/src/Dockerfile @@ -33,14 +33,14 @@ COPY --from=build /rtl /rtl COPY --from=build /bin/lnd /bin/lnd COPY --from=build /bin/lncli /bin/lncli -COPY src/scripts/start-lnd.sh / -COPY src/scripts/start-rtl.sh /rtl -COPY src/config/source_RTL.conf /rtl +COPY scripts/start-lnd.sh / +COPY scripts/start-rtl.sh /rtl +COPY config/source_RTL.conf /rtl RUN ln -s /root/.lnd /config RUN mkdir -p /var/log/supervisor -COPY src/config/supervisord.conf / +COPY config/supervisord.conf / # Expose lnd ports (server, rpc). EXPOSE 9735 10009 80 diff --git a/src/build/Dockerfile b/src/build/Dockerfile deleted file mode 100644 index f5f138e..0000000 --- a/src/build/Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -FROM node:10.16.0-alpine as build - -ENV LND_VERSION "v0.14.1-beta" -ENV RTL_TAG "v0.12.1" - -RUN apk add --no-cache wget ca-certificates \ - && wget https://github.com/lightningnetwork/lnd/releases/download/${LND_VERSION}/lnd-linux-amd64-${LND_VERSION}.tar.gz \ - && tar --strip-components 1 -xzf lnd-linux-amd64-${LND_VERSION}.tar.gz -C /bin/ \ - && rm lnd-linux-amd64-${LND_VERSION}.tar.gz \ - && apk del wget ca-certificates - -# Add build requirements -RUN apk add --no-cache \ - bash curl openssl supervisor git make g++ - -RUN git clone -b $RTL_TAG https://github.com/Ride-The-Lightning/RTL.git /rtl - -WORKDIR /rtl - -RUN npm install -RUN rm -rf ./node_modules/* && npm install --only=production && npm install @types/node - -FROM alpine - -WORKDIR /rtl - -ENV CHANNEL_BACKUP_PATH /root/.lnd - -# Add requirements -RUN apk add --no-cache supervisor bash curl nodejs openssl gettext - -COPY --from=build /rtl /rtl -COPY --from=build /bin/lnd /bin/lnd -COPY --from=build /bin/lncli /bin/lncli - -COPY src/scripts/start-lnd.sh / -COPY src/scripts/start-rtl.sh /rtl -COPY src/config/source_RTL.conf /rtl -COPY src/config/source_RTL-Config.json /rtl - -RUN ln -s /root/.lnd /config - -RUN mkdir -p /var/log/supervisor -COPY src/config/supervisord.conf / - -# Expose lnd ports (server, rpc). -EXPOSE 9735 10009 80 - -CMD ["supervisord","-c","/supervisord.conf"] diff --git a/src/build/src/config/source_RTL-Config.json b/src/build/src/config/source_RTL-Config.json deleted file mode 100644 index 9eaa339..0000000 --- a/src/build/src/config/source_RTL-Config.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "port": "80", - "defaultNodeIndex": 1, - "SSO": { - "rtlSSO": 0, - "rtlCookiePath": "", - "logoutRedirectLink": "" - }, - "nodes": [ - { - "index": 1, - "lnNode": "Node 1", - "lnImplementation": "LND", - "Authentication": { - "macaroonPath": "/root/.lnd/data/chain/bitcoin/mainnet", - "configPath": "/root/.lnd/lnd.conf" - }, - "Settings": { - "userPersona": "MERCHANT", - "themeMode": "NIGHT", - "themeColor": "TEAL", - "channelBackupPath": "/root/backup/node-1", - "logLevel": "ERROR", - "lnServerUrl": "https://localhost:8080", - "fiatConversion": false - } - } - ], - "multiPassHashed": "" -} diff --git a/src/build/src/scripts/start-rtl.sh b/src/build/src/scripts/start-rtl.sh deleted file mode 100755 index d34f4e7..0000000 --- a/src/build/src/scripts/start-rtl.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash -set -e - -# Create restore symlink -if [ ! -L /rtl/backup/restore ]; then - ln -s /rtl/backup /rtl/backup/restore -fi - -# Configure settings from env vars -envsubst < "source_RTL-Config.json" > "RTL-Config.json" - -envsubst < "source_RTL.conf" > "RTL.conf" - -exec node rtl diff --git a/src/build/src/config/source_RTL.conf b/src/config/source_RTL.conf similarity index 100% rename from src/build/src/config/source_RTL.conf rename to src/config/source_RTL.conf diff --git a/src/build/src/config/supervisord.conf b/src/config/supervisord.conf similarity index 100% rename from src/build/src/config/supervisord.conf rename to src/config/supervisord.conf diff --git a/src/build/src/scripts/start-lnd.sh b/src/scripts/start-lnd.sh similarity index 100% rename from src/build/src/scripts/start-lnd.sh rename to src/scripts/start-lnd.sh diff --git a/src/src/scripts/start-rtl.sh b/src/scripts/start-rtl.sh similarity index 100% rename from src/src/scripts/start-rtl.sh rename to src/scripts/start-rtl.sh diff --git a/src/src/config/source_RTL.conf b/src/src/config/source_RTL.conf deleted file mode 100644 index d7922aa..0000000 --- a/src/src/config/source_RTL.conf +++ /dev/null @@ -1,21 +0,0 @@ -[Authentication] -enableLogging=true -macaroonPath=/config/ -nodeAuthType=CUSTOM -rtlPass=$RTL_PASSWORD - -[Settings] -flgSidenavOpened=true -flgSidenavPinned=true -menu=Vertical -menuType=Regular -theme=light-teal -satsToBTC=false -lndServerUrl=https://localhost:8080/v1 -enableLogging=true -port=80 - -[SSO] -rtlSSO=0 -rtlCookiePath= -logoutRedirectLink=/login diff --git a/src/src/config/supervisord.conf b/src/src/config/supervisord.conf deleted file mode 100644 index e4f915f..0000000 --- a/src/src/config/supervisord.conf +++ /dev/null @@ -1,33 +0,0 @@ -[supervisord] -nodaemon=true -user=root - -[unix_http_server] -file=/var/run/supervisor.sock -username=dummy -password=dummy - -[rpcinterface:supervisor] -supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface - -[supervisorctl] -serverurl=unix:///var/run/supervisor.sock -username=dummy -password=dummy - -[program:lnd] -command=bash -c '/start-lnd.sh' -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -startretries=10 - -[program:rtl] -command=bash -c '/rtl/start-rtl.sh' -directory=/rtl -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 -startretries=10 diff --git a/src/src/scripts/start-lnd.sh b/src/src/scripts/start-lnd.sh deleted file mode 100755 index 368c60f..0000000 --- a/src/src/scripts/start-lnd.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env bash - -# exit from script if error was raised. -set -e - -# error function is used within a bash function in order to send the error -# message directly to the stderr output and exit. -error() { - echo "$1" > /dev/stderr - exit 0 -} - -# return is used within bash function in order to return the value. -return() { - echo "$1" -} - -# set_default function gives the ability to move the setting of default -# env variable from docker file to the script thereby giving the ability to the -# user override it durin container start. -set_default() { - # docker initialized env variables with blank string and we can't just - # use -z flag as usually. - BLANK_STRING='""' - - VARIABLE="$1" - DEFAULT="$2" - - if [[ -z "$VARIABLE" || "$VARIABLE" == "$BLANK_STRING" ]]; then - - if [ -z "$DEFAULT" ]; then - error "You should specify default variable" - else - VARIABLE="$DEFAULT" - fi - fi - - return "$VARIABLE" -} - -# Generate P-256 curve certificates needed for lncli-web -if [ ! -f /$HOME/.lnd/tls.key ]; then - openssl ecparam -genkey -name prime256v1 -out tls.key - openssl req -new -sha256 -key tls.key -out csr.csr -subj '/CN=localhost/O=lnd' - openssl req -x509 -sha256 -days 36500 -key tls.key -in csr.csr -out tls.cert - rm csr.csr -fi - -if [ -z $EXT_IP ]; then - EXT_IP=$(curl -4s ident.me) -fi - -# Set default variables if needed. -BITCOIND_HOST=$(set_default "$BITCOIND_HOST" "127.0.0.1") -RPCUSER=$(set_default "$RPCUSER" "rpcuser") -RPCPASS=$(set_default "$RPCPASS" "rpcpass") -DEBUG=$(set_default "$DEBUG" "debug") -NETWORK=$(set_default "$NETWORK" "testnet") -CHAIN=$(set_default "$CHAIN" "bitcoin") -BACKEND="bitcoind" - -# Symlink for lncli-web -if [ ! -f /$HOME/.lnd/admin.macaroon ]; then - mkdir -p /$HOME/.lnd/data/chain/$CHAIN/$NETWORK/ - ln -s /$HOME/.lnd/admin.macaroon /$HOME/.lnd/data/chain/$CHAIN/$NETWORK/admin.macaroon -fi - -exec lnd \ ---noseedbackup \ ---logdir="/data" \ -"--$CHAIN.active" \ -"--$CHAIN.$NETWORK" \ -"--$CHAIN.node=bitcoind" \ -"--$BACKEND.rpchost=$BITCOIND_HOST" \ -"--$BACKEND.rpcuser=$RPCUSER" \ -"--$BACKEND.rpcpass=$RPCPASS" \ -"--$BACKEND.zmqpubrawblock=tcp://$BITCOIND_HOST:28332" \ -"--bitcoind.zmqpubrawtx=tcp://$BITCOIND_HOST:28333" \ -"--externalip=$EXT_IP" \ -"--alias=$ALIAS" \ -"--color=$COLOR" \ -"--restlisten=0.0.0.0:8080" \ ---debuglevel="$DEBUG" \ -"$@" From ff66bf0bc47cbeca3dd5a4c2f1661253a3cf7d97 Mon Sep 17 00:00:00 2001 From: dapplion <35266934+dapplion@users.noreply.github.com> Date: Thu, 19 May 2022 01:25:55 +0700 Subject: [PATCH 40/40] Remove unwanted changes --- src/Dockerfile | 7 ++++--- src/config/source_RTL-Config.json | 30 ++++++++++++++++++++++++++++++ src/scripts/start-rtl.sh | 9 ++++++++- 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/config/source_RTL-Config.json diff --git a/src/Dockerfile b/src/Dockerfile index d4a55b5..25d203d 100644 --- a/src/Dockerfile +++ b/src/Dockerfile @@ -1,7 +1,7 @@ FROM node:10.16.0-alpine as build -ENV LND_VERSION "v0.7.1-beta" -ENV RTL_TAG "v0.4.4" +ENV LND_VERSION "v0.14.1-beta" +ENV RTL_TAG "v0.12.1" RUN apk add --no-cache wget ca-certificates \ && wget https://github.com/lightningnetwork/lnd/releases/download/${LND_VERSION}/lnd-linux-amd64-${LND_VERSION}.tar.gz \ @@ -13,7 +13,7 @@ RUN apk add --no-cache wget ca-certificates \ RUN apk add --no-cache \ bash curl openssl supervisor git make g++ -RUN git clone -b $RTL_TAG https://github.com/ShahanaFarooqui/RTL.git /rtl +RUN git clone -b $RTL_TAG https://github.com/Ride-The-Lightning/RTL.git /rtl WORKDIR /rtl @@ -36,6 +36,7 @@ COPY --from=build /bin/lncli /bin/lncli COPY scripts/start-lnd.sh / COPY scripts/start-rtl.sh /rtl COPY config/source_RTL.conf /rtl +COPY config/source_RTL-Config.json /rtl RUN ln -s /root/.lnd /config diff --git a/src/config/source_RTL-Config.json b/src/config/source_RTL-Config.json new file mode 100644 index 0000000..9eaa339 --- /dev/null +++ b/src/config/source_RTL-Config.json @@ -0,0 +1,30 @@ +{ + "port": "80", + "defaultNodeIndex": 1, + "SSO": { + "rtlSSO": 0, + "rtlCookiePath": "", + "logoutRedirectLink": "" + }, + "nodes": [ + { + "index": 1, + "lnNode": "Node 1", + "lnImplementation": "LND", + "Authentication": { + "macaroonPath": "/root/.lnd/data/chain/bitcoin/mainnet", + "configPath": "/root/.lnd/lnd.conf" + }, + "Settings": { + "userPersona": "MERCHANT", + "themeMode": "NIGHT", + "themeColor": "TEAL", + "channelBackupPath": "/root/backup/node-1", + "logLevel": "ERROR", + "lnServerUrl": "https://localhost:8080", + "fiatConversion": false + } + } + ], + "multiPassHashed": "" +} diff --git a/src/scripts/start-rtl.sh b/src/scripts/start-rtl.sh index b47bdae..d34f4e7 100755 --- a/src/scripts/start-rtl.sh +++ b/src/scripts/start-rtl.sh @@ -1,7 +1,14 @@ #!/usr/bin/env bash set -e +# Create restore symlink +if [ ! -L /rtl/backup/restore ]; then + ln -s /rtl/backup /rtl/backup/restore +fi + # Configure settings from env vars +envsubst < "source_RTL-Config.json" > "RTL-Config.json" + envsubst < "source_RTL.conf" > "RTL.conf" -node rtl \ No newline at end of file +exec node rtl