diff --git a/Makefile b/Makefile index a4d11a9b5b..b5c498af30 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: build package run stop run-client run-server stop-client stop-server restart restart-server restart-client start-docker clean-dist clean nuke check-style check-client-style check-server-style check-unit-tests test dist prepare-enteprise run-client-tests setup-run-client-tests cleanup-run-client-tests test-client build-linux build-osx build-windows internal-test-web-client vet run-server-for-web-client-tests diff-config prepackaged-plugins prepackaged-binaries test-server test-server-ee test-server-quick test-server-race start-docker-check +.PHONY: build package run stop run-client run-server run-haserver stop-client stop-server restart restart-server restart-client restart-haserver start-docker clean-dist clean nuke check-style check-client-style check-server-style check-unit-tests test dist prepare-enteprise run-client-tests setup-run-client-tests cleanup-run-client-tests test-client build-linux build-osx build-windows internal-test-web-client vet run-server-for-web-client-tests diff-config prepackaged-plugins prepackaged-binaries test-server test-server-ee test-server-quick test-server-race start-docker-check ROOT := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) @@ -156,6 +156,13 @@ ifneq (,$(findstring openldap,$(ENABLED_DOCKER_SERVICES))) endif endif +run-haserver: run-client +ifeq ($(BUILD_ENTERPRISE_READY),true) + @echo Starting mattermost in an HA topology + + docker-compose -f docker-compose.yaml up haproxy +endif + stop-docker: ## Stops the docker containers for local development. ifeq ($(MM_NO_DOCKER),true) @echo No Docker Enabled: skipping docker stop @@ -473,6 +480,13 @@ restart: restart-server restart-client ## Restarts the server and webapp. restart-server: | stop-server run-server ## Restarts the mattermost server to pick up development change. +restart-haserver: + @echo Restarting mattermost in an HA topology + + docker-compose restart follower + docker-compose restart leader + docker-compose restart haproxy + restart-client: | stop-client run-client ## Restarts the webapp. run-job-server: ## Runs the background job server. diff --git a/build/docker/nginx/default.conf b/build/docker/nginx/default.conf new file mode 100644 index 0000000000..b1ca7ac4f2 --- /dev/null +++ b/build/docker/nginx/default.conf @@ -0,0 +1,35 @@ +upstream app_cluster { + server leader:8065 fail_timeout=5s max_fails=10; + server follower:8065 fail_timeout=5s max_fails=10; +} + +server { + listen 8065; + + location ~ /api/v[0-9]+/(users/)?websocket$ { + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + client_max_body_size 50M; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Frame-Options SAMEORIGIN; + proxy_buffers 256 16k; + proxy_buffer_size 16k; + proxy_read_timeout 600s; + proxy_pass http://app_cluster; + } + + location / { + client_max_body_size 50M; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Frame-Options SAMEORIGIN; + proxy_pass http://app_cluster; + } +} diff --git a/docker-compose.yaml b/docker-compose.yaml index 0b48bb6719..ecebf1f63d 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -74,6 +74,73 @@ services: - elasticsearch command: postgres:5432 mysql:3306 minio:9000 inbucket:10080 openldap:389 elasticsearch:9200 + leader: + build: + context: . + dockerfile: ./build/Dockerfile.buildenv + working_dir: '/home/mattermost-server' + environment: + - "MM_SQLSETTINGS_DATASOURCE=postgres://mmuser:mostest@postgres/mattermost_test?sslmode=disable\u0026connect_timeout=10" + - "MM_NO_DOCKER=true" + - "RUN_SERVER_IN_BACKGROUND=false" + networks: + - mm-test + depends_on: + - start_dependencies + volumes: + - './:/home/mattermost-server' + - './../mattermost-webapp:/home/mattermost-webapp' + - './../enterprise:/home/enterprise' + restart: on-failure + healthcheck: + test: ["CMD", "curl", "-f", "http://leader:8065/api/v4/system/ping"] + interval: 5s + timeout: 10s + retries: 30 + command: ['make', 'run-server'] + expose: + - "8065" + + follower: + build: + context: . + dockerfile: ./build/Dockerfile.buildenv + working_dir: '/home/mattermost-server' + environment: + - "MM_SQLSETTINGS_DATASOURCE=postgres://mmuser:mostest@postgres/mattermost_test?sslmode=disable\u0026connect_timeout=10" + - "MM_NO_DOCKER=true" + - "RUN_SERVER_IN_BACKGROUND=false" + networks: + - mm-test + depends_on: + - leader + volumes: + - './:/home/mattermost-server' + - './../mattermost-webapp:/home/mattermost-webapp' + - './../enterprise:/home/enterprise' + healthcheck: + test: ["CMD", "curl", "-f", "http://follower:8065/api/v4/system/ping"] + interval: 5s + timeout: 10s + retries: 30 + command: ['make', 'run-server'] + restart: on-failure + expose: + - "8065" + + haproxy: + image: nginx + networks: + - mm-test + volumes: + - ./build/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf + restart: on-failure + depends_on: + - leader + - follower + ports: + - "8065:8065" + networks: mm-test: driver: bridge