Browse Source

Merge branch 'master' of github.com:getumbrel/umbrel-compose into partition-util

patch-1
nolim1t 5 years ago
parent
commit
e4b482236d
No known key found for this signature in database GPG Key ID: F6287B82CC84BCBD
  1. 49
      LICENSE
  2. 110
      README.md
  3. 11
      build/lnd-unlock/Dockerfile
  4. 57
      build/lnd-unlock/unlock.sh
  5. 0
      db/jwt-private-key/.gitkeep
  6. 0
      db/jwt-public-key/.gitkeep
  7. 45
      docker-compose.yml
  8. 19
      nginx/conf.d/default.conf

49
LICENSE

@ -1,36 +1,21 @@
This is free and unencumbered software released into the public domain.
The MIT License
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
Copyright (c) 2020 Umbrel. https://getumbrel.com
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
For more information, please refer to <https://unlicense.org>
#### ENDS LICENSE
### Add the below to any code (commented obviously)
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

110
README.md

@ -1,32 +1,76 @@
# Umbrel Compose System
[![Umbrel Compose](https://static.getumbrel.com/github/github-banner-umbrel-compose.svg)](https://github.com/getumbrel/umbrel-compose)
## Abstract
[![Version](https://img.shields.io/github/v/release/getumbrel/umbrel-compose?color=%235351FB&label=version)](https://github.com/getumbrel/umbrel-compose/releases)
[![Chat](https://img.shields.io/badge/chat%20on-telegram-%235351FB)](https://t.me/getumbrel)
This is a basic framework for orchestration of the box services for running a full lightning and bitcoin node.
[![Twitter](https://img.shields.io/twitter/follow/getumbrel?style=social)](https://twitter.com/getumbrel)
[![Reddit](https://img.shields.io/reddit/subreddit-subscribers/getumbrel?label=Subscribe%20%2Fr%2Fgetumbrel&style=social)](https://reddit.com/r/getumbrel)
## How to use
Ideally, you should create a user for this and then run it within the root of that user. There are some root privilege needed stuff, however LND doesn't support tor passwords yet so we will need to wait.
# ☂️ compose
### Step 1
Compose is a framework for orchestration of all containerized services running on [Umbrel OS](https://github.com/getumbrel/umbrel-os).
Ensure you have the [latest docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/) installed, python3 (for docker-compose), and docker-compose (installed from python3 pip).
It is platform and architecture-agnostic, thus can be used to directly spin up instances of Umbrel without installing the [Umbrel OS](https://github.com/getumbrel/umbrel-os) since all orchestrated services use multi-architecture images.
Ensure that you have the latest tor (currently working with 0.3.5.8), and you are using system default paths.
We run it on Raspbery Pis (ARMv7) as a part of [Umbrel OS](https://github.com/getumbrel/umbrel-os), Ubuntu (x64) for [testnet.getumbrel.com](https://testnet.getumbrel.com) and macOS (x64) for local development.
For the install script, you should also have git installed.
## 🚀 Getting started
For the configuration script you should also have wget.
If you are looking to run Umbrel on your hardware, you do not need to use this framework on it's own. Just download [Umbrel OS](https://github.com/getumbrel/umbrel-os/releases) and you're good to go.
These scripts all are able to run as non-interactive sessions.
## 🎹 Services orchestrated by Compose
### Step 2
- [`bitcoind`](https://github.com/getumbrel/docker-bitcoind)
- [`lnd`](https://github.com/getumbrel/docker-lnd)
- [`nginx`](https://github.com/nginx/nginx)
- [`umbrel-dashboard`](https://github.com/getumbrel/umbrel-dashboard)
- [`umbrel-manager`](https://github.com/getumbrel/umbrel-manager)
- [`umbrel-middleware`](https://github.com/getumbrel/umbrel-middleware)
Ensure that your account is permissioned for docker.
**Architecture**
### Step 3
```
+ -------------------- +
| umbrel-dashboard |
+ -------------------- +
|
|
+ ------------- +
| nginx |
+ ------------- +
|
|
+ - - - - - - - - - - - + - - - - - - - - - - - +
| |
| |
+ ------------------ + + --------------------- +
| umbrel-manager | < - - - jwt auth - - - | umbrel-middleware |
+ ------------------ + + --------------------- +
|
|
+ - - - - - - - - + - - - - - - - - +
| |
| |
+ ------------- + + ------------- +
| bitcoind | < - - - - - - - - | lnd |
+ ------------- + + ------------- +
```
## 🛠 Using Compose
### Requirements
- [Docker](https://docs.docker.com/engine/install)
- [Python 3.0+](https://www.python.org/downloads)
- [Docker Compose](https://docs.docker.com/compose/install/#install-using-pip) (installed via python3 pip)
- [Tor](https://2019.www.torproject.org/docs/debian.html.en) (using default system paths)
Ensure that your account is [correctly permissioned to use docker](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user).
### Step 1. Run this from your home directory (if installing on dedicated hardware)
Run this from your home directory. This clones this repo into your home directory, as well as preserving the existing structure.
> It will clone this repo while preserving home directory's existing structure.
```bash
# Ideally you should run this in $HOME as the docker-compose presets are in home
@ -37,33 +81,41 @@ curl "https://raw.githubusercontent.com/getumbrel/umbrel-compose/master/install-
wget -qO- "https://raw.githubusercontent.com/getumbrel/umbrel-compose/master/install-box.sh" | sh
```
### Configuring
### Step 2. Configure
```bash
# If you want to use testnet, otherwise we will use mainnet by default and be #reckless
# If you want to use testnet, otherwise it will use mainnet by default and be #reckless
export TESTNET=true
# testnet mode not supported as config is completely different
# (testnet mode not fully supported)
# Run this in the $HOME directory
wget -qO- "https://raw.githubusercontent.com/getumbrel/umbrel-compose/master/configure-box.sh" | sh
# or (should be in the $HOME directory after install)
./configure-box.sh
```
### Running
### Step 3. Run the services
```bash
# Build containers in build/ always
docker-compose up -d --build
# verify the containers
docker-compose up -d
# Verify the services
docker ps -a
# Additional node: You should have a way of creating a wallet. Currently this container does not have a create wallet container.
# For the unlock script to work, put the unlock password in secrets/lnd-password.txt
```
---
### ⚡️ Don't be too reckless
> Umbrel is still in early development and things are expected to break every now and then. We **DO NOT** recommend running it on the mainnet with real money just yet, unless you want to be really *#reckless*.
## ❤️ Contributing
We welcome and appreciate new contributions.
If you're a developer looking to help but not sure where to begin, check out [these issues](https://github.com/getumbrel/umbrel-dashboard/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) that have specifically been marked as being friendly to new contributors.
If you're looking for a bigger challenge, before opening a pull request please [create an issue](https://github.com/getumbrel/umbrel-dashboard/issues/new/choose) or [join our community chat](https://t.me/getumbrel) to get feedback, discuss the best way to tackle the challenge, and to ensure that there's no duplication of work.
## TODO List
---
Please see the [following tasks](https://github.com/getumbrel/umbrel-compose/issues?q=is%3Aissue+is%3Aopen+label%3ATODO) which are on this list.
[![License](https://img.shields.io/github/license/getumbrel/umbrel-compose?color=%235351FB)](https://github.com/getumbrel/umbrel-compose/blob/master/LICENSE)
[getumbrel.com](https://getumbrel.com)

11
build/lnd-unlock/Dockerfile

@ -1,11 +0,0 @@
FROM alpine:3.10
RUN apk add --no-cache curl jq
RUN mkdir /lnd/
COPY unlock.sh /bin/unlock
RUN chmod +x /bin/unlock
ENTRYPOINT ["unlock"]

57
build/lnd-unlock/unlock.sh

@ -1,57 +0,0 @@
#!/bin/sh
HOST=localhost:8080
TLS_CERT=/lnd/tls.cert
LNDPASSWORD_PATH=/secrets/lnd-password.txt
MACAROON_PATH=/lnd/data/chain/bitcoin/mainnet/admin.macaroon
lncurl() {
MACAROON="$(xxd -p /lnd/data/chain/bitcoin/mainnet/admin.macaroon | tr -d '\n')"
url_path=$1
data=$2
curl --fail --silent --show-error \
--cacert "${TLS_CERT}" \
--header "Grpc-Metadata-macaroon: ${MACAROON}" \
--data "${data}" \
"https://${HOST}/v1/${url_path}"
}
while true; do
# First make sure that port is open
while ! nc -z localhost 8080; do
>&2 echo "Waiting for ${HOST} port to open…"
sleep 3
done
>&2 echo "Port ${HOST} is open"
# Wait a bit more in case the port was just opened
sleep 1
if [[ -f $LNDPASSWORD_PATH ]]; then
if [[ -f $MACAROON_PATH ]]; then
>&2 echo "Password and macaroon file file exists"
PASS="$(cat /secrets/lnd-password.txt | tr -d '\n' | base64 | tr -d '\n')"
UNLOCK_PAYLOAD="$(jq -nc --arg wallet_password ${PASS} '{$wallet_password}')"
# Try getinfo then unlock
>&2 echo "Trying ${HOST}/getinfo…"
INFO=$(lncurl getinfo)
if [ "$?" = "0" ]; then
>&2 echo "Response: ${INFO}"
alias="$(echo "${INFO}" | jq '.alias')"
>&2 echo "Wallet for ${alias} unlocked!"
exit 0
fi
>&2 echo "${HOST}/getinfo FAILED, out=${INFO}"
>&2 echo "Trying ${HOST}/unlockwallet…"
RESULT=$(lncurl unlockwallet "${UNLOCK_PAYLOAD}")
>&2 echo "${HOST}/unlockwallet completed with: exit-code=$?, out=${RESULT}"
else
>&2 echo "macaroon file doesn't exist"
fi
else
>&2 echo "password file doesn't exist"
fi
sleep 30
done

0
db/jwt-private-key/.gitkeep

0
db/jwt-public-key/.gitkeep

45
docker-compose.yml

@ -10,7 +10,7 @@ x-utility: &default-utility
network_mode: host
services:
web:
nginx:
image: nginx:1.17.8
logging: *default-logging
volumes:
@ -34,33 +34,46 @@ services:
volumes:
- ${HOME}/lnd:/data/.lnd
- ${HOME}/lnd:/root/.lnd
- ${HOME}/bitcoin:/root/.bitcoin
- /var/lib/tor:/var/lib/tor
- /run/tor:/run/tor/
restart: on-failure
depends_on: [ bitcoin, web ]
network_mode: host
stop_grace_period: 1m30s
dashboard:
image: getumbrel/dashboard:v0.2.0
logging: *default-logging
restart: always
network_mode: host
manager:
image: getumbrel/manager:v0.1.0
logging: *default-logging
restart: unless-stopped
network_mode: host
volumes:
- "${HOME}/db:/db"
environment:
PORT: "3006"
USER_PASSWORD_FILE: "/db/user.json"
JWT_PUBLIC_KEY_FILE: "/db/jwt-public-key/jwt.pem"
JWT_PRIVATE_KEY_FILE: "/db/jwt-private-key/jwt.key"
JWT_EXPIRATION: "3600"
middleware:
image: getumbrel/middleware:v0.0.5
depends_on: [ bitcoin, lnd ]
image: getumbrel/middleware:v0.1.0
command: ["./wait-for-node-manager.sh", "localhost", "npm", "start"]
logging: *default-logging
restart: on-failure
restart: unless-stopped
network_mode: host
depends_on: [ manager ]
volumes:
- "${HOME}/lnd:/lnd"
- "${HOME}/db/jwt-public-key:/jwt-public-key"
environment:
PORT: "3005"
BITCOIN_HOST: "0.0.0.0"
RPC_PORT: "8332"
RPC_USER: ""
RPC_PASSWORD: ""
RPC_USER: "lncm"
RPC_PASSWORD: "RPCPASS"
LND_NETWORK: "mainnet"
LND_HOST: "127.0.0.1"
lnd-unlock:
build: ${HOME}/build/lnd-unlock/
depends_on: [ lnd ]
logging: *default-logging
restart: always
volumes:
- "${HOME}/lnd:/lnd"
- "${HOME}/secrets:/secrets"
network_mode: host
JWT_PUBLIC_KEY_FILE: "/jwt-public-key/jwt.pem"

19
nginx/conf.d/default.conf

@ -2,16 +2,19 @@ server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /etc/nginx/www;
index index.html;
location / {
index index.html;
try_files $uri $uri/ /index.html;
}
location /api/ {
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
proxy_pass http://localhost:3005/;
}
location /manager-api/ {
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
proxy_pass http://localhost:3006/;
}
location / {
add_header Access-Control-Allow-Origin *;
proxy_pass http://localhost:3004/;
}
}
Loading…
Cancel
Save