summary refs log tree commit diff
diff options
context:
space:
mode:
authorRobert Swain <rob@matrix.org>2017-09-28 12:12:47 +0200
committerRobert Swain <rob@matrix.org>2017-09-28 12:12:47 +0200
commit95e02b856b2ac1409dc0d5575ee0b7be55105e9a (patch)
tree014a2028a0f5bc82b49284084748ccda8ec7ff4d
parentMerge pull request #2475 from matrix-org/erikj/joined_members_auth (diff)
downloadsynapse-95e02b856b2ac1409dc0d5575ee0b7be55105e9a.tar.xz
docker: Initial Dockerfile and docker-compose.yaml
-rw-r--r--Dockerfile58
-rw-r--r--docker/README.md70
-rw-r--r--docker/docker-compose.yaml39
-rwxr-xr-xdocker/rootfs/etc/service/synapse/finish17
-rwxr-xr-xdocker/rootfs/etc/service/synapse/run75
5 files changed, 259 insertions, 0 deletions
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000..9b11a143f6
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,58 @@
+# Copyright 2017 Vector Creations Ltd
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM phusion/baseimage:0.9.22
+
+COPY ./ /synapse/source/
+
+RUN apt-get update -y \
+    && DEBIAN_FRONTEND=noninteractive apt-get upgrade -y \
+    && DEBIAN_FRONTEND=noninteractive apt-get install -y \
+        build-essential \
+        libffi-dev \
+        libjpeg-dev \
+        libpq-dev \
+        libssl-dev \
+        libxslt1-dev \
+        python-pip \
+        python-setuptools \
+        python-virtualenv \
+        python2.7-dev \
+        sqlite3 \
+    && virtualenv -p python2.7 /synapse \
+    && . /synapse/bin/activate \
+    && pip install --upgrade pip \
+    && pip install --upgrade setuptools \
+    && pip install --upgrade psycopg2 \
+    && cd /synapse/source \
+    && pip install --upgrade ./ \
+    && cd / \
+    && rm -rf /synapse/source \
+    && apt-get autoremove -y \
+        build-essential \
+        libffi-dev \
+        libjpeg-dev \
+        libpq-dev \
+        libssl-dev \
+        libxslt1-dev \
+        python2.7-dev \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+COPY docker/rootfs/ /
+
+VOLUME /synapse/config/
+VOLUME /synapse/data/
+
+CMD ["/sbin/my_init"]
diff --git a/docker/README.md b/docker/README.md
new file mode 100644
index 0000000000..c9e6fd216d
--- /dev/null
+++ b/docker/README.md
@@ -0,0 +1,70 @@
+# Synapse Docker
+
+## Build
+
+Build the docker image with the `docker build` command from the root of the synapse repository.
+
+```
+docker build -t matrix-org/synapse:v0.22.1 .
+```
+
+The `-t` option sets the image tag. Official images are tagged `matrix-org/synapse:<version>` where `<version>` is the same as the release tag in the synapse git repository.
+
+## Configure
+
+Synapse provides a command for generating homeserver configuration files. These are a good starting point for setting up your own deployment.
+
+The documentation below will refer to a `CONFIG_PATH` shell variable. This is a path to a directory where synapse configuration will be stored. It needs to be mapped into the container as a volume at `/synapse/config/` as can be seen in the example `docker run` command.
+
+Docker container environment variables:
+* `GENERATE_CONFIG` - Set this to any non-empty string, such as `yes`, to trigger generation of configuration files. Existing files in the `CONFIG_PATH` will **not** be overwritten.
+* `POSTGRES_DATABASE` - The database name for the synapse postgres database. [default: `synapse`]
+* `POSTGRES_HOST` - The host of the postgres database if you wish to use postgresql instead of sqlite3. [default: `postgres` which is useful when using a container on the same docker network in a compose file where the postgres service is called `postgres`] **NOTE**: `localhost` and `127.0.0.1` refer to the container itself unless running the container with `host` networking.
+* `POSTGRES_PASSWORD` - The password for the synapse postgres database. **If this is set then postgres will be used instead of sqlite3.** [default: none] **NOTE**: You are highly encouraged to use postgresql! Please use the compose file to make it easier to deploy.
+* `POSTGRES_USER` - The user for the synapse postgres database. [default: `postgres`]
+* `REPORT_STATS` - Whether to send anonymous usage statistics back to the Matrix project which helps us to get funding! Must be `yes` or `no`. [default: `yes`]
+* `SERVER_NAME` - The domain used for the Matrix homeserver. If you intend to run this synapse instance on a public domain, use that domain. [default: `localhost`]
+
+```
+CONFIG_PATH=/my/magical/config/path/
+mkdir -p ${CONFIG_PATH}
+docker run \
+    --rm \
+    -e GENERATE_CONFIG=yes \
+    -e POSTGRES_PASSWORD=MyVerySecretPassword \
+    -e REPORT_STATS=yes \
+    -e SERVER_NAME=example.com \
+    -v ${CONFIG_PATH}:/synapse/config/ \
+    matrix-org/synapse:develop
+```
+
+This will create a temporary container from the image and use the synapse code for generating configuration files and TLS keys and certificates for the specified `SERVER_NAME` domain. The files are written to `CONFIG_PATH`.
+
+## Run
+
+**NOTE**: If you are not using postgresql and are using sqlite3 as your database, you will need to make a directory to store the sqlite3 database file in and then mount this volume into the container at `/synapse/data/`. As it is so easy to use postgresql, when using Docker containers, this is not documented to somewhat discourage it. Choose a `POSTGRES_PASSWORD` instead.
+
+### Docker Compose
+
+A `docker-compose.yaml` file is included to ease deployment of the basic synapse and postgres setup. Remember to set a `POSTGRES_PASSWORD` when generating your configuration above. You will need it for running the containers in the composition.
+
+From the `docker/` subdirectory of the synapse repository:
+```
+CONFIG_PATH=/my/magical/config/path/
+POSTGRES_PASSWORD=MyVerySecretPassword \
+docker-compose \
+    -p synapse \
+    up -d
+```
+
+### Docker
+
+Note that the following is just a guideline and you may need to add parameters to the docker run command to account for the network situation with your postgres database.
+
+```
+docker run \
+    -d \
+    --name synapse \
+    -v ${CONFIG_PATH}:/synapse/config/ \
+    matrix-org/synapse:v0.22.1
+```
diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml
new file mode 100644
index 0000000000..ff36081a9b
--- /dev/null
+++ b/docker/docker-compose.yaml
@@ -0,0 +1,39 @@
+# Copyright 2017 Vector Creations Ltd
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+version: '3'
+
+services:
+    postgres:
+        image: postgres:9.6.5-alpine
+        environment:
+            POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
+            POSTGRES_DB: synapse
+        expose:
+            - 5432
+        restart: unless-stopped
+        volumes:
+            - postgres-data:/var/lib/postgresql/data/
+
+    synapse:
+        image: matrix-org/synapse:develop
+        ports:
+            - 8008:8008
+            - 8448:8448
+        restart: unless-stopped
+        volumes:
+            - ${CONFIG_PATH}:/synapse/config/
+
+volumes:
+    postgres-data:
diff --git a/docker/rootfs/etc/service/synapse/finish b/docker/rootfs/etc/service/synapse/finish
new file mode 100755
index 0000000000..2aace581a1
--- /dev/null
+++ b/docker/rootfs/etc/service/synapse/finish
@@ -0,0 +1,17 @@
+#!/bin/bash
+#
+# Copyright 2017 Vector Creations Ltd
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+kill -TERM 1
diff --git a/docker/rootfs/etc/service/synapse/run b/docker/rootfs/etc/service/synapse/run
new file mode 100755
index 0000000000..dd797d3ef9
--- /dev/null
+++ b/docker/rootfs/etc/service/synapse/run
@@ -0,0 +1,75 @@
+#!/bin/bash
+#
+# Copyright 2017 Vector Creations Ltd
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -e
+
+: ${CONFIG_PATH:="/synapse/config"}
+: ${POSTGRES_DATABASE:="synapse"}
+: ${POSTGRES_HOST:="postgres"}
+: ${POSTGRES_USER:="postgres"}
+: ${REPORT_STATS:="yes"}
+: ${SERVER_NAME:="localhost"}
+
+DATABASE_CONFIG_PATH="${CONFIG_PATH}/database.yaml"
+HOMESERVER_CONFIG_PATH="${CONFIG_PATH}/homeserver.yaml"
+SYNAPSE_COMMAND="python -m synapse.app.homeserver"
+
+. /synapse/bin/activate
+cd /synapse
+
+if [[ -n "${GENERATE_CONFIG}" ]]; then
+    ${SYNAPSE_COMMAND} \
+        --server-name ${SERVER_NAME} \
+        --config-path ${HOMESERVER_CONFIG_PATH} \
+        --generate-config \
+        --report-stats=${REPORT_STATS}
+
+    if [[ -f "${DATABASE_CONFIG_PATH}" ]]; then
+        echo "Config file '${DATABASE_CONFIG_PATH}' already exists. Remove it if you want it to be generated."
+    else
+        echo "Generating ${DATABASE_CONFIG_PATH}..."
+        if [[ -n "${POSTGRES_PASSWORD}" ]]; then
+            (cat > ${DATABASE_CONFIG_PATH}) <<EOF
+database:
+  name: psycopg2
+  args:
+    host: ${POSTGRES_HOST}
+    user: ${POSTGRES_USER}
+    password: ${POSTGRES_PASSWORD}
+    database: ${POSTGRES_DATABASE}
+    cp_min: 5
+    cp_max: 10
+EOF
+        else
+            (cat > ${DATABASE_CONFIG_PATH}) <<EOF
+database:
+  name: "sqlite3"
+  args:
+    database: "/synapse/data/homeserver.db"
+EOF
+        fi
+        cat ${DATABASE_CONFIG_PATH} | grep -v password
+    fi
+
+    exit 0
+fi
+
+COMMAND="${SYNAPSE_COMMAND} --config-path ${HOMESERVER_CONFIG_PATH}"
+if [[ -r "${DATABASE_CONFIG_PATH}" ]]; then
+    COMMAND="${COMMAND} --config-path ${DATABASE_CONFIG_PATH}"
+fi
+
+exec ${COMMAND}