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