pablokbs / peladonerd

Repo con los archivos que uso para mi videos en youtube
2.03k stars 1.33k forks source link

Poste.io y traefik v2.0 #212

Closed panswer closed 2 years ago

panswer commented 2 years ago

Pues bien, tengo el siguiente problema y no se en que punto se pierde la comunicacion.

Primero que nada tengo que decirles que no estoy utilizando kubernets ya que me manejo con solo 1 servidor en el cual tengo varios contenedores corriendo. Ahora en este servidor estoy intentando hacer correr el servidor de poste.io pero obtengo como respuesta Internal Server Error

la configuracion para evitar el conflicto entre traefik y poste.io que le di al contenedor de poste.io es:

version: '3.4'

services:
  poste:
    image: analogic/poste.io
    restart: always
    container_name: server_mail
    expose:
      - 25
      - 110
      - 143
      - 465
      - 587
      - 993
      - 995
    volumes:
      - ./data:/data
    environment:
      - HTTPS=ON
      - DISABLE_CLAMAV=TRUE
    ports:
      - 7080:80
    networks:
      - web
    labels:
      #### Labels define the behavior and rules of the traefik proxy for this container ####
      - "traefik.enable=true" # <== Enable traefik to proxy this container
      - "traefik.http.routers.mail-web.rule=Host(`mail.midominio.com`)" # <== Your Domain Name goes here for the http rule
      - "traefik.http.routers.mail-web.entrypoints=web" # <== Defining the entrypoint for http, **ref: line 30
      - "traefik.http.routers.mail-web.middlewares=redirect@file" # <== This is a middleware to redirect to https
      - "traefik.http.routers.mail-secured.rule=Host(`mail.midominio.com`)" # <== Your Domain Name for the https rule 
      - "traefik.http.routers.mail-secured.entrypoints=web-secured" # <== Defining entrypoint for https, **ref: line 31
      - "traefik.http.routers.mail-secured.tls.certresolver=mytlschallenge" # <== Defining certsresolvers for https

networks:
  web:
    external: true

Si no es mucha molesta en ayudarme en hacer que me permita que ambos trabajen de forma simultanea. Estuve leyendo el issue de nginx y poste.io pero no pude lograr solucionar el problema de proxy inverso con traefik v2

Nota: Deje el puerto 7080 expuesto para ver si estaba corriendo bien y comprendo que al dejar - HTTPS=ON en environment hace que me redireccione de forma automatica a HTTPS.

panswer commented 2 years ago

revisando las peticiones al servidor encontre que el error que da exactamente es: strict-origin-when-cross-origin

Seguire por mi parte de igual forma buscando solucion al problema.

panswer commented 2 years ago

Eh creado el middleware

      - "traefik.http.middlewares.cors.headers.accesscontrolallowmethods=GET,OPTIONS,PUT"
      - "traefik.http.middlewares.cors.headers.accesscontrolalloworigin=origin-list-or-null"
      - "traefik.http.middlewares.cors.headers.accesscontrolmaxage=100"
      - "traefik.http.middlewares.cors.headers.addvaryheader=true"

para CORS desde traefik y le pase el middleware al contenedor del mail - "traefik.http.routers.mail-secured.middlewares=cors@docker" # <== CORS

Sin solucion aun

panswer commented 2 years ago

despues de tanto investigar di con la solucion. El detalle esta en que el propio traefik simplemente necesita mandar todas las peticiones al puerto 80, tambien falto que le colocara el hostname. Por ahora solamente poseo un error y es que, la prueba de outbound para el puerto 25 falla.

version: "3.4"
services:
  poste:
    image: analogic/poste.io
    restart: always
    hostname: "mail.mytestingenlocal.ml"
    container_name: mail
    ports:
      - "25:25"
      # - "80"
      # - 443
      - 110:110
      - 143:143
      - 465:465
      - 587:587
      - 993:993
      - 995:995
      - 4190:4190
    networks:
      - web
    volumes:
      - ./mail:/data
    labels:
      #### Labels define the behavior and rules of the traefik proxy for this container ####
      - "traefik.enable=true" # <== Enable traefik to proxy this container
      - "traefik.http.routers.mail.rule=Host(`mail.mytestingenlocal.ml`)" # <== Your Domain Name for the https rule
      - "traefik.http.routers.mail.entrypoints=web-secured" # <== Defining entrypoint for https, **ref: line 31
      - "traefik.http.routers.mail.tls.certresolver=mytlschallenge" # <== Defining certsresolvers for https
      - "traefik.http.services.mail.loadbalancer.server.port=80" # <== port running

    environment:
      - HTTPS=OFF
      - DISABLE_CLAMAV=TRUE

