diff --git a/.gitignore b/.gitignore index 29d28271a..b60317da2 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,8 @@ _testmain.go *.exe *.test *.prof + +# Generated keys +*.pem +*.key +*.crt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..6e3955d45 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM golang:alpine3.6 + +RUN mkdir /build + +WORKDIR /build + +RUN apk --update --no-cache add openssl bash git && \ + go get github.com/constabulary/gb/... + +CMD ["bash", "docker/build.sh"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..4d2be3730 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,211 @@ +version: "3.4" +services: + monolith: + container_name: dendrite_monolith + hostname: monolith + entrypoint: ["bash", "./docker/services/monolith.sh"] + build: ./ + volumes: + - type: bind + source: ./ + target: /build + networks: + - internal + depends_on: + - postgres + ports: + - "8008:8008" + - "8448:8448" + + client_api_proxy: + container_name: dendrite_client_api_proxy + hostname: client_api_proxy + entrypoint: ["bash", "./docker/services/client-api-proxy.sh"] + build: ./ + volumes: + - type: bind + source: ./ + target: /build + networks: + - internal + depends_on: + - postgres + - sync_api + - client_api + - media_api + - public_rooms_api + ports: + - "8008:8008" + + client_api: + container_name: dendrite_client_api + hostname: client_api + entrypoint: ["bash", "./docker/services/client-api.sh"] + build: ./ + volumes: + - type: bind + source: ./ + target: /build + depends_on: + - postgres + - room_server + networks: + - internal + ports: + - 7771 + + media_api: + container_name: dendrite_media_api + hostname: media_api + entrypoint: ["bash", "./docker/services/media-api.sh"] + build: ./ + volumes: + - type: bind + source: ./ + target: /build + depends_on: + - postgres + networks: + - internal + ports: + - 7774 + + public_rooms_api: + container_name: dendrite_public_rooms_api + hostname: public_rooms_api + entrypoint: ["bash", "./docker/services/public-rooms-api.sh"] + build: ./ + volumes: + - type: bind + source: ./ + target: /build + depends_on: + - postgres + networks: + - internal + ports: + - 7775 + + sync_api: + container_name: dendrite_sync_api + hostname: sync_api + entrypoint: ["bash", "./docker/services/sync-api.sh"] + build: ./ + volumes: + - type: bind + source: ./ + target: /build + depends_on: + - postgres + networks: + - internal + ports: + - 7773 + + room_server: + container_name: dendrite_room_server + hostname: room_server + entrypoint: ["bash", "./docker/services/room-server.sh"] + build: ./ + volumes: + - type: bind + source: ./ + target: /build + depends_on: + - postgres + networks: + - internal + ports: + - 7770 + + federation_api_proxy: + container_name: dendrite_federation_api_proxy + hostname: federation_api_proxy + entrypoint: ["bash", "./docker/services/federation-api-proxy.sh"] + build: ./ + volumes: + - type: bind + source: ./ + target: /build + depends_on: + - postgres + - federation_api + - federation_sender + - media_api + networks: + - internal + ports: + - "8448:8448" + + federation_api: + container_name: dendrite_federation_api + hostname: federation_api + entrypoint: ["bash", "./docker/services/federation-api.sh"] + build: ./ + volumes: + - type: bind + source: ./ + target: /build + depends_on: + - postgres + networks: + - internal + ports: + - 7772 + + federation_sender: + container_name: dendrite_federation_sender + hostname: federation_sender + entrypoint: ["bash", "./docker/services/federation-sender.sh"] + build: ./ + volumes: + - type: bind + source: ./ + target: /build + depends_on: + - postgres + networks: + - internal + ports: + - 7776 + + postgres: + container_name: dendrite_postgres + hostname: postgres + build: ./docker/postgres + restart: always + environment: + POSTGRES_PASSWORD: itsasecret + POSTGRES_USER: dendrite + ports: + - 5432 + networks: + - internal + + zookeeper: + container_name: dendrite_zk + hostname: zookeeper + image: zookeeper + ports: + - 2181 + networks: + - internal + + kafka: + container_name: dendrite_kafka + hostname: kafka + image: wurstmeister/kafka + environment: + KAFKA_ADVERTISED_HOST_NAME: "kafka" + KAFKA_DELETE_TOPIC_ENABLE: "true" + KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181" + depends_on: + - zookeeper + ports: + - 9092 + networks: + - internal + +networks: + internal: + attachable: true diff --git a/docker/build.sh b/docker/build.sh new file mode 100644 index 000000000..a478c867c --- /dev/null +++ b/docker/build.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +gb build + +# Generate the keys if they don't already exist. +if [ ! -f server.key ] || [ ! -f server.crt ] || [ ! -f matrix_key.pem ]; then + echo "Generating keys ..." + + rm -f server.key server.crt matrix_key.pem + + test -f server.key || openssl req -x509 -newkey rsa:4096 \ + -keyout server.key \ + -out server.crt \ + -days 3650 -nodes \ + -subj /CN=localhost + + test -f matrix_key.pem || /build/bin/generate-keys -private-key matrix_key.pem +fi diff --git a/docker/postgres/Dockerfile b/docker/postgres/Dockerfile new file mode 100644 index 000000000..84588199a --- /dev/null +++ b/docker/postgres/Dockerfile @@ -0,0 +1,3 @@ +FROM postgres:9.5 + +COPY ./create_db.sh /docker-entrypoint-initdb.d/20-create_db.sh diff --git a/docker/postgres/create_db.sh b/docker/postgres/create_db.sh new file mode 100644 index 000000000..56f6540ec --- /dev/null +++ b/docker/postgres/create_db.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +for db in account device mediaapi syncapi roomserver serverkey federationsender publicroomsapi naffka; do + createdb -O dendrite dendrite_$db +done diff --git a/docker/services/client-api-proxy.sh b/docker/services/client-api-proxy.sh new file mode 100644 index 000000000..931f7abbc --- /dev/null +++ b/docker/services/client-api-proxy.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +bash ./docker/build.sh + +./bin/client-api-proxy --bind-address ":8008" \ + --client-api-server-url "http://client_api:7771" \ + --sync-api-server-url "http://sync_api:7773" \ + --media-api-server-url "http://media_api:7774" \ + --public-rooms-api-server-url "http://public_rooms_api:7775" \ diff --git a/docker/services/client-api.sh b/docker/services/client-api.sh new file mode 100644 index 000000000..8dc822421 --- /dev/null +++ b/docker/services/client-api.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +bash ./docker/build.sh + +./bin/dendrite-client-api-server --config=dendrite.yaml diff --git a/docker/services/federation-api-proxy.sh b/docker/services/federation-api-proxy.sh new file mode 100644 index 000000000..6ea75c95a --- /dev/null +++ b/docker/services/federation-api-proxy.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +bash ./docker/build.sh + +./bin/federation-api-proxy --bind-address ":8448" \ + --federation-api-url "http://federation_api_server:7772" \ + --media-api-server-url "http://media_api:7774" \ diff --git a/docker/services/federation-api.sh b/docker/services/federation-api.sh new file mode 100644 index 000000000..807a7cf83 --- /dev/null +++ b/docker/services/federation-api.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +bash ./docker/build.sh + +./bin/dendrite-federation-api-server --config dendrite.yaml diff --git a/docker/services/federation-sender.sh b/docker/services/federation-sender.sh new file mode 100644 index 000000000..ea116ef3c --- /dev/null +++ b/docker/services/federation-sender.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +bash ./docker/build.sh + +./bin/dendrite-federation-sender-server --config dendrite.yaml diff --git a/docker/services/media-api.sh b/docker/services/media-api.sh new file mode 100644 index 000000000..876b3aa8d --- /dev/null +++ b/docker/services/media-api.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +bash ./docker/build.sh + +./bin/dendrite-media-api-server --config dendrite.yaml diff --git a/docker/services/monolith.sh b/docker/services/monolith.sh new file mode 100644 index 000000000..a038728b4 --- /dev/null +++ b/docker/services/monolith.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +bash ./docker/build.sh + +./bin/dendrite-monolith-server --tls-cert=server.crt --tls-key=server.key diff --git a/docker/services/public-rooms-api.sh b/docker/services/public-rooms-api.sh new file mode 100644 index 000000000..652afcfec --- /dev/null +++ b/docker/services/public-rooms-api.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +bash ./docker/build.sh + +./bin/dendrite-public-rooms-api-server --config dendrite.yaml diff --git a/docker/services/room-server.sh b/docker/services/room-server.sh new file mode 100644 index 000000000..473b5f5d3 --- /dev/null +++ b/docker/services/room-server.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +bash ./docker/build.sh + +./bin/dendrite-room-server --config=dendrite.yaml diff --git a/docker/services/sync-api.sh b/docker/services/sync-api.sh new file mode 100644 index 000000000..ac6433fa5 --- /dev/null +++ b/docker/services/sync-api.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +bash ./docker/build.sh + +./bin/dendrite-sync-api-server --config=dendrite.yaml