• Docker
  • [Résolu] Drone + Gitea + Nginx (reverse proxy) : auth impossible sous drone

Bonjour à la communauté.
Après un sacré paquet d'heure à écumer la chose, j'en viens à demander de l'aide.

Comme décrit par le titre, l'idée est d'avoir une petite forge logicielle (Gitea) avec une petite plateforme de CI/CD (Drone) afin d'avoir mon petit environnement industrialisé pour mes projets plus ou moins personnels.

Pour ça, j'avais déjà la forge depuis un bout de temps (ainsi que d'autres services) derrière un reverse proxy nginx (celui-ci : https://hub.docker.com/r/neilpang/nginx-proxy/ qui est une version fork de la version de jwilder mais un poil plus permissive) qui s'occupe des certificats Let's Encrypt car tous les services web sont en HTTPS.

Je me réfère à la documentation a priori complète du connecteur gitea de drone ici : https://docs.drone.io/server/provider/gitea/

Et... ça marche pas ! (oui j'ai le droit de le coller 😆 )
Plus précisément :

  • j'ai paramétré une nouvelle application Oauth2 dans Gitea (qui me fourni les id/secret, et dans laquelle je fournis l'url de redirection)
  • dans les variables d'environnements de drone, j'y inclus tout le nécessaire
  • lorsque je vais sur la racine de drone, il me fait bien l'appel pour ensuite autoriser l'application dans Gitea, que j'autorise bien sûr
  • et PAF, après la redirection je me prends sur drone un "Login Failed.... Bad Request" sur l'url drone https://drone.domain.tld/login/error. En détail, le message d'erreur suivant dans les logs de drone : "oauth: cannot exchange code: ..."

Ci-dessous, les détails (docker-compose, conf, etc.) pour y voir plus clair.
Si quelqu'un avait une piste de réflexion (oui car les tutos d'il y a 2 ans ainsi que les problèmes sur stackoverflow qui tapent à côté ou sans réponse, sont non fonctionnels), ça serait super !
docker-compose.yml

version: '2'
services:
  nginx-proxy:
    restart: always
    image: neilpang/nginx-proxy:alpine
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /home/webstack/nginx/certs:/etc/nginx/certs:ro
      - /home/webstack/nginx/vhost.d:/etc/nginx/vhost.d
      - /home/webstack/nginx/conf.d:/etc/nginx/conf.d
      - /home/webstack/nginx/html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - /home/webstack/logs/nginx-error.log:/var/log/nginx/error.log
      - /home/webstack/logs/nginx-access.log:/var/log/nginx/access.log
    networks:
      - mynetwork

  proxy-letsencrypt:
    restart: always
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt
    volumes:
      - /home/webstack/nginx/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - nginx-proxy
    networks:
      - mynetwork
    depends_on:
      - nginx-proxy

 gitea:
    restart: always
    image: gitea/gitea:1
    container_name: gitea
    ports:
      - "3000:3000"
      - "2222:22"
    volumes:
      - /home/gitea:/data:rw
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - VIRTUAL_HOST=git.domain.tld
      - VIRTUAL_PORT=3000
      - HTTP_PROXY=https://gitea.domain.tld:443
      - LETSENCRYPT_HOST=git.domain.tld
      - LETSENCRYPT_EMAIL=tintwo@domain.tld
    networks:
      - mynetwork

  drone-server:
    restart: always
    image: drone/drone:1
    container_name: drone-server
    environment:
      - DRONE_GITEA_SERVER=https://git.domain.tld
      - DRONE_GITEA_CLIENT_ID=${CLIENT_ID_FOR_DRONE_APP_IN_GITEA}
      - DRONE_GITEA_CLIENT_SECRET=${CLIENT_SECRET_FOR_DRONE_APP_IN_GITEA}
      - DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
      - DRONE_SERVER_HOST=drone.domain.tld
      - DRONE_SERVER_PROTO=https
      - VIRTUAL_HOST=drone.domain.tld
      - VIRTUAL_PORT=80
      - HTTP_PROXY=https://drone.domain.tld:443
      - LETSENCRYPT_HOST=drone.domain.tld
      - LETSENCRYPT_EMAIL=tintwo@domain.tld
    networks:
      - mynetwork

networks:
  mynetwork:

Les URLs brutes de mes services sont du coup https://git.domain.tld/ et https://drone.domain.tld/
Voici les logs des conteneurs :

gitea                | [Macaron] 2020-06-15 09:50:32: Started GET /login/oauth/authorize?client_id=08ded900-e90d-469c-bd75-8522021569f5&redirect_uri=https%3A%2F%2Fdrone.domain.tld%2Flogin&response_type=code&state=b80704bb7b4d7c03 for 91.168.185.16
gitea                | [Macaron] 2020-06-15 09:50:32: Completed GET /login/oauth/authorize?client_id=08ded900-e90d-469c-bd75-8522021569f5&redirect_uri=https%3A%2F%2Fdrone.domain.tld%2Flogin&response_type=code&state=b80704bb7b4d7c03 302 Found in 156.974326ms
drone-server         | {"level":"error","msg":"oauth: cannot exchange code: c4pW5tQK3VM8Mfoww-UPT-aJGB79LYdszRC2gsnye-8=: Post \"https://git.domain.tld/login/oauth/access_token\": Bad Request","time":"2020-06-15T09:50:32Z"}
  • Salut,

    Je n'ai pas regardé comment était faite l'image de drone, mais je pense que le soucis vient de la variable HTTP_PROXY=https://drone.domain.tld:443, c'est une variable générique à Linux, qui permets de faire passer tout le trafique par cette url.

Salut,

Je n'ai pas regardé comment était faite l'image de drone, mais je pense que le soucis vient de la variable HTTP_PROXY=https://drone.domain.tld:443, c'est une variable générique à Linux, qui permets de faire passer tout le trafique par cette url.

    Salut, merci pour le fork de nginx-proxy 😉

    xataz OH ! Purée ça fonctionne en commentant cette variable...
    Je savais que ça permettait de forcer tout le trafic sur le port 443 (en tout cas ici), notamment pour forcer l'usage du https sur mes services web qui fournissent que du http.
    Apparemment ça n'empêche pas le reverse proxy de forcer l'usage du https coté web.
    Je suis un poil étonné quand même sachant que l'authentification oauth2 passe par des appels http et donc cela n'aurait normalement pas dû avoir d'incidences, sauf erreur de ma part.

    Je veux bien plus d'éclaircissement sur le fonctionnement de cette var d'env qui, tu dis, est générique.

    Tintwo a renommé le titre en [Résolu] Drone + Gitea + Nginx (reverse proxy) : auth impossible sous drone.
    7 mois plus tard

    Bonjour si tu le souhaites j'ai un compose de gitea + traefik qui force l'https + certificat ( privé ou let's encrypt j'ai les deux).

    Répondre…