networks:
  web:
    external: true
stale[bot] commented 2 years ago

Este issue se ha marcado automágicamente como "stale" porque no ha tenido actividad reciente. Va a ser cerrado si no se ve actividad nueva. Intentá hacer tu pregunta en Slack. Gracias por sus contribuciones.

YnievesDotNet commented 4 months ago

Disculpen por volver a abrir el hilo, pero aun no resuelvo el tema

lo estoy haciendo de esta manera para que el posteio maneje el desafio http-01, ya que actualmente los puertos seguros del pop y del imap me dicen que estan mal los certificados, que son autofirmados.

version: '3.9'

services:
 mailserver:
    image: analogic/poste.io
    container_name: mailserver
    restart: unless-stopped
    hostname: ${HOSTNAME}
    labels:
      - traefik.enable=true
      - traefik.http.routers.poste-io-acme.entrypoints=web
      - traefik.http.routers.poste-io-acme.rule=${TRAEFIK_RULES} && PathPrefix(`/.well-known/acme-challenge/`)
      - traefik.http.routers.poste-io-acme.service=poste-io-acme-service
      - traefik.http.routers.poste-io-acme.priority=50
      - traefik.http.services.poste-io-acme-service.loadbalancer.server.port=80
      - traefik.http.routers.poste-io.entrypoints=websecure
      - traefik.http.routers.poste-io.rule=(${TRAEFIK_RULES})
      - traefik.http.routers.poste-io.service=poste-io-service
      - traefik.http.services.poste-io-service.loadbalancer.server.port=80
      - traefik.docker.network=proxy
    environment:
      - HTTPS=OFF
      - TZ=America/Havana
      - DISABLE_CLAMAV=TRUE
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./mail-data:/data
    expose:
      - 80
    ports:
      - "25:25"
      - "110:110"
      - "143:143"
      - "587:587"
      - "993:993"
      - "995:995"
      - "4190:4190"
    networks:
      - mailserver
      - proxy

networks:
  mailserver:
    name: mailserver
  proxy:
    name: proxy

hasta ahi todo bien, pero cuando intento pasar el reto, desde la configuracion del poste.io recibo este mensaje desde el log de traefik time="2024-04-02T12:14:55-04:00" level=error msg="Cannot retrieve the ACME challenge for mail.domain.net (token \"ra6HwDDchYE7FjXdbM-qLz6Ft_rveu8klF1XXsWd9w8\")" providerName=acme

y en el panel del Poste, este

