docker-compose.yml 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. version: "2.2"
  2. services:
  3. setup:
  4. image: docker.elastic.co/elasticsearch/elasticsearch:{version}
  5. volumes:
  6. - certs:/usr/share/elasticsearch/config/certs
  7. user: "0"
  8. command: >
  9. bash -c '
  10. if [ x${ELASTIC_PASSWORD} == x ]; then
  11. echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
  12. exit 1;
  13. elif [ x${KIBANA_PASSWORD} == x ]; then
  14. echo "Set the KIBANA_PASSWORD environment variable in the .env file";
  15. exit 1;
  16. fi;
  17. if [ ! -f certs/ca.zip ]; then
  18. echo "Creating CA";
  19. bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
  20. unzip config/certs/ca.zip -d config/certs;
  21. fi;
  22. if [ ! -f certs/certs.zip ]; then
  23. echo "Creating certs";
  24. echo -ne \
  25. "instances:\n"\
  26. " - name: es01\n"\
  27. " dns:\n"\
  28. " - es01\n"\
  29. " - localhost\n"\
  30. " ip:\n"\
  31. " - 127.0.0.1\n"\
  32. " - name: es02\n"\
  33. " dns:\n"\
  34. " - es02\n"\
  35. " - localhost\n"\
  36. " ip:\n"\
  37. " - 127.0.0.1\n"\
  38. " - name: es03\n"\
  39. " dns:\n"\
  40. " - es03\n"\
  41. " - localhost\n"\
  42. " ip:\n"\
  43. " - 127.0.0.1\n"\
  44. > config/certs/instances.yml;
  45. bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
  46. unzip config/certs/certs.zip -d config/certs;
  47. fi;
  48. echo "Setting file permissions"
  49. chown -R root:root config/certs;
  50. find . -type d -exec chmod 750 \{\} \;;
  51. find . -type f -exec chmod 640 \{\} \;;
  52. echo "Waiting for Elasticsearch availability";
  53. until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
  54. echo "Setting kibana_system password";
  55. until curl -s -X POST --cacert config/certs/ca/ca.crt -u elastic:${ELASTIC_PASSWORD} -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
  56. echo "All done!";
  57. '
  58. healthcheck:
  59. test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"]
  60. interval: 1s
  61. timeout: 5s
  62. retries: 120
  63. es01:
  64. depends_on:
  65. setup:
  66. condition: service_healthy
  67. image: {docker-repo}:{version}
  68. volumes:
  69. - certs:/usr/share/elasticsearch/config/certs
  70. - esdata01:/usr/share/elasticsearch/data
  71. ports:
  72. - ${ES_PORT}:9200
  73. environment:
  74. - node.name=es01
  75. - cluster.name=${CLUSTER_NAME}
  76. - cluster.initial_master_nodes=es01,es02,es03
  77. - discovery.seed_hosts=es02,es03
  78. - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
  79. - bootstrap.memory_lock=true
  80. - xpack.security.enabled=true
  81. - xpack.security.http.ssl.enabled=true
  82. - xpack.security.http.ssl.key=certs/es01/es01.key
  83. - xpack.security.http.ssl.certificate=certs/es01/es01.crt
  84. - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
  85. - xpack.security.http.ssl.verification_mode=certificate
  86. - xpack.security.transport.ssl.enabled=true
  87. - xpack.security.transport.ssl.key=certs/es01/es01.key
  88. - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
  89. - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
  90. - xpack.security.transport.ssl.verification_mode=certificate
  91. - xpack.license.self_generated.type=${LICENSE}
  92. mem_limit: ${MEM_LIMIT}
  93. ulimits:
  94. memlock:
  95. soft: -1
  96. hard: -1
  97. healthcheck:
  98. test:
  99. [
  100. "CMD-SHELL",
  101. "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
  102. ]
  103. interval: 10s
  104. timeout: 10s
  105. retries: 120
  106. es02:
  107. depends_on:
  108. - es01
  109. image: {docker-repo}:{version}
  110. volumes:
  111. - certs:/usr/share/elasticsearch/config/certs
  112. - esdata02:/usr/share/elasticsearch/data
  113. environment:
  114. - node.name=es02
  115. - cluster.name=${CLUSTER_NAME}
  116. - cluster.initial_master_nodes=es01,es02,es03
  117. - discovery.seed_hosts=es01,es03
  118. - bootstrap.memory_lock=true
  119. - xpack.security.enabled=true
  120. - xpack.security.http.ssl.enabled=true
  121. - xpack.security.http.ssl.key=certs/es02/es02.key
  122. - xpack.security.http.ssl.certificate=certs/es02/es02.crt
  123. - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
  124. - xpack.security.http.ssl.verification_mode=certificate
  125. - xpack.security.transport.ssl.enabled=true
  126. - xpack.security.transport.ssl.key=certs/es02/es02.key
  127. - xpack.security.transport.ssl.certificate=certs/es02/es02.crt
  128. - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
  129. - xpack.security.transport.ssl.verification_mode=certificate
  130. - xpack.license.self_generated.type=${LICENSE}
  131. mem_limit: ${MEM_LIMIT}
  132. ulimits:
  133. memlock:
  134. soft: -1
  135. hard: -1
  136. healthcheck:
  137. test:
  138. [
  139. "CMD-SHELL",
  140. "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
  141. ]
  142. interval: 10s
  143. timeout: 10s
  144. retries: 120
  145. es03:
  146. depends_on:
  147. - es02
  148. image: {docker-repo}:{version}
  149. volumes:
  150. - certs:/usr/share/elasticsearch/config/certs
  151. - esdata03:/usr/share/elasticsearch/data
  152. environment:
  153. - node.name=es03
  154. - cluster.name=${CLUSTER_NAME}
  155. - cluster.initial_master_nodes=es01,es02,es03
  156. - discovery.seed_hosts=es01,es02
  157. - bootstrap.memory_lock=true
  158. - xpack.security.enabled=true
  159. - xpack.security.http.ssl.enabled=true
  160. - xpack.security.http.ssl.key=certs/es03/es03.key
  161. - xpack.security.http.ssl.certificate=certs/es03/es03.crt
  162. - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
  163. - xpack.security.http.ssl.verification_mode=certificate
  164. - xpack.security.transport.ssl.enabled=true
  165. - xpack.security.transport.ssl.key=certs/es03/es03.key
  166. - xpack.security.transport.ssl.certificate=certs/es03/es03.crt
  167. - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
  168. - xpack.security.transport.ssl.verification_mode=certificate
  169. - xpack.license.self_generated.type=${LICENSE}
  170. mem_limit: ${MEM_LIMIT}
  171. ulimits:
  172. memlock:
  173. soft: -1
  174. hard: -1
  175. healthcheck:
  176. test:
  177. [
  178. "CMD-SHELL",
  179. "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
  180. ]
  181. interval: 10s
  182. timeout: 10s
  183. retries: 120
  184. kibana:
  185. depends_on:
  186. es01:
  187. condition: service_healthy
  188. es02:
  189. condition: service_healthy
  190. es03:
  191. condition: service_healthy
  192. image: docker.elastic.co/kibana/kibana:{version}
  193. volumes:
  194. - certs:/usr/share/kibana/config/certs
  195. - kibanadata:/usr/share/kibana/data
  196. ports:
  197. - ${KIBANA_PORT}:5601
  198. environment:
  199. - SERVERNAME=kibana
  200. - ELASTICSEARCH_HOSTS=https://es01:9200
  201. - ELASTICSEARCH_USERNAME=kibana_system
  202. - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
  203. - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
  204. mem_limit: ${MEM_LIMIT}
  205. healthcheck:
  206. test:
  207. [
  208. "CMD-SHELL",
  209. "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
  210. ]
  211. interval: 10s
  212. timeout: 10s
  213. retries: 120
  214. volumes:
  215. certs:
  216. driver: local
  217. esdata01:
  218. driver: local
  219. esdata02:
  220. driver: local
  221. esdata03:
  222. driver: local
  223. kibanadata:
  224. driver: local