You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

template-stack.yml 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. version: '3.8'
  2. networks:
  3. web-net:
  4. attachable: true
  5. driver: overlay
  6. db-net:
  7. attachable: true
  8. driver: overlay
  9. portainer-net:
  10. attachable: true
  11. driver: overlay
  12. volumes:
  13. web-data:
  14. driver: glusterfs
  15. name: "data/traefik"
  16. db-data:
  17. driver: glusterfs
  18. name: "data/mysql"
  19. portainer-data:
  20. driver: glusterfs
  21. name: "data/portainer"
  22. secrets:
  23. traefik-users:
  24. external: true
  25. services:
  26. proxy:
  27. image: "traefik:v2.2"
  28. command:
  29. #- "--log.level=DEBUG"
  30. - "--api"
  31. - "--api.dashboard=true"
  32. - "--certificatesresolvers.le.acme.httpchallenge=true"
  33. - "--certificatesresolvers.le.acme.httpchallenge.entrypoint=http"
  34. - "--entrypoints.http.address=:80"
  35. - "--entrypoints.https.address=:443"
  36. - "--certificatesresolvers.le.acme.email=daniel.huebleitner@gmail.com"
  37. - "--certificatesresolvers.le.acme.storage=/etc/letsencrypt/acme.json"
  38. # - "--certificatesresolvers.le.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
  39. - "--providers.docker=true"
  40. - "--providers.docker.exposedbydefault=false"
  41. - "--providers.docker.swarmMode=true"
  42. - "--global.sendanonymoususage=false"
  43. secrets:
  44. - traefik-users
  45. ports:
  46. - "80:80"
  47. - "443:443"
  48. networks:
  49. - web-net
  50. volumes:
  51. - "web-data:/etc/letsencrypt"
  52. - "/var/run/docker.sock:/var/run/docker.sock:ro"
  53. deploy:
  54. mode: replicated
  55. replicas: 1
  56. update_config:
  57. failure_action: rollback
  58. order: start-first
  59. monitor: 60s
  60. rollback_config:
  61. failure_action: pause
  62. order: start-first
  63. monitor: 60s
  64. placement:
  65. constraints:
  66. - node.role==manager
  67. resources:
  68. limits:
  69. cpus: '0.9'
  70. memory: 1G
  71. reservations:
  72. cpus: '0.5'
  73. memory: 500M
  74. restart_policy:
  75. condition: any
  76. delay: 5s
  77. max_attempts: 10
  78. window: 50s
  79. labels:
  80. - traefik.enable=true
  81. - traefik.docker.network=armory_web-net
  82. - traefik.http.middlewares.admin-auth.basicauth.usersfile=/run/secrets/traefik-users
  83. - traefik.http.middlewares.https-redirect.redirectscheme.scheme=https
  84. - traefik.http.middlewares.https-redirect.redirectscheme.permanent=true
  85. - traefik.http.routers.traefik-api-http.rule=Host(`traefik.theclassicarmory.com`)
  86. - traefik.http.routers.traefik-api-http.entrypoints=http
  87. - traefik.http.routers.traefik-api-http.middlewares=https-redirect
  88. - traefik.http.routers.traefik-api-https.rule=Host(`traefik.theclassicarmory.com`)
  89. - traefik.http.routers.traefik-api-https.entrypoints=https
  90. - traefik.http.routers.traefik-api-https.tls=true
  91. - traefik.http.routers.traefik-api-https.service=api@internal
  92. - traefik.http.routers.traefik-api-https.tls.certresolver=le
  93. - traefik.http.routers.traefik-api-https.middlewares=admin-auth
  94. - traefik.http.services.traefik-api.loadbalancer.server.port=8080
  95. app:
  96. image: hub.monkey.software/theclassicarmory.com/app:latest
  97. networks:
  98. - web-net
  99. - db-net
  100. depends_on:
  101. - db
  102. deploy:
  103. mode: replicated
  104. replicas: 1
  105. update_config:
  106. failure_action: rollback
  107. order: start-first
  108. monitor: 60s
  109. rollback_config:
  110. parallelism: 0
  111. failure_action: continue
  112. delay: 0s
  113. order: start-first
  114. monitor: 60s
  115. placement:
  116. constraints:
  117. - node.role==worker
  118. resources:
  119. limits:
  120. cpus: '1'
  121. memory: 1G
  122. reservations:
  123. cpus: '0.5'
  124. memory: 300M
  125. restart_policy:
  126. delay: 5s
  127. max_attempts: 10
  128. window: 50s
  129. labels:
  130. - traefik.enable=true
  131. - traefik.docker.network=armory_web-net
  132. - traefik.http.middlewares.armory-https-redirect.redirectscheme.scheme=https
  133. - traefik.http.middlewares.armory-https-redirect.redirectscheme.permanent=true
  134. - traefik.http.routers.armory-app-http.rule=Host(`www.theclassicarmory.com`)
  135. - traefik.http.routers.armory-app-http.entrypoints=http
  136. - traefik.http.routers.armory-app-http.middlewares=armory-https-redirect
  137. - traefik.http.routers.armory-app-https.rule=Host(`www.theclassicarmory.com`)
  138. - traefik.http.routers.armory-app-https.entrypoints=https
  139. - traefik.http.routers.armory-app-https.tls=true
  140. - traefik.http.routers.armory-app-https.tls.certresolver=le
  141. - traefik.http.services.armory-app.loadbalancer.server.port=8080
  142. db:
  143. image: mariadb:10.5.5
  144. environment:
  145. - MYSQL_ROOT_PASSWORD=evenmuchmoresecreter
  146. - MYSQL_PASSWORD=muchsecretwow
  147. - MYSQL_DATABASE=armory
  148. - MYSQL_USER=armory-app
  149. networks:
  150. - db-net
  151. volumes:
  152. - db-data:/var/lib/mysql
  153. stop_grace_period: 60s
  154. deploy:
  155. mode: replicated
  156. replicas: 1
  157. update_config:
  158. failure_action: rollback
  159. order: stop-first
  160. monitor: 60s
  161. rollback_config:
  162. order: start-first
  163. monitor: 60s
  164. placement:
  165. constraints:
  166. - node.role==worker
  167. resources:
  168. limits:
  169. cpus: '1.5'
  170. memory: 1.5G
  171. reservations:
  172. cpus: '0.5'
  173. memory: 500M
  174. restart_policy:
  175. delay: 5s
  176. max_attempts: 30
  177. window: 150s
  178. portainer-agent:
  179. image: portainer/agent:linux-amd64-2.0.0-alpine
  180. volumes:
  181. - "/var/run/docker.sock:/var/run/docker.sock"
  182. - "/var/lib/docker/volumes:/var/lib/docker/volumes"
  183. environment:
  184. AGENT_CLUSTER_ADDR: "tasks.portainer-agent"
  185. networks:
  186. - portainer-net
  187. deploy:
  188. mode: global
  189. update_config:
  190. parallelism: 1
  191. failure_action: rollback
  192. delay: 30s
  193. order: stop-first
  194. monitor: 60s
  195. rollback_config:
  196. parallelism: 0
  197. failure_action: continue
  198. delay: 0s
  199. order: stop-first
  200. monitor: 15s
  201. placement:
  202. max_replicas_per_node: 1
  203. constraints:
  204. - "node.platform.os==linux"
  205. - "node.platform.arch==x86_64"
  206. resources:
  207. limits:
  208. cpus: '0.3'
  209. memory: 100M
  210. reservations:
  211. cpus: '0.1'
  212. memory: 50M
  213. restart_policy:
  214. condition: any
  215. delay: 5s
  216. max_attempts: 10
  217. window: 50s
  218. portainer-server:
  219. image: portainer/portainer-ce:alpine
  220. command: -H tcp://tasks.portainer-agent:9001 --tlsskipverify
  221. volumes:
  222. - "/var/run/docker.sock:/var/run/docker.sock"
  223. - "portainer-data:/data"
  224. networks:
  225. - web-net
  226. - portainer-net
  227. deploy:
  228. mode: replicated
  229. replicas: 1
  230. update_config:
  231. failure_action: rollback
  232. order: start-first
  233. monitor: 60s
  234. rollback_config:
  235. parallelism: 0
  236. failure_action: continue
  237. delay: 0s
  238. order: start-first
  239. monitor: 60s
  240. placement:
  241. constraints:
  242. - node.role==manager
  243. resources:
  244. limits:
  245. cpus: '0.4'
  246. memory: 300M
  247. reservations:
  248. cpus: '0.2'
  249. memory: 100M
  250. restart_policy:
  251. delay: 5s
  252. max_attempts: 10
  253. window: 50s
  254. labels:
  255. - traefik.enable=true
  256. - traefik.docker.network=armory_web-net
  257. - traefik.http.middlewares.https-redirect.redirectscheme.scheme=https
  258. - traefik.http.middlewares.https-redirect.redirectscheme.permanent=true
  259. - traefik.http.routers.portainer-app-http.rule=Host(`port.theclassicarmory.com`)
  260. - traefik.http.routers.portainer-app-http.entrypoints=http
  261. - traefik.http.routers.portainer-app-http.middlewares=https-redirect
  262. - traefik.http.routers.portainer-app-https.rule=Host(`port.theclassicarmory.com`)
  263. - traefik.http.routers.portainer-app-https.entrypoints=https
  264. - traefik.http.routers.portainer-app-https.tls=true
  265. - traefik.http.routers.portainer-app-https.tls.certresolver=le
  266. - traefik.http.services.portainer-app.loadbalancer.server.port=9000