From 4eb31c11e38c25efce47b26025fa55155f7e0e25 Mon Sep 17 00:00:00 2001 From: LoveIsGrief Date: Mon, 13 Jan 2020 18:42:30 +0100 Subject: [PATCH] Write README and cleanup inconsistencies #32 - Docker image --- Dockerfile | 8 +-- README.md | 61 ++++++++++++++++++-- docker/rootfs/muwire/.MuWire/i2p.properties | 1 + docker/rootfs/startapp.sh | 2 +- images/i2cp_config.png | Bin 0 -> 13674 bytes 5 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 docker/rootfs/muwire/.MuWire/i2p.properties create mode 100644 images/i2cp_config.png diff --git a/Dockerfile b/Dockerfile index 358b1336..20d1f7f8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,13 +23,13 @@ RUN ./gradlew --no-daemon clean assemble \ # First dir in tar is the "MuWire-" && tar -C /muwire --strip 1 -xvf gui/build/distributions/MuWire*.tar +WORKDIR /muwire + # Cleanup -RUN rm -rf /muwire-tmp /root/.gradle /root/.java +RUN rm -rf ${TMP_DIR} /root/.gradle /root/.java # Leave only the JRE RUN apk del openjdk${JDK}-jdk -WORKDIR /muwire - # Maximize only the main/initial window. RUN \ sed-patch 's///' \ @@ -49,7 +49,7 @@ ENV APP_NAME="MuWire" \ S6_KILL_GRACETIME=8000 # Define mountable directories. -VOLUME ["/config"] +VOLUME ["/muwire/.MuWire"] VOLUME ["/output"] diff --git a/README.md b/README.md index 62b54153..1fa5752e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ The current stable release - 0.6.8 is avaiable for download at https://muwire.co You can find technical documentation in the [doc] folder. Also check out the [Wiki] for various other documentation. -### Building +## Building You need JDK 9 or newer. After installing that and setting up the appropriate paths, just type @@ -21,7 +21,7 @@ If you want to run the unit tests, type If you want to build binary bundles that do not depend on Java or I2P, see the [muwire-pkg] project -### Running the GUI +## Running the GUI Type ``` @@ -32,20 +32,67 @@ If you have an I2P router running on the same machine that is all you need to do [Default I2CP port]\: `7654` -### Running the CLI +## Running the CLI Look inside `cli-lanterna/build/distributions`. Untar/unzip one of the `shadow` files and then run the jar contained inside by typing `java -jar cli-lanterna-x.y.z-all.jar` in a terminal. The CLI will ask you about the router host and port on startup, no need to edit any files. However, the CLI does not have an options window yet, so if you need to change any options you will need to edit the configuration files. The CLI options are documented here [cli options] The CLI is under active development and doesn't have all the features of the GUI. -### Running the Web UI / Plugin +## Running the Web UI / Plugin There is a Web-based UI under development. It is intended to be run as a plugin to the Java I2P router. Instructions how to build it are available at the wiki [Plugin] page. -### Translations +## Docker + +The Docker image is based on the wonderful work in [jlesage/docker-baseimage-gui]. +You can refer to it for environment variables to pass to the container. + +If you don't want to use the image on dockerhub, build an image yourself. +```bash +MUWIRE_VERSION=`awk -F "=" '/^version/ { gsub(" ","") ; print $2}' gradle.properties` +docker build -t muwire:latest,muwire:${MUWIRE_VERSION} . +``` + +**Necessary configuration** + +Since MuWire will be running in a container, it won't have direct access to the host's localhost. +By default, it will be configured to use `172.17.0.1` as the target host. +You'll need to open the I2CP port on that interface. +If you're running I2P on the localhost, navigate to http://localhost:7657/configi2cp and make the necessary changes. + +![i2cp_config.png] + +Should you be using a different interface write an `i2p.properties` and then put that into the shared docker volume. + +Example configuration file: +```properties +i2cp.tcp.host=112.13.0.1 +``` + +**Running** + +```bash +docker run \ + -p 5800:5800 \ + -v output:output \ + muwire +``` + +You will then be able to access the muwire GUI over a browser at http://localhost:5800 + +**Options** + + +| Option | Description | +|--------------|--------------------------------------------| +|`-v output:output`| The `/output` volume should be used to store MuWire's download/upload data | +|`-v config:/muwire/.MuWire`| This is where the `i2p.properties` and possibly other config should go | + + +## Translations If you want to help translate MuWire, instructions are on the wiki https://github.com/zlatinb/muwire/wiki/Translate -### GPG Fingerprint +## GPG Fingerprint ``` 471B 9FD4 5517 A5ED 101F C57D A728 3207 2D52 5E41 @@ -61,3 +108,5 @@ You can find the full key at https://keybase.io/zlatinb [cli options]: https://github.com/zlatinb/muwire/wiki/CLI-Configuration-Options [I2P Github]: https://github.com/i2p/i2p.i2p [Plugin]: https://github.com/zlatinb/muwire/wiki/Plugin +[i2cp_conf.png]: ./images/i2cp_config.png +[jlesage/docker-baseimage-gui]: https://github.com/jlesage/docker-baseimage-gui diff --git a/docker/rootfs/muwire/.MuWire/i2p.properties b/docker/rootfs/muwire/.MuWire/i2p.properties new file mode 100644 index 00000000..a70cbd46 --- /dev/null +++ b/docker/rootfs/muwire/.MuWire/i2p.properties @@ -0,0 +1 @@ +i2cp.tcp.host=172.17.0.1 diff --git a/docker/rootfs/startapp.sh b/docker/rootfs/startapp.sh index 70207235..4a5624fa 100644 --- a/docker/rootfs/startapp.sh +++ b/docker/rootfs/startapp.sh @@ -1,7 +1,7 @@ #!/bin/sh # Explicitly define HOME otherwise it might not have been set -export HOME=/config +export HOME=/muwire echo "Starting MuWire" exec /muwire/bin/MuWire diff --git a/images/i2cp_config.png b/images/i2cp_config.png new file mode 100644 index 0000000000000000000000000000000000000000..5b04cc22edc001b6213dcfedf0c972907f9caef8 GIT binary patch literal 13674 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 literal 0 HcmV?d00001