Unable to login (/api/auth gives 405)

I’m using the docker compose setup. All the services start up, but when I attempt to log in I get an incorrect user name/pass error. Network tab in the browser shows the request to /api/v1/auth returns a 405.

The gateway service logs the error request, but nothing shows up in logs for the api/backend, or any other service.

[10/Apr/2026:02:11:56 +0000] “POST /:///api/v1/auth HTTP/1.1” 405 157 “``http://localhost:25303/login?next=%252Fdiscover”`` “Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0” “-”

Side note: how can I get nginx to skip the discover page and go straight to login?

My docker-compose.yml file

name: taiga

x-environment:
  &default-backend-environment
  LOG_LEVEL: "DEBUG"
  # These environment variables will be used by taiga-back and taiga-async.
  # Database settings
  POSTGRES_DB: "taiga"
  POSTGRES_USER: "${POSTGRES_SERVICE_USER}"
  POSTGRES_PASSWORD: "${POSTGRES_SERVICE_PASSWORD}"
  POSTGRES_HOST: "db"
  # Taiga settings
  TAIGA_SECRET_KEY: "${APP_SECRET}"
  TAIGA_SITES_SCHEME: "http"
  TAIGA_SITES_DOMAIN: "localhost:25303"
  TAIGA_SUBPATH: ""
  WEBSOCKETS_SCHEME: "ws"
  # Email settings.
  EMAIL_BACKEND: "console"
  # Rabbitmq settings
  RABBITMQ_USER: "${RABBITMQ_USER}"
  RABBITMQ_PASS: "${RABBITMQ_PASS}"
  # Telemetry settings
  ENABLE_TELEMETRY: "false"
  # Disable security since we're running with http for now (todo: remove these once we swap to https)
  SESSION_COOKIE_SECURE: "False"
  CSRF_COOKIE_SECURE: "False"

networks:
  app-network:
    driver: bridge

