Consul을 사용하여 Mastodon!

tl;dr



이 기사에서는 docker와 consul을 사용하여 확장성이 향상된 환경을 구축하는 절차를 설명합니다.
거칠고 여러가지 접혀있는 곳이 있습니다.
docker-compose scale web=5 와 같이, 간단하게 서버를 늘리거나 하는 운용이 가능하게 됩니다.

네트워크 만들기



consul 용과 mastodon 용으로 다른 docker-compose.yml을 사용하므로 동일한 네트워크가 필요하기 때문에 미리 만들어 둡니다.
docker network create consul-network

consul 사용



consul은 docker-nginx-lb을 사용합니다. 여기 mastodon과는 관계없는 디렉토리에 git clone 해옵니다.

docker-compose.yml 편집



이 리포지토리에는 docker-compose.yml이 포함되어 있으므로 약간 편집합니다.
networks:
  default:
    external:
      name: consul-network

을 추가하고 방금 만든 네트워크에 연결합니다.

nginx.conf 편집



리포지토리에 포함된 nginx.conf를 편집합니다.
템플릿이 되어 range 라고 써 있는 부분에 자동적으로 server 가 추가되어 갑니다.
mastodon.web 이나 mastodon.streamingTag:Name 의 관계가 되고 있습니다.
streaming은 Websocket으로 읽을 수 있도록 수정합니다.
- upstream web {
+ upstream app {
  least_conn;
- {{range service "production.app"}}server {{.Address}}:{{.Port}} max_fails=3 
+ {{range service "mastodon.web"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1;
  {{else}}server 127.0.0.1:65535; # force a 502{{end}}
}

server {
-  listen 80 default_server;
+  listen 3000 default_server;
+  client_max_body_size 10m;

  location / {
-   proxy_pass http://app;
+   proxy_pass http://web;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}


+ upstream streaming {
+   least_conn;max_fails=3 
+   {{range service "mastodon.streaming"}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1;
+   {{else}}server 127.0.0.1:65535; # force a 502{{end}}
+ }
+ 
+ server {
+   listen 4000 default_server;
+   client_max_body_size 10m;
+ 
+   location / {
+     proxy_pass http://streaming;
+     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+     proxy_set_header Host $host;
+     proxy_set_header X-Real-IP $remote_addr;
+     proxy_http_version 1.1;
+     proxy_set_header Upgrade $http_upgrade;
+     proxy_set_header Connection "upgrade";
+   }
+ }


mastodon 측 수정



docker-compose.yml 편집



마찬가지로 네트워크에 연결합니다.
서비스가 이미 실행 중이면 네트워크가 변경되므로 IP 주소에 유의하십시오.
networks:
  default:
    external:
      name: consul-network

을 추가하고 방금 만든 네트워크에 연결합니다.

한 번 실행해보세요



여기까지 할 수 있으면, mastodondocker-nginx-lb 각각으로 docker-compose up --build 합니다. 호스트 측에서 http://(ホストIP):8500에 액세스하고 Consul UI에 액세스합니다.



이런 식으로 나타나면 Consul이 제대로 움직입니다.

환경 변수 설정


docker-nginx-lbdocker-compose.yml 에서는 registrator 도 함께 움직이게 되어 있으므로

docker-compose.yml
    environment:
      SERVICE_NAME: web
      SERVICE_3000_NAME: web
      SERVICE_TAGS: mastodon

라고 정의되어 있는 컨테이너를 발견하면, 서비스로서 등록해 줍니다. 하나만 포트가 열려 있는 서버의 경우는 name 라는 형식의 서비스명으로 등록되고, 복수의 포트가 비어 있는 경우는 name-3000(Name-Port) 라는 형식으로 등록되므로 주의가 필요합니다. (또한 이름에 밑줄 _을 사용할 수 없습니다)

웹 수정



docker-compose.yml
    environment:
      SERVICE_NAME: web
      SERVICE_3000_NAME: web
      SERVICE_TAGS: mastodon

streaming 수정



docker-compose.yml
    environment:
      SERVICE_NAME: streaming
      SERVICE_4000_NAME: streaming
      SERVICE_TAGS: mastodon

수정하고 기동시키면, registrator 가 service 를 찾아 consul 에 등록해 줍니다.
consul은 service가 변경된 알림을 받으면 nginx의 conf를 자동으로 덮어 쓰고 nginx를 자동으로 다시로드합니다.

배포(참고 정도)


docker-compose build
docker-compose scale web=10                                                                                                                                                                                                                   
docker-compose ps | grep "mastodonto_web_[1-5] " | awk '{print $1}' | xargs docker stop
docker-compose up --build --force-recreate -d web
docker-compose scale web=5



실제로 이 구축 순서로 만든 인스턴스 이쪽입니다.

h tps://오사카나. cぉ우d

생각보다 물고기가 모이지 않기 때문에 종료했습니다.

좋은 웹페이지 즐겨찾기