# coinos-server Coinos is a bitcoin wallet app that supports payments over the bitcoin, liquid and lightning networks. Try it out at coinos.io. This repository contains the code for the backend API server which is implemented as a NodeJS application. The code for the frontend UI is tracked separately here (but is automatically installed & started via the Docker way outlined below). ## Install/Run (the Docker way) ### Requirements * docker and docker-compose * NodeJS (recommended version: 16) * ~7GB of hard drive space (which will go into /var/lib/docker; primarily for Liquid) ### Getting Started git clone https://github.com/coinos/coinos-server cd coinos-server cp -rf sampleconfig ./config cp .env.sample .env cp fx.sample fx docker network create net sudo base64 config/lnd/tls.cert | tr -d '\n' sudo base64 config/lnd/data/chain/bitcoin/regtest/admin.macaroon | tr -d '\n' docker run -it -v $(pwd):/app --entrypoint yarn asoltys/coinos-server docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d --remove-orphans docker exec -i mariadb mysql -u root -ppassword < db/schema.sql docker exec -it liquid elements-cli -conf=/config/elements.conf sendtoaddress AzpsKhC6xE9FEK4aWAzMnbvueMLiSa5ym1xpuYogFkHzWgMHSt8B79aNNbFppQzCSQ2yZ9E4nL6RQJU7 1000000 docker exec -it lnd lncli create docker exec -it lnd lncli --network=regtest --chain=bitcoin unlock ### Config changes navigate to config/index.js. for the lna dictionary, update the values for cert and macaroon. These values can be found in the macaroon and cert files created in the previous section in the root folder of the coinos project. ### Wallet not found issues If your app logs complain that the wallet was not found, do the following: docker-compose exec bitcoin bash bitcoin-cli -datadir=config/ createwallet coinos exit docker exec -it lnd lncli --network=regtest --chain=bitcoin unlock Note the last step will take some time on first run as it will download the aforementioned docker images. After successful creation of all docker containers coinos will be available at http://localhost:8085 To shutdown coinos and all of its containers/services, run `docker-compose down` again. At anypoint to purge the database and start with a new one run `rm -rf mysql` and then `mkdir mysql` and then the same steps following from that point as outlined above. Or run `purge-except-git.sh` from `./scripts` To review a log of individual containers use `docker-compose app` or `docker-compose maria` etc; container names are available in `docker-compose.yml` or via `docker-compose ps` when they are running. `docker images` will show you a list of the images installed on your system and `docker image rm [IMAGE ID]` removes them. #### Volumes and local filesystem changes The `docker-compose.yml` specifies volumes that map to the host (ie- your local machine). As per Docker's volume feature these override what is in the container's 'virtual' filesystem for those folders and instead will map to what is on your local filesystem. As such, changes/developments that occur in these locations will be reflected without needing to restart the containers. Additionally Nodemon is setup by default to watch coinos-server directory and will auto-restart the app as changes occur. Alternative to allowing nodemon to manage the app, you may enter bash on the docker to start/stop the node app manually ie: docker exec -it app bash node index.js # ^ starts app manually in a bash session inside the docker # ( reflecting your local coinos-server directory) To prevent nodemon from starting with the container change the `package.json` `"start"` script value to: `"tail -f /dev/null"` which will then keep the container alive so you may enter an interactive bash as above to start the app manually. #### Debugging To debug the node app while it is running via Docker, edit `docker-compose.yml` to add `9229` to the ports section for the `app` service: ports: - '3119:3119' - '9229' then get the IP of the app container: docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' app > 192.168.115.72 #outputs the coinos app container IP then edit `package.json` start script to: "start" : "nodemon --inspect=0.0.0.0 index.js", (or use the interactive bash technique above with this same inspect flag) restart with `docker-compose restart app` then open your browser (Chrome in this example) to the URL`chrome://inspect` then click "Configure" and add the IP address + debugger port to the list of targets ex- `192.168.115.72:92229` an inspect link will then display under 'Remote Target'! Note the IP address may change between restarts so you may have to rerun the docker inspect command above again to make sure you have the correct IP on following sessions. ---- ### Install/Run (standalone) Note the Docker way outlined above is recommended as manual setup requirements/instructions shown below are out of date. #### Requirements * bitcoind with zmq support * elementsd with zmq support * lnd or c-lightning * a database that sequelize can talk to The bitcoind and elementsd nodes can be a pruned if you want to limit the amount of disk space used. #### Getting Started git clone git@github.com:coinos/coinos-server.git cd coinos-server cp -rf sampleconfig ./config # edit config files as necessary for your local setup cp .env.sample .env yarn yarn start # or, alternatively yarn min # to run a stripped down development version that doesn't do payments or talk to any nodes #### Database Setup I've only tested with Maria. Here's a [schema](https://github.com/asoltys/coinos-server/blob/master/db/schema.sql) to get you started. cat db/schema.sql | mysql -u root -p # Miscellaneous Commands ## Funding the regtest with bitcoin --- Bitcoin --- generate some blocks docker exec -it bitcoin bitcoin-cli -datadir=config/ generatetoaddress 1 $(docker exec -it bitcoin bitcoin-cli -datadir=config/ getnewaddress "" "legacy") get balance docker exec -it bitcoin bitcoin-cli -datadir=config/ getbalance --- Liquid --- The Liquid network gives you a starting balance of Bitcoin specified in the `config/liquid/elements.conf` file as `initialfreecoins`. generate some blocks docker exec -it liquid elements-cli -datadir=/home/elements/.elements generatetoaddress 1 $(docker exec -it liquid elements-cli -datadir=/home/elements/.elements getnewaddress) get balance docker exec -it liquid elements-cli -datadir=/home/elements/.elements getbalance --- Lightning --- get node id of clighting node docker exec -it cl lightning-cli getinfo connect to clightning node docker exec -it lnd lncli --network=regtest --chain=bitcoin connect 029ba19ec5f65f82b1952fd535a86ff136ccc67ff7f91e19c3fcbc83a5224adaee@cl:9735 open a channel docker exec -it lnd lncli --network=regtest --chain=bitcoin openchannel 029ba19ec5f65f82b1952fd535a86ff136ccc67ff7f91e19c3fcbc83a5224adaee 10000000 generate 10 btc blocks docker exec -it bitcoin bitcoin-cli -datadir=config/ generatetoaddress 10 $(docker exec -it bitcoin bitcoin-cli -datadir=config/ getnewaddress "" "legacy") --- Test clightning payment --- payment request from clightning docker exec -it cl lightning-cli invoice 100000 "test payment" "test desc" get full payment request code from field bolt11 something like this lnbcrt1u1p3qhle9pp5mzn7aezr59tmlmp5mg9x2sa45j8fec5ygmwx6mg2x29qpnnw3j9qdq0w3jhxapqv3jhxccxqyjw5qcqp2sp54tuk3ns3gd66w50hflkzwks0d9z9eelsa8284283zhkug9kevzqq9qyyssqjsprhd38eywg6kp8w7gmwf48hnx0mpd28465v9f595xfrec0dg2jnqdumrmeh9srw32u5t9g6tdy6tdpu47emhkfnu72fnzevvwd0acqxmurkx Use this botl11 address and paste in the UI to check --- Check if all three nodes are connected --- curl https://attackme.coinos.io/api/info look for nodes array at the end ---