[2024-04-02T12:14:50.116507-04:00] LEScript.INFO: ACME Client: analogic-lescript/0.3.0
[2024-04-02T12:14:50.116735-04:00] LEScript.INFO: Getting list of URLs for API
[2024-04-02T12:14:50.527119-04:00] LEScript.INFO: Requesting new nonce for client communication
[2024-04-02T12:14:50.950950-04:00] LEScript.INFO: Account already registered. Continuing.
[2024-04-02T12:14:50.951118-04:00] LEScript.INFO: Sending registration to letsencrypt server
[2024-04-02T12:14:50.967244-04:00] LEScript.INFO: Sending signed request to https://acme-v02.api.letsencrypt.org/acme/new-acct
[2024-04-02T12:14:51.410699-04:00] LEScript.INFO: Account: https://acme-v02.api.letsencrypt.org/acme/acct/1598271317
[2024-04-02T12:14:51.410821-04:00] LEScript.INFO: Starting certificate generation process for domains
[2024-04-02T12:14:51.411074-04:00] LEScript.INFO: Requesting challenge for mail.domain.net
[2024-04-02T12:14:51.427871-04:00] LEScript.INFO: Sending signed request to https://acme-v02.api.letsencrypt.org/acme/new-order
[2024-04-02T12:14:52.204013-04:00] LEScript.INFO: Sending signed request to https://acme-v02.api.letsencrypt.org/acme/authz-v3/333722105157
[2024-04-02T12:14:52.717429-04:00] LEScript.INFO: Got challenge token for mail.domain.net
[2024-04-02T12:14:52.717891-04:00] LEScript.INFO: Token for mail.domain.net saved at /opt/www//.well-known/acme-challenge/ra6HwDDchYE7FjXdbM-qLz6Ft_rveu8klF1XXsWd9w8 and should be available at http://mail.domain.net/.well-known/acme-challenge/ra6HwDDchYE7FjXdbM-qLz6Ft_rveu8klF1XXsWd9w8
[2024-04-02T12:14:52.717936-04:00] LEScript.INFO: Sending request to challenge
[2024-04-02T12:14:52.733983-04:00] LEScript.INFO: Sending signed request to https://acme-v02.api.letsencrypt.org/acme/chall-v3/333722105157/UN1TcA
[2024-04-02T12:14:53.266161-04:00] LEScript.INFO: Verification pending, sleeping 1s
[2024-04-02T12:14:54.282822-04:00] LEScript.INFO: Sending signed request to https://acme-v02.api.letsencrypt.org/acme/chall-v3/333722105157/UN1TcA
[2024-04-02T12:14:54.723015-04:00] LEScript.INFO: Verification pending, sleeping 4s
[2024-04-02T12:14:58.739385-04:00] LEScript.INFO: Sending signed request to https://acme-v02.api.letsencrypt.org/acme/chall-v3/333722105157/UN1TcA
[2024-04-02T12:14:59.256911-04:00] LEScript.ERROR: 400 {   "type": "urn:ietf:params:acme:error:malformed",   "detail": "Unable to update challenge :: authorization must be pending",   "status": 400 }
[2024-04-02T12:14:59.257018-04:00] LEScript.ERROR: #0 /opt/admin/vendor/analogic/lescript/Lescript.php(580): Analogic\ACME\Client->curl()
[2024-04-02T12:14:59.257051-04:00] LEScript.ERROR: #1 /opt/admin/vendor/analogic/lescript/Lescript.php(448): Analogic\ACME\Client->post()
[2024-04-02T12:14:59.257075-04:00] LEScript.ERROR: #2 /opt/admin/vendor/analogic/lescript/Lescript.php(164): Analogic\ACME\Lescript->signedRequest()
[2024-04-02T12:14:59.257097-04:00] LEScript.ERROR: #3 /opt/admin/src/Base/Handler/LeHandler.php(62): Analogic\ACME\Lescript->signDomains()
[2024-04-02T12:14:59.257125-04:00] LEScript.ERROR: #4 /opt/admin/src/Base/Controller/LeController.php(71): App\Base\Handler\LeHandler->renew()
[2024-04-02T12:14:59.257148-04:00] LEScript.ERROR: #5 /opt/admin/vendor/symfony/http-kernel/HttpKernel.php(163): App\Base\Controller\LeController->issueAction()
[2024-04-02T12:14:59.257174-04:00] LEScript.ERROR: #6 /opt/admin/vendor/symfony/http-kernel/HttpKernel.php(75): Symfony\Component\HttpKernel\HttpKernel->handleRaw()
[2024-04-02T12:14:59.257309-04:00] LEScript.ERROR: #7 /opt/admin/vendor/symfony/http-kernel/Kernel.php(202): Symfony\Component\HttpKernel\HttpKernel->handle()
[2024-04-02T12:14:59.257344-04:00] LEScript.ERROR: #8 /opt/admin/public/index.php(24): Symfony\Component\HttpKernel\Kernel->handle()
[2024-04-02T12:14:59.257374-04:00] LEScript.ERROR: #9 {main}

tal parece que traefik esta asumiendo este reto, sin embargo, por el navegador accedi a http://mail.domain.net/.well-known/acme-challenge/ra6HwDDchYE7FjXdbM-qLz6Ft_rveu8klF1XXsWd9w8 y el reto paso bien, recibi el fichero para descargarlo, con el token dentro y, no escribio nada en el log del traefik, es decir, la regla funciono con el navegador pero no con el LE, debo añadir algo mas las reglas del traefik?

tinolin commented 4 months ago

hola como estas? te cuento como lo resolví yo: use un contenedor algo de "certificate extractor" y lo tiré en un volumen compartido entre este contenedor y el poste, al cual lo configuré por variables de entorno para que busque los certificados ahí y funciona de maravillas. Ahora ya migré a kubernetes y lo hago con crd's asi que no preciso mas cert extractor pero si te interesa busco el compose de como lo tenía.

YnievesDotNet commented 4 months ago

Si, por favor, estoy muy afanado con esto aunque pienso luego pasar a kubernetes, por ahora necesito seguir en esto gracias de antemano