From 650d6c8f307cca7da9bed67c2b194a1d8cb8968f Mon Sep 17 00:00:00 2001 From: Gyeongho Yang Date: Sat, 30 Nov 2024 01:19:56 +0900 Subject: [PATCH] feat: enhance docker compose files --- backend/docker/docker-compose-dev.yaml | 141 ++++++------- backend/docker/docker-compose-local.yaml | 139 ++++++------- backend/docker/docker-compose-prod.yaml | 194 +++++++++++------- backend/src/main/resources/logback-spring.xml | 20 +- 4 files changed, 254 insertions(+), 240 deletions(-) diff --git a/backend/docker/docker-compose-dev.yaml b/backend/docker/docker-compose-dev.yaml index 5221ff99..0ed1dc19 100644 --- a/backend/docker/docker-compose-dev.yaml +++ b/backend/docker/docker-compose-dev.yaml @@ -6,6 +6,15 @@ volumes: prom: services: + app: + image: pengcook/pengcook:dev + restart: unless-stopped + environment: + JASYPT_PASSWORD: ${JASYPT_PASSWORD} + TZ: Asia/Seoul + ports: + - 8080:8080 + db: image: mysql:8.0.38 restart: unless-stopped @@ -19,25 +28,34 @@ services: ports: - 3306:3306 command: - - --character-set-server=utf8 - - --collation-server=utf8_general_ci + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_general_ci - app: - image: pengcook/pengcook:dev + grafana: + image: grafana/grafana restart: unless-stopped + volumes: + - grafana:/var/lib/grafana environment: - JASYPT_PASSWORD: ${JASYPT_PASSWORD} - TZ: Asia/Seoul + - GF_SERVER_ROOT_URL=https://dev.mon.pengcook.net ports: - - 8080:8080 - links: - - db - - loki + - 3000:3000 + configs: + - source: grafana-config + target: /etc/grafana/provisioning/datasources/ds.yaml loki: image: grafana/loki restart: unless-stopped - command: -config.file=/etc/loki/local-config.yaml + + prom: + image: prom/prometheus + restart: unless-stopped + volumes: + - prom:/prometheus + configs: + - source: prom-config + target: /prometheus/prometheus.yml node: image: prom/node-exporter @@ -48,70 +66,39 @@ services: volumes: - "/:/host:ro,rslave" - prom: - image: prom/prometheus - restart: unless-stopped - volumes: - - prom:/prometheus - links: - - app - - node - entrypoint: - - sh - - -euc - - | - cat < /prometheus/prometheus.yml - scrape_configs: - - job_name: 'pengcook' - metrics_path: '/actuator/prometheus' - scrape_interval: 15s - static_configs: - - targets: ['app:8080'] - - - job_name: 'node' - scrape_interval: 15s - static_configs: - - targets: ['node:9100'] - EOF - /bin/prometheus - - grafana: - image: grafana/grafana - restart: unless-stopped - volumes: - - grafana:/var/lib/grafana - environment: - - GF_SERVER_ROOT_URL=https://dev.mon.pengcook.net - ports: - - 3000:3000 - links: - - loki - - prom - entrypoint: - - sh - - -euc - - | - mkdir -p /etc/grafana/provisioning/datasources - cat < /etc/grafana/provisioning/datasources/ds.yaml - apiVersion: 1 - datasources: - - name: Loki - type: loki - access: proxy - orgId: 1 - url: http://loki:3100 - basicAuth: false - isDefault: true - version: 1 - editable: false +configs: + grafana-config: + content: | + apiVersion: 1 + datasources: + - name: Loki + type: loki + access: proxy + orgId: 1 + url: http://loki:3100 + basicAuth: false + isDefault: true + version: 1 + editable: false - - name: Prometheus - type: prometheus - access: proxy - orgId: 1 - url: http://prom:9090 - basicAuth: false - isDefault: false - editable: false - EOF - /run.sh + - name: Prometheus + type: prometheus + access: proxy + orgId: 1 + url: http://prom:9090 + basicAuth: false + isDefault: false + editable: false + prom-config: + content: | + scrape_configs: + - job_name: 'pengcook' + metrics_path: '/actuator/prometheus' + scrape_interval: 15s + static_configs: + - targets: ['app:8080'] + + - job_name: 'node' + scrape_interval: 15s + static_configs: + - targets: ['node:9100'] diff --git a/backend/docker/docker-compose-local.yaml b/backend/docker/docker-compose-local.yaml index be1afcec..be87e39d 100644 --- a/backend/docker/docker-compose-local.yaml +++ b/backend/docker/docker-compose-local.yaml @@ -9,6 +9,8 @@ services: db: image: mysql:8.0.38 restart: unless-stopped + ports: + - 3306:3306 environment: MYSQL_DATABASE: pengcook MYSQL_ROOT_PASSWORD: root @@ -16,96 +18,85 @@ services: TZ: Asia/Seoul volumes: - db:/var/lib/mysql - ports: - - 3306:3306 command: - - --character-set-server=utf8 - - --collation-server=utf8_general_ci + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_general_ci + + grafana: + image: grafana/grafana + restart: unless-stopped + ports: + - 3000:3000 + volumes: + - grafana:/var/lib/grafana + environment: + - GF_AUTH_ANONYMOUS_ENABLED=true + - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin + configs: + - source: grafana-config + target: /etc/grafana/provisioning/datasources/ds.yaml loki: image: grafana/loki restart: unless-stopped ports: - 3100:3100 - command: -config.file=/etc/loki/local-config.yaml + + prom: + image: prom/prometheus + restart: unless-stopped + ports: + - 9090:9090 + volumes: + - prom:/prometheus + configs: + - source: prom-config + target: /prometheus/prometheus.yml node: image: prom/node-exporter restart: unless-stopped - pid: host ports: - 9100:9100 + pid: host command: - "--path.rootfs=/host" volumes: - "/:/host:ro" - prom: - image: prom/prometheus - restart: unless-stopped - volumes: - - prom:/prometheus - ports: - - 9090:9090 - links: - - node - entrypoint: - - sh - - -euc - - | - cat < /prometheus/prometheus.yml - scrape_configs: - - job_name: 'pengcook' - metrics_path: '/actuator/prometheus' - scrape_interval: 15s - static_configs: - - targets: ['host.docker.internal:8080'] - - - job_name: 'node' - scrape_interval: 15s - static_configs: - - targets: ['node:9100'] - EOF - /bin/prometheus - - grafana: - image: grafana/grafana - restart: unless-stopped - volumes: - - grafana:/var/lib/grafana - environment: - - GF_AUTH_ANONYMOUS_ENABLED=true - - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - ports: - - 3000:3000 - links: - - loki - - prom - entrypoint: - - sh - - -euc - - | - mkdir -p /etc/grafana/provisioning/datasources - cat < /etc/grafana/provisioning/datasources/ds.yaml - apiVersion: 1 - datasources: - - name: Loki - type: loki - access: proxy - orgId: 1 - url: http://loki:3100 - basicAuth: false - isDefault: true - version: 1 - editable: false +configs: + grafana-config: + content: | + apiVersion: 1 + datasources: + - name: Loki + type: loki + access: proxy + orgId: 1 + url: http://loki:3100 + basicAuth: false + isDefault: true + version: 1 + editable: false - - name: Prometheus - type: prometheus - access: proxy - orgId: 1 - url: http://prom:9090 - basicAuth: false - isDefault: false - editable: false - EOF - /run.sh + - name: Prometheus + type: prometheus + access: proxy + orgId: 1 + url: http://prom:9090 + basicAuth: false + isDefault: false + editable: false + prom-config: + content: | + scrape_configs: + - job_name: 'pengcook' + metrics_path: '/actuator/prometheus' + scrape_interval: 15s + static_configs: + - targets: ['host.docker.internal:8080'] + + - job_name: 'node' + scrape_interval: 15s + static_configs: + - targets: ['node:9100'] diff --git a/backend/docker/docker-compose-prod.yaml b/backend/docker/docker-compose-prod.yaml index 8fb16e38..8fdf255c 100644 --- a/backend/docker/docker-compose-prod.yaml +++ b/backend/docker/docker-compose-prod.yaml @@ -6,9 +6,20 @@ volumes: prom: services: + app: + image: pengcook/pengcook:prod + restart: unless-stopped + environment: + JASYPT_PASSWORD: ${JASYPT_PASSWORD} + TZ: Asia/Seoul + ports: + - 8080:8080 + db: image: mysql:8.0.38 restart: unless-stopped + ports: + - 3306:3306 environment: MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} @@ -16,28 +27,76 @@ services: TZ: Asia/Seoul volumes: - db:/var/lib/mysql - ports: - - 3306:3306 command: - - --character-set-server=utf8 - - --collation-server=utf8_general_ci + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_general_ci + - --server-id=1 + - --log-bin=mysql-bin + - --gtid-mode=ON + - --enforce-gtid-consistency=ON + - --binlog-do-db=pengcook + configs: + - source: db-init + target: /docker-entrypoint-initdb.d/db-init.sql + healthcheck: + test: + [ "CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}" ] + interval: 30s + retries: 5 + start_period: 30s + timeout: 10s - app: - image: pengcook/pengcook:prod + db-ro: + image: mysql:8.0.38 restart: unless-stopped + ports: + - 3307:3306 + depends_on: + db: + condition: service_healthy environment: - JASYPT_PASSWORD: ${JASYPT_PASSWORD} + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + LANG: C.UTF-8 TZ: Asia/Seoul + volumes: + - db-ro:/var/lib/mysql + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_general_ci + - --server-id=2 + - --relay-log=relay-bin + - --read-only=1 + - --gtid-mode=ON + - --enforce-gtid-consistency=ON + configs: + - source: db-ro-init + target: /docker-entrypoint-initdb.d/db-ro-init.sql + + grafana: + image: grafana/grafana + restart: unless-stopped + volumes: + - grafana:/var/lib/grafana + environment: + - GF_SERVER_ROOT_URL=https://mon.pengcook.net ports: - - 8080:8080 - links: - - db - - loki + - 3000:3000 + configs: + - source: grafana-config + target: /etc/grafana/provisioning/datasources/ds.yaml loki: image: grafana/loki restart: unless-stopped - command: -config.file=/etc/loki/local-config.yaml + + prom: + image: prom/prometheus + restart: unless-stopped + volumes: + - prom:/prometheus + configs: + - source: prom-config + target: /prometheus/prometheus.yml node: image: prom/node-exporter @@ -48,70 +107,49 @@ services: volumes: - "/:/host:ro,rslave" - prom: - image: prom/prometheus - restart: unless-stopped - volumes: - - prom:/prometheus - links: - - app - - node - entrypoint: - - sh - - -euc - - | - cat < /prometheus/prometheus.yml - scrape_configs: - - job_name: 'pengcook' - metrics_path: '/actuator/prometheus' - scrape_interval: 15s - static_configs: - - targets: ['app:8080'] - - - job_name: 'node' - scrape_interval: 15s - static_configs: - - targets: ['node:9100'] - EOF - /bin/prometheus - - grafana: - image: grafana/grafana - restart: unless-stopped - volumes: - - grafana:/var/lib/grafana - environment: - - GF_SERVER_ROOT_URL=https://dev.mon.pengcook.net - ports: - - 3000:3000 - links: - - loki - - prom - entrypoint: - - sh - - -euc - - | - mkdir -p /etc/grafana/provisioning/datasources - cat < /etc/grafana/provisioning/datasources/ds.yaml - apiVersion: 1 - datasources: - - name: Loki - type: loki - access: proxy - orgId: 1 - url: http://loki:3100 - basicAuth: false - isDefault: true - version: 1 - editable: false +configs: + db-init: + content: | + ALTER USER 'root'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'root'; + db-ro-init: + content: | + CHANGE REPLICATION SOURCE TO + SOURCE_HOST='db', + SOURCE_USER='root', + SOURCE_PASSWORD='${MYSQL_ROOT_PASSWORD}'; + START REPLICA; + grafana-config: + content: | + apiVersion: 1 + datasources: + - name: Loki + type: loki + access: proxy + orgId: 1 + url: http://loki:3100 + basicAuth: false + isDefault: true + version: 1 + editable: false - - name: Prometheus - type: prometheus - access: proxy - orgId: 1 - url: http://prom:9090 - basicAuth: false - isDefault: false - editable: false - EOF - /run.sh + - name: Prometheus + type: prometheus + access: proxy + orgId: 1 + url: http://prom:9090 + basicAuth: false + isDefault: false + editable: false + prom-config: + content: | + scrape_configs: + - job_name: 'pengcook' + metrics_path: '/actuator/prometheus' + scrape_interval: 15s + static_configs: + - targets: ['app:8080'] + + - job_name: 'node' + scrape_interval: 15s + static_configs: + - targets: ['node:9100'] diff --git a/backend/src/main/resources/logback-spring.xml b/backend/src/main/resources/logback-spring.xml index b2498d36..30dcff83 100644 --- a/backend/src/main/resources/logback-spring.xml +++ b/backend/src/main/resources/logback-spring.xml @@ -24,16 +24,7 @@ app=Pengcook,host=${HOSTNAME},level=%level true - - - { - "level":"%level", - "class":"%logger{36}", - "thread":"%thread", - "message": "%replace(%replace(%message){"\\","\\\\"}){"\"","\\\""}" - } - - + @@ -44,7 +35,14 @@ - + + + + + + + +