2017-09-11 11 views
12

Mam problem z konfigurowaniem mailcow z traefik, napotykam limity czasu bramki. Też mam ten problem z nextcloud, więc byłbym bardzo zainteresowany, co powoduje te problemy z przekroczeniem czasu bramki. Chyba ma to związek z portem 9000 i php-fpm upstream lub sth. Ale chcę wiedzieć na pewno i jak sobie z tym poradzić.Limit czasu gatewaya przy użyciu narzędzia traefik i php fpm

Moja traefik.toml:

debug = true 
checkNewVersion = true 
defaultEntryPoints = ["http", "https"] 

[web] 
address = ":8080" 
[web.auth.basic] 
users = ["admin:undecipherablestring"] 

[entryPoints] 
    [entryPoints.http] 
    address = ":80" 
    [entryPoints.http.redirect] 
     entryPoint = "https" 
    [entryPoints.https] 
    address = ":443" 
    [entryPoints.https.tls] 

[acme] 
email = "[email protected]" 
storage = "acme.json" 
entryPoint = "https" 
onHostRule = true 

[[acme.domains]] 
    main = "main.com" 
    sans = ["monitor.main.com", "ports.main.com", "git.main.com", "cloud.main.com", "mail.main.com"] 

Moja traefik doker-compose.yml:

version: '2' 
services: 
    proxy: 
    image: traefik 
    container_name: traefik 
    restart: always 
    command: |- 
     --docker 
     --docker.domain=docker.localhost 
     --logLevel=DEBUG 
    networks: 
     - webgateway 
    labels: 
     - "traefik.frontend.rule=Host: monitor.main.com" 
     - "traefik.port=8080" 
    ports: 
     - "80:80" 
     - "443:443" 
     - "8080:8080" 
    volumes: 
     - /var/run/docker.sock:/var/run/docker.sock 
     - ./traefik.toml:/traefik.toml 
     - ./acme.json:/acme.json 
     - acme:/opt/traefik/acme 

networks: 
    webgateway: 
    driver: bridge 

volumes: 
    acme: 
    driver: local 

Moja mailcow doker-compose.yml:

