Problem when request internal API with other container

Hello, I am working on a project where I need to host several websites on the same server, for this I turned to traefik, I managed to configure everything correctly, I can access my sites on my different subdomains. However I have an error when I want to communicate between these different sites, I have 3 services that run on my traefik, an API, a main website and an admin website. The admin website and the main website need to make requests on the API but it's unfortunately impossible, both sites return a 500 error with a timeout as below:

admin_1        | Error: connect ETIMEDOUT 141.94.247.71:443
admin_1        |     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1161:16) {
admin_1        |   errno: -110,
admin_1        |   code: 'ETIMEDOUT',
admin_1        |   syscall: 'connect',
admin_1        |   address: '141.94.247.71',
admin_1        |   port: 443,
admin_1        |   config: {
admin_1        |     transitional: {
admin_1        |       silentJSONParsing: true,
admin_1        |       forcedJSONParsing: true,
admin_1        |       clarifyTimeoutError: false
admin_1        |     },
admin_1        |     adapter: [Function: httpAdapter],
admin_1        |     transformRequest: [ [Function: transformRequest] ],
admin_1        |     transformResponse: [ [Function: transformResponse] ],
admin_1        |     timeout: 0,
admin_1        |     xsrfCookieName: 'XSRF-TOKEN',
admin_1        |     xsrfHeaderName: 'X-XSRF-TOKEN',
admin_1        |     maxContentLength: -1,
admin_1        |     maxBodyLength: -1,
admin_1        |     validateStatus: [Function: validateStatus],
admin_1        |     headers: {
admin_1        |       Accept: 'application/json, text/plain, */*',
admin_1        |       'User-Agent': 'axios/0.24.0'
admin_1        |     },
admin_1        |     baseURL: 'https://api.victorbillaud.fr',
admin_1        |     method: 'get',
admin_1        |     url: '/articles',
admin_1        |     data: undefined
admin_1        |   },
admin_1        |   request: <ref *1> Writable {
admin_1        |     _writableState: WritableState {
admin_1        |       objectMode: false,
admin_1        |       highWaterMark: 16384,
admin_1        |       finalCalled: false,
admin_1        |       needDrain: false,
admin_1        |       ending: false,
admin_1        |       ended: false,
admin_1        |       finished: false,
admin_1        |       destroyed: false,
admin_1        |       decodeStrings: true,
admin_1        |       defaultEncoding: 'utf8',
admin_1        |       length: 0,
admin_1        |       writing: false,
admin_1        |       corked: 0,
admin_1        |       sync: true,
admin_1        |       bufferProcessing: false,
admin_1        |       onwrite: [Function: bound onwrite],
admin_1        |       writecb: null,
admin_1        |       writelen: 0,
admin_1        |       afterWriteTickInfo: null,
admin_1        |       buffered: [],
admin_1        |       bufferedIndex: 0,
admin_1        |       allBuffers: true,
admin_1        |       allNoop: true,
admin_1        |       pendingcb: 0,
admin_1        |       constructed: true,
admin_1        |       prefinished: false,
admin_1        |       errorEmitted: false,
admin_1        |       emitClose: true,
admin_1        |       autoDestroy: true,
admin_1        |       errored: null,
admin_1        |       closed: false,
admin_1        |       closeEmitted: false,
admin_1        |       [Symbol(kOnFinished)]: []
admin_1        |     },
admin_1        |     _events: [Object: null prototype] {
admin_1        |       response: [Function: handleResponse],
admin_1        |       error: [Function: handleRequestError]
admin_1        |     },
admin_1        |     _eventsCount: 2,
admin_1        |     _maxListeners: undefined,
admin_1        |     _options: {
admin_1        |       maxRedirects: 21,
admin_1        |       maxBodyLength: 10485760,
admin_1        |       protocol: 'https:',
admin_1        |       path: '/articles',
admin_1        |       method: 'GET',
admin_1        |       headers: [Object],
admin_1        |       agent: undefined,
admin_1        |       agents: [Object],
admin_1        |       auth: undefined,
admin_1        |       hostname: 'api.victorbillaud.fr',
admin_1        |       port: null,
admin_1        |       nativeProtocols: [Object],
admin_1        |       pathname: '/articles'
admin_1        |     },
admin_1        |     _ended: true,
admin_1        |     _ending: true,
admin_1        |     _redirectCount: 0,
admin_1        |     _redirects: [],
admin_1        |     _requestBodyLength: 0,
admin_1        |     _requestBodyBuffers: [],
admin_1        |     _onNativeResponse: [Function (anonymous)],
admin_1        |     _currentRequest: ClientRequest {
admin_1        |       _events: [Object: null prototype],
admin_1        |       _eventsCount: 7,
admin_1        |       _maxListeners: undefined,
admin_1        |       outputData: [],
admin_1        |       outputSize: 0,
admin_1        |       writable: true,
admin_1        |       destroyed: false,
admin_1        |       _last: true,
admin_1        |       chunkedEncoding: false,
admin_1        |       shouldKeepAlive: false,
admin_1        |       maxRequestsOnConnectionReached: false,
admin_1        |       _defaultKeepAlive: true,
admin_1        |       useChunkedEncodingByDefault: false,
admin_1        |       sendDate: false,
admin_1        |       _removedConnection: false,
admin_1        |       _removedContLen: false,
admin_1        |       _removedTE: false,
admin_1        |       _contentLength: 0,
admin_1        |       _hasBody: true,
admin_1        |       _trailer: '',
admin_1        |       finished: true,
admin_1        |       _headerSent: true,
admin_1        |       _closed: false,
admin_1        |       socket: [TLSSocket],
admin_1        |       _header: 'GET /articles HTTP/1.1\r\n' +
admin_1        |         'Accept: application/json, text/plain, */*\r\n' +
admin_1        |         'User-Agent: axios/0.24.0\r\n' +
admin_1        |         'Host: api.victorbillaud.fr\r\n' +
admin_1        |         'Connection: close\r\n' +
admin_1        |         '\r\n',
admin_1        |       _keepAliveTimeout: 0,
admin_1        |       _onPendingData: [Function: nop],
admin_1        |       agent: [Agent],
admin_1        |       socketPath: undefined,
admin_1        |       method: 'GET',
admin_1        |       maxHeaderSize: undefined,
admin_1        |       insecureHTTPParser: undefined,
admin_1        |       path: '/articles',
admin_1        |       _ended: false,
admin_1        |       res: null,
admin_1        |       aborted: false,
admin_1        |       timeoutCb: null,
admin_1        |       upgradeOrConnect: false,
admin_1        |       parser: null,
admin_1        |       maxHeadersCount: null,
admin_1        |       reusedSocket: false,
admin_1        |       host: 'api.victorbillaud.fr',
admin_1        |       protocol: 'https:',
admin_1        |       _redirectable: [Circular *1],
admin_1        |       [Symbol(kCapture)]: false,
admin_1        |       [Symbol(kNeedDrain)]: false,
admin_1        |       [Symbol(corked)]: 0,
admin_1        |       [Symbol(kOutHeaders)]: [Object: null prototype]
admin_1        |     },
admin_1        |     _currentUrl: 'https://api.victorbillaud.fr/articles',
admin_1        |     [Symbol(kCapture)]: false
admin_1        |   },
admin_1        |   response: undefined,
admin_1        |   isAxiosError: true,
admin_1        |   toJSON: [Function: toJSON]
admin_1        | } 