services:
  db:
    image: postgres:18.0
    volumes:
      - c:\.local-lab\taiga\db:/var/lib/postgresql
      - ../../common/postgres-db/db-init.sh:/docker-entrypoint-initdb.d/db-init.sh:ro
    networks:
      - app-network
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_ADMIN_PASSWORD}
      # Needed for init script
      POSTGRES_SERVICE_USER: ${POSTGRES_SERVICE_USER}
      POSTGRES_SERVICE_PASSWORD: ${POSTGRES_SERVICE_PASSWORD}
      POSTGRES_BACKUP_PASSWORD: ${POSTGRES_BACKUP_PASSWORD}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_SERVICE_USER}"]
      interval: 3s
      timeout: 15s
      retries: 5
      start_period: 5s

  taiga-back:
    image: taigaio/taiga-back:6.9.0
    environment: *default-backend-environment
    volumes:
      - e:\.local-lab\taiga\static-data:/taiga-back/static
      - e:\.local-lab\taiga\media-data:/taiga-back/media
    networks:
      - app-network
    depends_on:
      db:
        condition: service_healthy
      taiga-events-rabbitmq:
        condition: service_healthy
      taiga-async-rabbitmq:
        condition: service_healthy

  taiga-async:
    image: taigaio/taiga-back:6.9.0
    entrypoint: ["/taiga-back/docker/async_entrypoint.sh"]
    environment: *default-backend-environment
    volumes:
      - e:\.local-lab\taiga\static-data:/taiga-back/static
      - e:\.local-lab\taiga\media-data:/taiga-back/media
    networks:
      - app-network
    depends_on:
      db:
        condition: service_healthy
      taiga-events-rabbitmq:
        condition: service_healthy
      taiga-async-rabbitmq:
        condition: service_healthy

  taiga-async-rabbitmq:
    image: rabbitmq:3.8-management-alpine
    volumes:
      - c:\.local-lab\taiga\async-rabbitmq-data:/var/lib/rabbitmq
    networks:
      - app-network
    environment:
      RABBITMQ_ERLANG_COOKIE: "${RABBITMQ_ERLANG_COOKIE}"
      RABBITMQ_DEFAULT_USER: "${RABBITMQ_USER}"
      RABBITMQ_DEFAULT_PASS: "${RABBITMQ_PASS}"
      RABBITMQ_DEFAULT_VHOST: "${RABBITMQ_VHOST}"
    hostname: "taiga-async-rabbitmq"
    healthcheck:
      test: ["CMD-SHELL", "rabbitmq-diagnostics -q ping"]
      interval: 3s
      timeout: 15s
      retries: 5
      start_period: 10s

  taiga-front:
    image: taigaio/taiga-front:6.9.0
    networks:
      - app-network
    environment:
      TAIGA_URL: "${TAIGA_SCHEME}://${TAIGA_DOMAIN}"
      TAIGA_WEBSOCKETS_URL: "${WEBSOCKETS_SCHEME}://${TAIGA_DOMAIN}"
      TAIGA_SUBPATH: "${SUBPATH}"

  taiga-events:
    image: taigaio/taiga-events:6.9.0
    networks:
      - app-network
    depends_on:
      taiga-events-rabbitmq:
        condition: service_started
    environment:
      RABBITMQ_USER: "${RABBITMQ_USER}"
      RABBITMQ_PASS: "${RABBITMQ_PASS}"
      TAIGA_SECRET_KEY: "${SECRET_KEY}"

  taiga-events-rabbitmq:
    image: rabbitmq:3.8-management-alpine
    volumes:
      - c:\.local-lab\taiga\events-rabbitmq-data:/var/lib/rabbitmq
    networks:
      - app-network
    environment:
      RABBITMQ_ERLANG_COOKIE: "${RABBITMQ_ERLANG_COOKIE}"
      RABBITMQ_DEFAULT_USER: "${RABBITMQ_USER}"
      RABBITMQ_DEFAULT_PASS: "${RABBITMQ_PASS}"
      RABBITMQ_DEFAULT_VHOST: "${RABBITMQ_VHOST}"
    hostname: "taiga-events-rabbitmq"
    healthcheck:
      test: ["CMD-SHELL", "rabbitmq-diagnostics -q ping"]
      interval: 3s
      timeout: 15s
      retries: 5
      start_period: 3s

  taiga-protected:
    image: taigaio/taiga-protected:6.9.0
    networks:
      - app-network
    environment:
      MAX_AGE: "${ATTACHMENTS_MAX_AGE}"
      SECRET_KEY: "${SECRET_KEY}"

  gateway:
    image: nginx:1.19-alpine
    volumes:
      - ./gateway/taiga.conf:/etc/nginx/conf.d/default.conf
      - e:\.local-lab\taiga\static-data:/taiga-back/static
      - e:\.local-lab\taiga\media-data:/taiga-back/media
    networks:
      - app-network
    ports:
      - "25303:80"
    depends_on:
      - taiga-front
      - taiga-back
      - taiga-events

My nginx.conf file

server {
    listen 80 default_server;

    client_max_body_size 100M;
    charset utf-8;

    # Frontend
    location / {
        proxy_pass http://taiga-front/;
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
    }

    # API
    location /api/ {
        proxy_pass http://taiga-back:8000/api/;
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
    }

    # Admin
    location /admin/ {
        proxy_pass http://taiga-back:8000/admin/;
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
    }

    # Static
    location /static/ {
        alias /taiga/static/;
    }

    # Media
    location /_protected/ {
        internal;
        alias /taiga/media/;
        add_header Content-disposition "attachment";
    }

    # Unprotected section
    location /media/exports/ {
        alias /taiga/media/exports/;
        add_header Content-disposition "attachment";
    }

    location /media/ {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://taiga-protected:8003/;
        proxy_redirect off;
    }

    # Events
    location /events {
        proxy_pass http://taiga-events:8888/events;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_connect_timeout 7d;
        proxy_send_timeout 7d;
        proxy_read_timeout 7d;
    }
}

I followed the taiga-docker install and docs.