version: '2.1' 
services: 

    unbound-mailcow: 
     image: mailcow/unbound:1.0 
     build: ./data/Dockerfiles/unbound 
     command: /usr/sbin/unbound 
     depends_on: 
     mysql-mailcow: 
      condition: service_healthy 
     healthcheck: 
     test: ["CMD", "nslookup", "google.com", "127.0.0.1"] 
     interval: 30s 
     timeout: 3s 
     retries: 10 
     volumes: 
     - ./data/conf/unbound/unbound.conf:/etc/unbound/unbound.conf:ro 
     restart: always 
     networks: 
     mailcow-network: 
      ipv4_address: 172.22.1.254 
      aliases: 
      - unbound 

    mysql-mailcow: 
     image: mariadb:10.1 
     command: mysqld --max_allowed_packet=128M 
     healthcheck: 
     test: ["CMD", "mysqladmin", "ping", "--host", "localhost", "--silent"] 
     interval: 5s 
     timeout: 5s 
     retries: 10 
     volumes: 
     - mysql-vol-1:/var/lib/mysql/ 
     - ./data/conf/mysql/:/etc/mysql/conf.d/:ro 
     environment: 
     - MYSQL_ROOT_PASSWORD=${DBROOT} 
     - MYSQL_DATABASE=${DBNAME} 
     - MYSQL_USER=${DBUSER} 
     - MYSQL_PASSWORD=${DBPASS} 
     restart: always 
     dns: 
     - 172.22.1.254 
     dns_search: mailcow-network 
     networks: 
     mailcow-network: 
      ipv4_address: 172.22.1.250 
      aliases: 
      - mysql 

    redis-mailcow: 
     image: redis:alpine 
     depends_on: 
     unbound-mailcow: 
      condition: service_healthy 
     volumes: 
     - redis-vol-1:/data/ 
     restart: always 
     dns: 
     - 172.22.1.254 
     dns_search: mailcow-network 
     networks: 
     mailcow-network: 
      ipv4_address: 172.22.1.249 
      aliases: 
      - redis 

    clamd-mailcow: 
     image: mailcow/clamd:1.1 
     build: ./data/Dockerfiles/clamd 
     restart: always 
     environment: 
     - SKIP_CLAMD=${SKIP_CLAMD:-n} 
     dns: 
     - 172.22.1.254 
     dns_search: mailcow-network 
     networks: 
     mailcow-network: 
      aliases: 
      - clamd 

    rspamd-mailcow: 
     image: mailcow/rspamd:1.3 
     build: ./data/Dockerfiles/rspamd 
     command: > 
     /bin/bash -c " 
     sleep 5; 
     /usr/bin/rspamd -f -u _rspamd -g _rspamd 
     " 
     depends_on: 
     - nginx-mailcow 
     volumes: 
     - ./data/conf/rspamd/override.d/:/etc/rspamd/override.d:ro 
     - ./data/conf/rspamd/local.d/:/etc/rspamd/local.d:ro 
     - ./data/conf/rspamd/lua/:/etc/rspamd/lua/:ro 
     - dkim-vol-1:/data/dkim 
     - rspamd-vol-1:/var/lib/rspamd 
     restart: always 
     dns: 
     - 172.22.1.254 
     dns_search: mailcow-network 
     hostname: rspamd 
     networks: 
     mailcow-network: 
      ipv4_address: 172.22.1.253 
      aliases: 
      - rspamd 

    php-fpm-mailcow: 
     image: mailcow/phpfpm:1.0 
     build: ./data/Dockerfiles/phpfpm 
     command: "php-fpm -d date.timezone=${TZ}" 
     depends_on: 
     - redis-mailcow 
     volumes: 
     - ./data/web:/web:ro 
     - ./data/conf/rspamd/dynmaps:/dynmaps:ro 
     - dkim-vol-1:/data/dkim 
     environment: 
     - DBNAME=${DBNAME} 
     - DBUSER=${DBUSER} 
     - DBPASS=${DBPASS} 
     - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} 
     - IMAP_PORT=${IMAP_PORT:-143} 
     - IMAPS_PORT=${IMAPS_PORT:-993} 
     - POP_PORT=${POP_PORT:-110} 
     - POPS_PORT=${POPS_PORT:-995} 
     - SIEVE_PORT=${SIEVE_PORT:-4190} 
     - SUBMISSION_PORT=${SUBMISSION_PORT:-587} 
     - SMTPS_PORT=${SMTPS_PORT:-465} 
     - SMTP_PORT=${SMTP_PORT:-25} 
     restart: always 
     dns: 
     - 172.22.1.254 
     dns_search: mailcow-network 
     networks: 
     mailcow-network: 
      aliases: 
      - phpfpm 

    sogo-mailcow: 
     image: mailcow/sogo:1.3 
     build: ./data/Dockerfiles/sogo 
     depends_on: 
     unbound-mailcow: 
      condition: service_healthy 
     environment: 
     - DBNAME=${DBNAME} 
     - DBUSER=${DBUSER} 
     - DBPASS=${DBPASS} 
     - TZ=${TZ} 
     - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} 
     volumes: 
     - ./data/conf/sogo/:/etc/sogo/ 
     restart: always 
     dns: 
     - 172.22.1.254 
     dns_search: mailcow-network 
     networks: 
     mailcow-network: 
      ipv4_address: 172.22.1.252 
      aliases: 
      - sogo 

    dovecot-mailcow: 
     image: mailcow/dovecot:1.4 
     build: ./data/Dockerfiles/dovecot 
     depends_on: 
     unbound-mailcow: 
      condition: service_healthy 
     volumes: 
     - ./data/conf/dovecot:/usr/local/etc/dovecot 
     - ./data/assets/ssl:/etc/ssl/mail/:ro 
     - ./data/conf/sogo/:/etc/sogo/ 
     - vmail-vol-1:/var/vmail 
     - crypt-vol-1:/mail_crypt/ 
     environment: 
     - DBNAME=${DBNAME} 
     - DBUSER=${DBUSER} 
     - DBPASS=${DBPASS} 
     ports: 
     - "${DOVEADM_PORT:-127.0.0.1:19991}:12345" 
     - "${IMAP_PORT:-143}:143" 
     - "${IMAPS_PORT:-993}:993" 
     - "${POP_PORT:-110}:110" 
     - "${POPS_PORT:-995}:995" 
     - "${SIEVE_PORT:-4190}:4190" 
     restart: always 
     dns: 
     - 172.22.1.254 
     dns_search: mailcow-network 
     hostname: ${MAILCOW_HOSTNAME} 
     networks: 
     mailcow-network: 
      aliases: 
      - dovecot 

    postfix-mailcow: 
     image: mailcow/postfix:1.2 
     build: ./data/Dockerfiles/postfix 
     depends_on: 
     unbound-mailcow: 
      condition: service_healthy 
     volumes: 
     - ./data/conf/postfix:/opt/postfix/conf 
     - ./data/assets/ssl:/etc/ssl/mail/:ro 
     - postfix-vol-1:/var/spool/postfix 
     - crypt-vol-1:/var/lib/zeyple 
     environment: 
     - DBNAME=${DBNAME} 
     - DBUSER=${DBUSER} 
     - DBPASS=${DBPASS} 
     ports: 
     - "${SMTP_PORT:-25}:25" 
     - "${SMTPS_PORT:-465}:465" 
     - "${SUBMISSION_PORT:-587}:587" 
     restart: always 
     dns: 
     - 172.22.1.254 
     dns_search: mailcow-network 
     hostname: ${MAILCOW_HOSTNAME} 
     networks: 
     mailcow-network: 
      aliases: 
      - postfix 

    memcached-mailcow: 
     image: memcached:alpine 
     depends_on: 
     unbound-mailcow: 
      condition: service_healthy 
     restart: always 
     dns: 
     - 172.22.1.254 
     dns_search: mailcow-network 
     networks: 
     mailcow-network: 
      aliases: 
      - memcached 

    nginx-mailcow: 
     depends_on: 
     - sogo-mailcow 
     - php-fpm-mailcow 
     image: nginx:mainline-alpine 
     healthcheck: 
     test: ["CMD", "ping", "php-fpm-mailcow", "-c", "5"] 
     interval: 5s 
     timeout: 5s 
     retries: 10 
     command: /bin/sh -c "envsubst </etc/nginx/conf.d/templates/listen_plain.template> /etc/nginx/conf.d/listen_plain.active && 
     envsubst </etc/nginx/conf.d/templates/listen_ssl.template> /etc/nginx/conf.d/listen_ssl.active && 
     envsubst </etc/nginx/conf.d/templates/server_name.template> /etc/nginx/conf.d/server_name.active && 
     nginx -g 'daemon off;'" 
     environment: 
     - HTTPS_PORT=${HTTPS_PORT:-443} 
     - HTTP_PORT=${HTTP_PORT:-80} 
     - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} 
     volumes: 
     - ./data/web:/web:ro 
     - ./data/conf/rspamd/dynmaps:/dynmaps:ro 
     - ./data/assets/ssl/:/etc/ssl/mail/:ro 
     - ./data/conf/nginx/:/etc/nginx/conf.d/:rw 
     expose: 
     - "${HTTP_PORT:-80}"  
     #ports: 
     #- "${HTTPS_BIND:-0.0.0.0}:${HTTPS_PORT:-443}:${HTTPS_PORT:-443}" 
     #- "${HTTP_BIND:-0.0.0.0}:${HTTP_PORT:-80}:${HTTP_PORT:-80}" 
     restart: always 
     dns: 
     - 172.622.1.254 
     dns_search: mailcow-network 
     labels: 
     - "traefik.frontend.rule=Host: ${MAILCOW_HOSTNAME}" 
     - "traefik.backend=mailcow" 
     - "traefik.port=80" 
     - "traefik.frontend.entryPoints=http,https" 
     - "traefik.docker.network=traefik" 
     networks: 
     mailcow-network: 
      ipv4_address: 172.22.1.251 
      aliases: 
      - nginx 
     traefik: 

    acme-mailcow: 
     depends_on: 
     - nginx-mailcow 
     image: mailcow/acme:1.12 
     build: ./data/Dockerfiles/acme 
     dns: 
     - 172.22.1.254 
     dns_search: mailcow-network 
     environment: 
     - ADDITIONAL_SAN=${ADDITIONAL_SAN} 
     - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} 
     - DBNAME=${DBNAME} 
     - DBUSER=${DBUSER} 
     - DBPASS=${DBPASS} 
     - SKIP_LETS_ENCRYPT=${SKIP_LETS_ENCRYPT:-n} 
     - SKIP_IP_CHECK=${SKIP_IP_CHECK:-n} 
     volumes: 
     - ./data/web/.well-known/acme-challenge:/var/www/acme:rw 
     - ./data/assets/ssl:/var/lib/acme/:rw 
     - ./data/assets/ssl-example:/var/lib/ssl-example/:ro 
     - /var/run/docker.sock:/var/run/docker.sock:ro 
     # do not restart the container too often. Things get worse when we hit let's encrypt's ratelimit. 
     restart: on-failure:1 
     networks: 
     mailcow-network: 
      aliases: 
      - acme 

    fail2ban-mailcow: 
     image: mailcow/fail2ban:1.5 
     build: ./data/Dockerfiles/fail2ban 
     depends_on: 
     - dovecot-mailcow 
     - postfix-mailcow 
     - sogo-mailcow 
     - php-fpm-mailcow 
     - redis-mailcow 
     restart: always 
     privileged: true 
     environment: 
     - TZ=${TZ} 
     - SKIP_FAIL2BAN=${SKIP_FAIL2BAN:-no} 
     network_mode: "host" 
     dns: 
     - 172.22.1.254 
     dns_search: mailcow-network 
     volumes: 
     - /lib/modules:/lib/modules:ro 

    ipv6nat: 
     image: robbertkl/ipv6nat 
     restart: always 
     privileged: true 
     network_mode: "host" 
     volumes: 
     - /var/run/docker.sock:/var/run/docker.sock:ro 
     - /lib/modules:/lib/modules:ro 

