diff --git a/growthbook/proxy/docker-compose.yml b/growthbook/proxy/docker-compose.yml index f869cf7f..b58f386c 100644 --- a/growthbook/proxy/docker-compose.yml +++ b/growthbook/proxy/docker-compose.yml @@ -3,7 +3,7 @@ x-stack: platform services: growthbook_proxy: container_name: "growthbook-proxy" - image: growthbook/proxy:v1.3.5 + image: growthbook/proxy:v1.4.0 env_file: .env networks: - default diff --git a/stacks/infrastructure.yml b/stacks/infrastructure.yml index e4bcc6f1..2ec8dc34 100644 --- a/stacks/infrastructure.yml +++ b/stacks/infrastructure.yml @@ -1,44 +1,5 @@ # Generated by stackctl generate — do not edit manually. services: - redis: - image: 'redis:8.10-alpine' - networks: - default: - aliases: - - redis - command: redis-server --appendonly yes - env_file: ./redis/.env - labels: - - 'traefik.enable=${TRAEFIK_ENABLE}' - - 'traefik.tcp.routers.redis.rule=HostSNI(`${HOST}`)' - - traefik.tcp.routers.redis.entrypoints=websecure - - traefik.tcp.routers.redis.service=redis - - traefik.tcp.routers.redis.tls=true - - 'traefik.tcp.routers.redis.tls.certresolver=${CERT_RESOLVER}' - - 'traefik.tcp.services.redis.loadbalancer.server.port=${PORT}' - healthcheck: - test: - - CMD-SHELL - - redis-cli ping | grep -q PONG - interval: 10s - timeout: 5s - retries: 3 - start_period: 20s - logging: - options: - max-size: 10m - max-file: 3 - deploy: - resources: - reservations: - memory: 32M - limits: - memory: 128M - restart_policy: - condition: on-failure - delay: 5s - max_attempts: 0 - window: 120s apisix_dashboard: image: 'apache/apisix-dashboard:3.0.1-alpine' networks: @@ -167,6 +128,90 @@ services: delay: 10s max_attempts: 10 window: 180s + mongo: + image: 'mongo:8.3.8' + networks: + default: + aliases: + - mongo + env_file: + - ./mongo/.env + environment: + - GLIBC_TUNABLES=glibc.pthread.rseq=1 + volumes: + - 'mongo-data:/data/db' + - 'mongo-data:/data/configdb' + labels: + - 'traefik.enable=${TRAEFIK_ENABLE}' + - 'traefik.tcp.routers.mongo.rule=HostSNI(`${HOST}`)' + - traefik.tcp.routers.mongo.entrypoints=websecure + - traefik.tcp.routers.mongo.service=mongo + - traefik.tcp.routers.mongo.tls=true + - 'traefik.tcp.routers.mongo.tls.certresolver=${CERT_RESOLVER}' + - 'traefik.tcp.services.mongo.loadbalancer.server.port=${PORT}' + healthcheck: + test: + - CMD-SHELL + - 'mongosh --quiet --eval "db.runCommand({ping:1}).ok ? quit(0) : quit(1)"' + interval: 10s + timeout: 10s + retries: 5 + start_period: 60s + deploy: + resources: + reservations: + memory: 256M + limits: + memory: 800M + restart_policy: + condition: on-failure + delay: 5s + max_attempts: 0 + window: 120s + logging: + driver: local + options: + max-size: 10m + max-file: 3 + redis: + image: 'redis:8.10-alpine' + networks: + default: + aliases: + - redis + command: redis-server --appendonly yes + env_file: ./redis/.env + labels: + - 'traefik.enable=${TRAEFIK_ENABLE}' + - 'traefik.tcp.routers.redis.rule=HostSNI(`${HOST}`)' + - traefik.tcp.routers.redis.entrypoints=websecure + - traefik.tcp.routers.redis.service=redis + - traefik.tcp.routers.redis.tls=true + - 'traefik.tcp.routers.redis.tls.certresolver=${CERT_RESOLVER}' + - 'traefik.tcp.services.redis.loadbalancer.server.port=${PORT}' + healthcheck: + test: + - CMD-SHELL + - redis-cli ping | grep -q PONG + interval: 10s + timeout: 5s + retries: 3 + start_period: 20s + logging: + options: + max-size: 10m + max-file: 3 + deploy: + resources: + reservations: + memory: 32M + limits: + memory: 128M + restart_policy: + condition: on-failure + delay: 5s + max_attempts: 0 + window: 120s traefik: image: 'traefik:v3.7' networks: @@ -213,51 +258,6 @@ services: limits: memory: 512M cpus: '0.50' - mongo: - image: 'mongo:8.3.8' - networks: - default: - aliases: - - mongo - env_file: - - ./mongo/.env - environment: - - GLIBC_TUNABLES=glibc.pthread.rseq=1 - volumes: - - 'mongo-data:/data/db' - - 'mongo-data:/data/configdb' - labels: - - 'traefik.enable=${TRAEFIK_ENABLE}' - - 'traefik.tcp.routers.mongo.rule=HostSNI(`${HOST}`)' - - traefik.tcp.routers.mongo.entrypoints=websecure - - traefik.tcp.routers.mongo.service=mongo - - traefik.tcp.routers.mongo.tls=true - - 'traefik.tcp.routers.mongo.tls.certresolver=${CERT_RESOLVER}' - - 'traefik.tcp.services.mongo.loadbalancer.server.port=${PORT}' - healthcheck: - test: - - CMD-SHELL - - 'mongosh --quiet --eval "db.runCommand({ping:1}).ok ? quit(0) : quit(1)"' - interval: 10s - timeout: 10s - retries: 5 - start_period: 60s - deploy: - resources: - reservations: - memory: 256M - limits: - memory: 800M - restart_policy: - condition: on-failure - delay: 5s - max_attempts: 0 - window: 120s - logging: - driver: local - options: - max-size: 10m - max-file: 3 portainer: image: 'portainer/portainer-ce:2.44.0' volumes: diff --git a/stacks/observability.yml b/stacks/observability.yml index 8ea9ab59..d007ad4e 100644 --- a/stacks/observability.yml +++ b/stacks/observability.yml @@ -1,68 +1,5 @@ # Generated by stackctl generate — do not edit manually. services: - loki: - image: 'grafana/loki:3.7.5' - command: '-config.file=/etc/loki/config.yaml' - volumes: - - './observability/loki/config.yaml:/etc/loki/config.yaml' - - 'loki-data:/loki' - env_file: ./observability/loki/.env - networks: - default: - aliases: - - loki - logging: - options: - max-size: 10m - max-file: 3 - deploy: - mode: replicated - replicas: 1 - placement: - constraints: - - node.role == manager - restart_policy: - condition: any - resources: - reservations: - memory: 256M - limits: - memory: 800M - grafana: - image: 'grafana/grafana-oss:13.0.2' - volumes: - - 'grafana-data:/var/lib/grafana' - - './observability/grafana/config/provisioning:/etc/grafana/provisioning/' - env_file: ./observability/grafana/.env - labels: - - 'traefik.enable=${TRAEFIK_ENABLE}' - - 'traefik.http.routers.grafana.rule=Host(`${HOST}`)' - - 'traefik.http.routers.grafana.entrypoints=web,websecure' - - traefik.http.routers.grafana.service=grafana - - traefik.http.routers.grafana.tls=true - - 'traefik.http.routers.grafana.tls.certresolver=${CERT_RESOLVER}' - - 'traefik.http.services.grafana.loadbalancer.server.port=${PORT}' - networks: - default: - aliases: - - grafana - logging: - options: - max-size: 10m - max-file: 3 - deploy: - mode: replicated - replicas: 1 - placement: - constraints: - - node.role == manager - restart_policy: - condition: any - resources: - reservations: - memory: 128M - limits: - memory: 512M otel-collector: image: 'otel/opentelemetry-collector-contrib:0.156.0' command: @@ -154,6 +91,41 @@ services: limits: memory: 1200M cpus: '0.80' + grafana: + image: 'grafana/grafana-oss:13.0.2' + volumes: + - 'grafana-data:/var/lib/grafana' + - './observability/grafana/config/provisioning:/etc/grafana/provisioning/' + env_file: ./observability/grafana/.env + labels: + - 'traefik.enable=${TRAEFIK_ENABLE}' + - 'traefik.http.routers.grafana.rule=Host(`${HOST}`)' + - 'traefik.http.routers.grafana.entrypoints=web,websecure' + - traefik.http.routers.grafana.service=grafana + - traefik.http.routers.grafana.tls=true + - 'traefik.http.routers.grafana.tls.certresolver=${CERT_RESOLVER}' + - 'traefik.http.services.grafana.loadbalancer.server.port=${PORT}' + networks: + default: + aliases: + - grafana + logging: + options: + max-size: 10m + max-file: 3 + deploy: + mode: replicated + replicas: 1 + placement: + constraints: + - node.role == manager + restart_policy: + condition: any + resources: + reservations: + memory: 128M + limits: + memory: 512M memcached: image: 'memcached:1.6.45' environment: @@ -202,6 +174,34 @@ services: memory: 256M limits: memory: 600M + loki: + image: 'grafana/loki:3.7.5' + command: '-config.file=/etc/loki/config.yaml' + volumes: + - './observability/loki/config.yaml:/etc/loki/config.yaml' + - 'loki-data:/loki' + env_file: ./observability/loki/.env + networks: + default: + aliases: + - loki + logging: + options: + max-size: 10m + max-file: 3 + deploy: + mode: replicated + replicas: 1 + placement: + constraints: + - node.role == manager + restart_policy: + condition: any + resources: + reservations: + memory: 256M + limits: + memory: 800M beszel: image: 'henrygd/beszel:0.18.7' networks: diff --git a/stacks/platform.yml b/stacks/platform.yml index 8916e861..a1a1b5ea 100644 --- a/stacks/platform.yml +++ b/stacks/platform.yml @@ -1,44 +1,5 @@ # Generated by stackctl generate — do not edit manually. services: - edge-graphql: - image: 'ghcr.io/anitrend/edge-graphql:0.1.15' - networks: - default: - aliases: - - edge-graphql - env_file: ./edge-graphql/.env - labels: - - 'traefik.enable=${TRAEFIK_ENABLE}' - - 'traefik.http.routers.edge-graphql.rule=Host(`${HOST}`)' - - 'traefik.http.routers.edge-graphql.entrypoints=web,websecure' - - traefik.http.routers.edge-graphql.service=edge-graphql - - traefik.http.routers.edge-graphql.tls=true - - 'traefik.http.routers.edge-graphql.tls.certresolver=${CERT_RESOLVER}' - - 'traefik.http.services.edge-graphql.loadbalancer.server.port=${PORT}' - - traefik.http.services.edge-graphql.loadbalancer.healthcheck.path=/health - logging: - driver: local - options: - max-size: 10m - max-file: 3 - deploy: - mode: replicated - replicas: 1 - placement: - constraints: - - node.role == manager - resources: - reservations: - memory: 96M - cpus: '0.10' - limits: - memory: 384M - cpus: '0.50' - restart_policy: - condition: on-failure - delay: 10s - max_attempts: 10 - window: 180s anitrend-edge: image: 'ghcr.io/anitrend/on-the-edge:1.6.6' networks: @@ -76,21 +37,37 @@ services: delay: 10s max_attempts: 10 window: 180s - website: - image: 'ghcr.io/anitrend/website:0.4.2' + growthbook_proxy: + image: 'growthbook/proxy:v1.4.0' + env_file: ./growthbook/proxy/.env networks: default: aliases: - - website - env_file: ./website/.env + - growthbook-proxy labels: - 'traefik.enable=${TRAEFIK_ENABLE}' - - 'traefik.http.routers.website.rule=Host(`${HOST}`)' - - 'traefik.http.routers.website.entrypoints=web,websecure' - - traefik.http.routers.website.service=website - - traefik.http.routers.website.tls=true - - 'traefik.http.routers.website.tls.certresolver=${CERT_RESOLVER}' - - 'traefik.http.services.website.loadbalancer.server.port=${PORT}' + - 'traefik.http.routers.growth-proxy.rule=Host(`${HOST}`)' + - 'traefik.http.services.growth-proxy.loadbalancer.server.port=${PORT}' + - 'traefik.http.routers.growth-proxy.entrypoints=web,websecure' + - traefik.http.routers.growth-proxy.service=growth-proxy + - traefik.http.routers.growth-proxy.tls=true + - 'traefik.http.routers.growth-proxy.tls.certresolver=${CERT_RESOLVER}' + logging: + options: + max-size: 10m + max-file: 3 + healthcheck: + test: + - CMD-SHELL + - |- + node -e "fetch('http://127.0.0.1:3300/healthcheck') + .then(r => r.json()) + .then(d => process.exit(d.ok ? 0 : 1)) + .catch(() => process.exit(1))" + interval: 20s + timeout: 10s + retries: 3 + start_period: 20s deploy: mode: replicated replicas: 1 @@ -102,11 +79,11 @@ services: memory: 64M limits: memory: 256M - logging: - driver: local - options: - max-size: 10m - max-file: 3 + restart_policy: + condition: on-failure + delay: 10s + max_attempts: 10 + window: 180s growthbook: command: - yarn @@ -166,37 +143,27 @@ services: delay: 10s max_attempts: 10 window: 180s - growthbook_proxy: - image: 'growthbook/proxy:v1.3.5' - env_file: ./growthbook/proxy/.env + edge-graphql: + image: 'ghcr.io/anitrend/edge-graphql:0.1.15' networks: default: aliases: - - growthbook-proxy + - edge-graphql + env_file: ./edge-graphql/.env labels: - 'traefik.enable=${TRAEFIK_ENABLE}' - - 'traefik.http.routers.growth-proxy.rule=Host(`${HOST}`)' - - 'traefik.http.services.growth-proxy.loadbalancer.server.port=${PORT}' - - 'traefik.http.routers.growth-proxy.entrypoints=web,websecure' - - traefik.http.routers.growth-proxy.service=growth-proxy - - traefik.http.routers.growth-proxy.tls=true - - 'traefik.http.routers.growth-proxy.tls.certresolver=${CERT_RESOLVER}' + - 'traefik.http.routers.edge-graphql.rule=Host(`${HOST}`)' + - 'traefik.http.routers.edge-graphql.entrypoints=web,websecure' + - traefik.http.routers.edge-graphql.service=edge-graphql + - traefik.http.routers.edge-graphql.tls=true + - 'traefik.http.routers.edge-graphql.tls.certresolver=${CERT_RESOLVER}' + - 'traefik.http.services.edge-graphql.loadbalancer.server.port=${PORT}' + - traefik.http.services.edge-graphql.loadbalancer.healthcheck.path=/health logging: + driver: local options: max-size: 10m max-file: 3 - healthcheck: - test: - - CMD-SHELL - - |- - node -e "fetch('http://127.0.0.1:3300/healthcheck') - .then(r => r.json()) - .then(d => process.exit(d.ok ? 0 : 1)) - .catch(() => process.exit(1))" - interval: 20s - timeout: 10s - retries: 3 - start_period: 20s deploy: mode: replicated replicas: 1 @@ -205,14 +172,47 @@ services: - node.role == manager resources: reservations: - memory: 64M + memory: 96M + cpus: '0.10' limits: - memory: 256M + memory: 384M + cpus: '0.50' restart_policy: condition: on-failure delay: 10s max_attempts: 10 window: 180s + website: + image: 'ghcr.io/anitrend/website:0.4.2' + networks: + default: + aliases: + - website + env_file: ./website/.env + labels: + - 'traefik.enable=${TRAEFIK_ENABLE}' + - 'traefik.http.routers.website.rule=Host(`${HOST}`)' + - 'traefik.http.routers.website.entrypoints=web,websecure' + - traefik.http.routers.website.service=website + - traefik.http.routers.website.tls=true + - 'traefik.http.routers.website.tls.certresolver=${CERT_RESOLVER}' + - 'traefik.http.services.website.loadbalancer.server.port=${PORT}' + deploy: + mode: replicated + replicas: 1 + placement: + constraints: + - node.role == manager + resources: + reservations: + memory: 64M + limits: + memory: 256M + logging: + driver: local + options: + max-size: 10m + max-file: 3 networks: default: name: traefik-public