summaryrefslogtreecommitdiff
path: root/vere/docker/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'vere/docker/README.md')
-rw-r--r--vere/docker/README.md135
1 files changed, 135 insertions, 0 deletions
diff --git a/vere/docker/README.md b/vere/docker/README.md
new file mode 100644
index 0000000..1cae449
--- /dev/null
+++ b/vere/docker/README.md
@@ -0,0 +1,135 @@
+# Official Urbit Docker Image
+
+This is the official Docker image for [Urbit](https://urbit.org).
+
+Urbit is a clean-slate OS and network for the 21st century.
+
+## Using
+
+To use this image, you should mount a volume with a keyfile, comet file, or
+existing pier at `/urbit`, and map ports as described below.
+
+### Volume Mount
+
+This image expects a volume mounted at `/urbit`. This volume should initially
+contain one of:
+- A keyfile `<shipname>.key` for a galaxy, star, planet, or moon. See the
+ setup instructions for information on
+ [obtaining a keyfile](https://urbit.org/getting-started/get-id).
+ - e.g. `sampel-palnet.key` for the planet `~sampel-palnet`.
+- An empty file with the extension `.comet`. This will cause Urbit to boot a
+ comet in a pier named for the `.comet` file (less the extension).
+ - e.g. starting with an empty file `my-urbit-bot.comet` will result in Urbit
+ booting a comet into the pier `my-urbit-bot` under your volume.
+- An existing pier as a directory `<shipname>`. You can migrate an existing ship
+ to a new docker container in this way by placing its pier under the volume.
+ - e.g. if your ship is `sampel-palnet` then you likely have a directory
+ `sampel-palnet` whose path you pass to `./urbit` when starting.
+ [Move your pier](https://docs.urbit.org/user-manual/os/basics#moving-your-pier)
+ directory to the volume and then start the container.
+
+The first two options result in Urbit attempting to boot either the ship named
+by the keyfile, or a comet. In both cases, after that boot is successful, the
+`.key` or `.comet` file will be removed from the volume and the pier will take
+its place.
+
+Therefore, it is safe to remove the Docker container and start a new container
+which mounts the same volume (e.g. to upgrade the version of the Urbit binary
+by running a newer image). It is also possible to stop the container and then
+move the pier out of the Docker volume (e.g. to run it using an Urbit binary
+directly). If you do this, make sure to delete the Docker volume after you move
+your pier; if you launch a container using this same pier after moving it and
+launching it elsewhere, you will likely need to perform a
+[breach](https://docs.urbit.org/user-manual/id/guide-to-resets).
+
+### Ports
+
+The image includes `EXPOSE` directives for TCP port `80` and UDP port `34343`.
+Port `80` is used for Urbit's HTTP interface for both Landscape and for
+[API calls](https://docs.urbit.org/build-on-urbit/tools/js-libs/http-api-guide)
+to the ship. Port `34343` is set by default to be used by
+[Ames](https://docs.urbit.org/urbit-os/kernel/ames) for ship-to-ship communication.
+
+You can either pass the `-P` flag to docker to map ports directly to the
+corresponding ports on the host, or map them individually with `-p` flags. For
+local testing the latter is often convenient, for instance to remap port `80` to
+an unprivileged port.
+
+For best performance, you must map the Ames UDP port to the *same* port on the
+host. If you map to a different port Ames will not be able to make direct
+connections and your network performance may suffer somewhat. Note that using
+the same port is required for direct connections but is not by itself sufficient
+for them. If you are behind a NAT router or the host is not on a public IP
+address (or you are firewalled), you may not achieve direct connections
+regardless.
+
+For this reason, you can force Ames to use a custom port.
+`/bin/start-urbit --port=$AMES_PORT` can be passed as an argument to the
+`docker start` command. Passing `/bin/start-urbit --port=13436` for example,
+would use port `13436`. Note that you must pass the full script command
+`/bin/start-urbit` in order to also pass arguments. If the script is omitted,
+your container will not start.
+
+You can also set the http port using `--http-port=$HTTP_PORT`. Passing
+`/bin/start-urbit --http-port=8085` for example, would use port `8085`. The
+default http port is `8080`.
+
+### Variable Loom Size
+
+You can also set a variable loom size (Urbit memory size) using
+`--loom=$LOOM_SIZE`. Passing `/bin/start-urbit --loom=32` for example, would set
+up a 4GiB loom (`2^32 bytes = 4GiB`). The default loom size is `31` (2GiB).
+
+### Examples
+
+Creating a volume for `~sampel-palnet`:
+```
+docker volume create sampel-palnet
+```
+
+Copying key to `~sampel-palnet`'s volume (assumes default Docker location):
+```
+sudo cp ~/sampel-palnet.key /var/lib/docker/volumes/sampel-palnet/_data/sampel-palnet.key
+```
+
+Using that volume and launching `~sampel-palnet` on host port `8080` with Ames
+talking on the default host port `34343`:
+```
+docker run -d -p 8080:80 -p 34343:34343/udp --name sampel-palnet \
+ --mount type=volume,source=sampel-palnet,destination=/urbit \
+ tloncorp/vere
+```
+
+Using host port `8088` with Ames talking on host port `23232`:
+```
+docker run -d -p 8088:80 -p 23232:23232/udp --name sampel-palnet \
+ --mount type=volume,source=sampel-palnet,destination=/urbit \
+ tloncorp/vere /bin/start-urbit --port=23232
+```
+
+### Getting and resetting the Landscape `+code`
+
+This docker image includes tools for retrieving and resetting the Landscape
+login code belonging to a ship, for programmatic use so the container does not
+need a tty. These scripts can be called using `docker container exec`.
+
+Getting the code:
+```
+$ docker container exec sampel-palnet /bin/get-urbit-code
+sampel-sampel-sampel-sampel
+```
+
+Resetting the code:
+```
+$ docker container exec sampel-palnet /bin/reset-urbit-code
+OK
+```
+
+## Extending
+
+You likely do not want to extend this image. External applications which
+interact with Urbit do so primarily via an HTTP API, which should be exposed as
+described above. For containerized applications using Urbit, it is more
+appropriate to use a container orchestration service such as Docker Compose or
+Kubernetes to run Urbit alongside other containers which will interface with its
+API.