networks: 
    mailcow-network: 
    driver: bridge 
    enable_ipv6: true 
    ipam: 
     driver: default 
     config: 
     - subnet: 172.22.1.0/24 
     - subnet: fd4d:6169:6c63:6f77::/64 
    traefik: 
    external: 
     name: traefik_webgateway 

volumes: 
    vmail-vol-1: 
    mysql-vol-1: 
    dkim-vol-1: 
    redis-vol-1: 
    rspamd-vol-1: 
    postfix-vol-1: 
    crypt-vol-1: 
+0

Heyo , serdmanczyk z reddit. Popatrzyłem, ale nie jestem pewien, przepraszam: /. – Serdmanczyk

Odpowiedz

1

Wydaje mi się, że mogłem mieć podobny problem z tym, kim się/doświadczałeś. Spójrz na tego GitHub numerze: https://github.com/containous/traefik/issues/979

Jeśli problem jest taki sam jak mój, oto problem:

Traefik jest na „Przedni” sieci, więc jest jednym z twoich usług, ale ta usługa jest również częścią sieci "zwróconej w kierunku". Domyślnie Traefik nie wie, do jakiej sieci wysłać żądania do ..., więc wysyła je do losowo wybranej z dwóch opcji adresów IP (wybranych podczas tworzenia tego kontenera). Jeśli Traefik nie jest częścią tej sieci, nie będzie w stanie dotrzeć do tego kontenera i da Ci Limit czasu bramki.

