version: '3.9' services: storage: image: alpine:latest container_name: file-storage deploy: resources: limits: memory: 128M reservations: memory: 64M networks: - app-network volumes: - uploads_data:/storage:rw command: tail -f /dev/null restart: unless-stopped # postfix: # image: boky/postfix:latest # container_name: postfix-production # hostname: ${DOMAIN:-no-copy.ru} # environment: # - DOMAIN=${DOMAIN:-no-copy.ru} # - ALLOWED_SENDER_DOMAINS=* # - RELAYHOST= # - DISABLE_SMTP_AUTH= # - SMTP_USERNAME=${MAIL_USERNAME:-noreply@no-copy.ru} # - SMTP_PASSWORD=${SMTP_PASSWORD:-nocopy!nocopy!} # - RELAY_NETWORKS=172.16.0.0/12 # - POSTFIX_mynetworks=127.0.0.0/8 172.17.0.0/16 172.16.0.0/12 # - POSTFIX_smtpd_relay_restrictions=permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination # - POSTFIX_smtpd_recipient_restrictions=permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination # - DISABLE_SIGNING=true # ports: # - "25:25" # - "587:587" # networks: # - app-network # restart: unless-stopped db: image: postgres:17.7 restart: always deploy: resources: limits: cpus: '2.0' memory: 2G reservations: cpus: '1.0' memory: 1G environment: POSTGRES_DB: no_copy_ # POSTGRES_USER: postgres # POSTGRES_PASSWORD: postgres POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_SHARED_BUFFERS: 512MB POSTGRES_EFFECTIVE_CACHE_SIZE: 1536MB ports: - "54320:5432" volumes: - pgdata:/var/lib/postgresql/data - ./init-scripts:/docker-entrypoint-initdb.d:ro container_name: postgres networks: app-network: aliases: - database app: build: . container_name: app-backend deploy: resources: limits: cpus: '1.5' memory: 3G reservations: cpus: '0.5' memory: 2G environment: JAVA_TOOL_OPTIONS: "-Xmx2g -Xms1g -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:+UseContainerSupport -XX:InitialRAMPercentage=50 -XX:MaxRAMPercentage=75" FILE_STORAGE_PATH: /data/uploads MAX_FILE_SIZE: 10737418240 # FILE_CHUNK_SIZE: 1048576 FILE_CHUNK_SIZE: 1000000 POSTGRES_DB: no_copy_ POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_PORT: 5432 POSTGRES_HOST: db STORAGE_SERVICE_URL: http://storage:8081 SPRING_PROFILES_ACTIVE: prod YANDEX_API_KEY: AQVNyaVaUmgUb1GMCtf5zSEqFxy0woXrcMOOB43q YANDEX_FOLDER_ID: b1gokpdbm6qfpsou8pcd YANDEX_SEARCH_URL: "https://searchapi.api.cloud.yandex.net/v2/image/search_by_image" # POSTGRES_USER: postgres # POSTGRES_PASSWORD: postgres # MAIL_HOST: postfix # MAIL_PORT: 25 # MAIL_USERNAME: noreply@no-copy.ru # SMTP_PASSWORD: nocopy!nocopy! # SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE: "false" # SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH: "false" # SPRING_MAIL_PROPERTIES_MAIL_DEBUG: "true" depends_on: - db ports: - "80:8080" networks: app-network: aliases: - app - backend - api volumes: - uploads_data:/data/uploads:rw healthcheck: test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d no_copy_" ] interval: 10s retries: 5 grafana: image: grafana/grafana:10.3.1 container_name: grafana deploy: resources: limits: cpus: '0.5' memory: 512M reservations: memory: 256M ports: - "3000:3000" depends_on: prometheus: condition: service_healthy loki: condition: service_healthy tempo: condition: service_started alloy: condition: service_started environment: GF_AUTH_ANONYMOUS_ENABLED: "true" GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: admin GF_METRICS_ENABLED: "true" GF_DATABASE_MAX_IDLE_CONN: "2" GF_DATABASE_MAX_OPEN_CONN: "10" volumes: - ./infrastructure/grafana/provisioning:/etc/grafana/provisioning - ./infrastructure/grafana/dashboards:/var/lib/grafana/dashboards healthcheck: test: [ "CMD", "wget", "--spider", "http://localhost:3000/api/health" ] interval: 10s timeout: 5s retries: 10 networks: - app-network prometheus: image: prom/prometheus:latest container_name: prometheus deploy: resources: limits: cpus: '0.5' memory: 1G reservations: memory: 512M ports: - "9090:9090" volumes: - ./infrastructure/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=15d' # Удерживать 15 дней - '--web.enable-lifecycle' healthcheck: test: [ "CMD", "wget", "--spider", "http://localhost:9090/-/healthy" ] interval: 10s timeout: 5s retries: 5 networks: - app-network loki: image: grafana/loki:2.9.2 container_name: loki deploy: resources: limits: cpus: '1.0' memory: 2G reservations: memory: 1G ports: - "3100:3100" volumes: - ./infrastructure/loki/loki-config.yaml:/etc/loki/loki-config.yaml:ro - loki_data:/loki command: - -config.file=/etc/loki/loki-config.yaml healthcheck: test: [ "CMD", "wget", "--spider", "-q", "http://localhost:3100/ready" ] interval: 10s timeout: 5s retries: 5 networks: - app-network tempo: image: grafana/tempo:2.4.1 container_name: tempo deploy: resources: limits: cpus: '0.5' memory: 512M reservations: memory: 256M command: [ "-config.file=/etc/tempo/tempo.yaml" ] volumes: - ./infrastructure/tempo/tempo.yaml:/etc/tempo/tempo.yaml - tempo_data:/var/tempo ports: - "3200:3200" networks: - app-network alloy: image: grafana/alloy:latest container_name: alloy deploy: resources: limits: cpus: '0.5' memory: 256M reservations: memory: 128M user: root ports: - "9080:9080" - "4317:4317" - "4318:4318" volumes: - ./infrastructure/alloy/config.alloy:/etc/alloy/config.alloy:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock - /var/log:/var/log:ro environment: GRAFANA_LOKI_URL: http://loki:3100/loki/api/v1/push command: - run - --server.http.listen-addr=0.0.0.0:9080 - --storage.path=/var/lib/alloy/data - /etc/alloy/config.alloy networks: - app-network volumes: pgdata: artifacts: tempo_data: loki_data: loki_chunks: loki_index: loki_rules: uploads_data: prometheus_data: # postfix-data: networks: app-network: external: true driver: bridge