I also try to make a request from the admin container to the api container as below, but I get the same error...

* Expire in 0 ms for 6 (transfer 0x564403ffbfb0)
* Expire in 1 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 0 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 2 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 0 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 0 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 2 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 0 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 1 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 2 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 1 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 1 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 2 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 1 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 1 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 4 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 2 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 2 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 4 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 2 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 2 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 4 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 2 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 3 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 4 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 3 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 3 ms for 1 (transfer 0x564403ffbfb0)
* Expire in 3 ms for 1 (transfer 0x564403ffbfb0)
*   Trying 141.94.247.71...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x564403ffbfb0)
* connect to 141.94.247.71 port 443 failed: Connection timed out
* Failed to connect to api.victorbillaud.fr port 443: Connection timed out
* Closing connection 0
curl: (7) Failed to connect to api.victorbillaud.fr port 443: Connection timed out

Thank you for your help, I post here my traefik configuration files

docker-compose.yml

version: '3.2'

services:
  traefik:
    image: traefik:2.5
    restart: unless-stopped
    networks:
      - proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./config/traefik.yml:/traefik.yml
      - ./letsencrypt/acme.json:/acme.json
      - /var/run/docker.sock:/var/run/docker.sock

  nginx:
    image: nginx:latest
    networks:
      - proxy
    labels:
      # Traefik configuration, Hostname needs to be changed
      - traefik.http.routers.nginx-http.rule=Host(`victorbillaud.fr`)
      - traefik.http.routers.nginx-http.entrypoints=http
      - traefik.http.routers.nginx-http.middlewares=redirect
      - traefik.http.routers.nginx-https.rule=Host(`victorbillaud.fr`)
      - traefik.http.routers.nginx-https.entrypoints=https
      - traefik.http.routers.nginx-https.tls=true
      - traefik.http.routers.nginx-https.tls.certresolver=letsencrypt
      - traefik.http.services.nginx.loadbalancer.server.port=80
      - traefik.http.middlewares.redirect.redirectscheme.scheme=https

  admin:
    image: admin
    networks:
      - proxy
    ports:
      - 3001:3001
    labels:
      # Traefik configuration, Hostname needs to be changed
      - traefik.http.routers.admin-http.rule=Host(`admin.victorbillaud.fr`)
      - traefik.http.routers.admin-http.entrypoints=http
      - traefik.http.routers.admin-http.middlewares=redirect
      - traefik.http.routers.admin-https.rule=Host(`admin.victorbillaud.fr`)
      - traefik.http.routers.admin-https.entrypoints=https
      - traefik.http.routers.admin-https.tls=true
      - traefik.http.routers.admin-https.tls.certresolver=letsencrypt
      - traefik.http.services.admin.loadbalancer.server.port=3001
      - traefik.http.middlewares.redirect.redirectscheme.scheme=https

  api-express:
    image: api-express
    networks:
      - proxy
    labels:
      # Traefik configuration, Hostname needs to be changed
      - traefik.http.routers.api-http.rule=Host(`api.victorbillaud.fr`)
      - traefik.http.routers.api-http.entrypoints=http
      - traefik.http.routers.api-http.middlewares=redirect
      - traefik.http.routers.api-https.rule=Host(`api.victorbillaud.fr`)
      - traefik.http.routers.api-https.entrypoints=https
      - traefik.http.routers.api-https.tls=true
      - traefik.http.routers.api-https.tls.certresolver=letsencrypt
      - traefik.http.services.api.loadbalancer.server.port=3002
      - traefik.http.middlewares.redirect.redirectscheme.scheme=https

#  ffmepdl:
#   image: ffmepdl
#    networks:
#      - proxy
#    labels:
#      # Traefik configuration, Hostname needs to be changed
#      - traefik.http.routers.ffmepdl-http.rule=Host(`ffmepdl.victorbillaud.fr`)
#      - traefik.http.routers.ffmepdl-http.entrypoints=http
#      - traefik.http.routers.ffmepdl-http.middlewares=redirect
#      - traefik.http.routers.ffmepdl-https.rule=Host(`ffmepdl.victorbillaud.fr`)
#      - traefik.http.routers.ffmepdl-https.entrypoints=https
#      - traefik.http.routers.ffmepdl-https.tls=true
#      - traefik.http.routers.ffmepdl-https.tls.certresolver=letsencrypt
#      - traefik.http.services.ffmepdl.loadbalancer.server.port=3000
#      - traefik.http.middlewares.redirect.redirectscheme.scheme=https 

traefik.yml :

api:
  dashboard: true
  insecure: false

entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"

providers:
  docker:
    network: proxy

certificatesResolvers:
  letsencrypt:
    acme:
      email: victorbillaud@gmail.com
      storage: acme.json
      httpChallenge:
        entryPoint: http

Thank you