Rozwiązanie: dodać etykietę do pojemnika, aby bezpośrednio podać do Traefik jakiej sieci należy komunikować się na:

labels: 
     - "traefik.enable=true" 
     - "traefik.docker.network=<folder prefix>webgateway" 
     - "traefik.backend=<backend service" 
     - "traefik.frontend.rule=Host:<host setting>" 

Pro wskazówka: użyj docker network ls aby dowiedzieć się, co rzeczywisty nazwa sieci jest , ponieważ nie jest to, co zapisuje w pliku doker-compose. Rzeczywista nazwa sieci jest prefiksowana na podstawie nazwy folderu, w którym jest uruchamiana. (Nie wiem dlaczego, i nie podoba mi się to, ale to jest świat, w którym żyjemy)

Stąd <folder prefix> w powyższym przykładzie.

+0

'-" traefik.docker.network = traefik "' Już określiłem sieć, ponieważ już obejrzałem ten problem.Nadal nie działa, to także pytanie, które kontenery muszą być w tej sieci. – metanerd

+0

Wszystkie pojemniki, które muszą rozmawiać z traefik, muszą znajdować się w tej sieci. Upewnij się też, że uruchomiłeś 'docker network ls', ponieważ twoja rzeczywista nazwa sieci nie będzie tak prosta, jak" traefik ", polecenie docker-compose zmienia nazwę, poprzedzając nazwę folderu, w którym uruchamiasz polecenie. Użyj tej prawdziwej nazwy sieci w swojej etykiecie. – CenterOrbit

+0

człowiek, to było to! dziękuję ci, że jesteście tak wytrwali przy mnie. To kurwa działa! Nie zdawałem sobie sprawy, że muszę podać nazwę zewnętrznej sieci, a nie nazwę wewnętrzną dla traefika. cholera, ja taki głupi! Dzięki za tonę! – metanerd

3

myślę, że to kwestia został rozwiązany przez społeczność traefik. Możesz to sprawdzić: https://github.com/containous/traefik/pull/1873

+0

nie, nadal otrzymuję limit czasu bramki i nie mam pojęcia, dlaczego tak się dzieje. – metanerd

+0

Dam ci nagrodę, ponieważ wygasa, ale to w ogóle nie odpowiada na moje pytanie. – metanerd

+0

Dziękuję bardzo. Wciąż w to wrabiam. Mam nadzieję, że mogę pomóc. –

1

To co robię jest zdefiniowane w pliku o nazwie .env w tym samym katalogu co docker-compose.yml zmienną dla nazwy projektu (która kończy się jako prefiks dla wszystkich kontenerów/sieci/itp.). Powinien on zawierać tylko znaki, bez spacji, kresek itp

COMPOSE_PROJECT_NAME=myproject 

Następnie w etykiecie aplikacji, należy użyć nazwy zmiennej dołączany z utworzonej sieci oddzielonej przez „_”:

- "traefik.docker.network=${COMPOSE_PROJECT_NAME}_mynetwork"