Empty reply from the server when running collabora via docker

Hello.

I am running a collabora container following the documentation guide, but cannot get it to accept requests. Using image collabora/code:25.04.5.1.1

I always get an “Empty reply from the server” message:

This even happens If I curl collabora inside it´s own container:

* Host localhost:9980 was resolved.
* IPv6: ::1
* IPv4: 127.0.0.1
*   Trying [::1]:9980...
* Connected to localhost (::1) port 9980
* using HTTP/1.x
> GET / HTTP/1.1
> Host: localhost:9980
> User-Agent: curl/8.14.1
> Accept: */*
>
* Request completely sent off
* Empty reply from server
* shutting down connection #0
curl: (52) Empty reply from server

I don´t see anything special in the logs. I see the server is listening on the expected port:

│ Sec-WebSocket-Key: IQtLzx6G8Z7cTZNWstaRgg==                                                                              │
│ Sec-WebSocket-Version: 13                                                                                                │
│ Accept-Language: en                                                                                                      │
│ Cache-Control: no-cache                                                                                                  │
│ Pragma: no-cache                                                                                                         │
│ | net/HttpRequest.cpp:159                                                                                                │
│ wsd-00001-00021 2025-09-07 09:11:45.578108 +0000 [ prisoner_poll ] TRC  #17: Child connection with URI [/coolws/newchild │
│ wsd-00001-00021 2025-09-07 09:11:45.578155 +0000 [ prisoner_poll ] TRC  #17: New child spawned after 5164ms of requestin │
│ wsd-00001-00021 2025-09-07 09:11:45.578202 +0000 [ prisoner_poll ] INF  #17: New child [27], jailId: RAjnO82DUo2TrgLH, c │
│ wsd-00001-00021 2025-09-07 09:11:45.578206 +0000 [ prisoner_poll ] TRC  #17: Calling make_shared<ChildProcess>, for NewC │
│ wsd-00001-00021 2025-09-07 09:11:45.578207 +0000 [ prisoner_poll ] TRC  #17: Upgrading to WebSocket| net/WebSocketHandle │
│ wsd-00001-00021 2025-09-07 09:11:45.578224 +0000 [ prisoner_poll ] INF  #17: WebSocket version: 13, key: [IQtLzx6G8Z7cTZ │
│ wsd-00001-00021 2025-09-07 09:11:45.578238 +0000 [ prisoner_poll ] TRC  #17: Sending WS Upgrade response: Date: Sun, 07  │
│ Server:                                                                                                                  │
│ Upgrade: websocket                                                                                                       │
│ Connection: Upgrade                                                                                                      │
│ Sec-WebSocket-Accept: 0L1feMcWn6AZa5RR4LQkPnzA/j0=                                                                       │
│ | net/WebSocketHandler.hpp:1051                                                                                          │
│ wsd-00001-00021 2025-09-07 09:11:45.578248 +0000 [ prisoner_poll ] TRC  #17: Wrote 173 bytes of 173 buffered data| net/S │
│ wsd-00001-00021 2025-09-07 09:11:45.578255 +0000 [ prisoner_poll ] INF  ChildProcess ctor [27].| wsd/Process.hpp:40      │
│ wsd-00001-00021 2025-09-07 09:11:45.578265 +0000 [ prisoner_poll ] TRC  Adding a new child 27 with config  to NewChildre │
│ wsd-00001-00021 2025-09-07 09:11:45.578268 +0000 [ prisoner_poll ] INF  Have 1 spare child after adding [27]. Notifying. │
│ wsd-00001-00021 2025-09-07 09:11:45.578283 +0000 [ prisoner_poll ] TRC  #16: Handling poll events of prisoner_poll at in │
│ wsd-00001-00021 2025-09-07 09:11:45.578310 +0000 [ prisoner_poll ] TRC  #15: Handling poll events of prisoner_poll at in │
│ wsd-00001-00021 2025-09-07 09:11:45.578315 +0000 [ prisoner_poll ] TRC  #15: setupPollFds getPollEvents: 0x1| net/Socket │
│ wsd-00001-00021 2025-09-07 09:11:45.578317 +0000 [ prisoner_poll ] TRC  #16: setupPollFds getPollEvents: 0x1| net/Socket │
│ wsd-00001-00021 2025-09-07 09:11:45.578319 +0000 [ prisoner_poll ] TRC  #17: setupPollFds getPollEvents: 0x1| net/Socket │
│ wsd-00001-00001 2025-09-07 09:11:40.413735 +0000 [ coolwsd ] INF  Waiting for a new child for a max of 20000ms| wsd/COOL │
│ wsd-00001-00001 2025-09-07 09:11:45.578364 +0000 [ coolwsd ] TRC  Have 1 new children.| wsd/COOLWSD.cpp:3791             │
│ Ready to accept connections on port 9980.                                                                                │
│                                                                                                                          │
│ frk-00022-00022 2025-09-07 09:11:45.566651 +0000 [ forkit ] INF  Forked kit [27]| kit/ForKit.cpp:567                     │
│ frk-00022-00022 2025-09-07 09:11:45.566701 +0000 [ forkit ] TRC  Forking child took 9ms| kit/ForKit.cpp:578              │
│ frk-00022-00022 2025-09-07 09:11:45.566711 +0000 [ forkit ] INF  Forkit initialization complete: setting log-level to [w │
│ frk-00022-00022 2025-09-07 09:11:45.580328 +0000 [ forkit ] WRN  The systemplate directory [/opt/cool/systemplate] is re │
│ frk-00022-00022 2025-09-07 09:11:45.591550 +0000 [ forkit ] WRN  The systemplate directory [/opt/cool/systemplate] is re │
│ frk-00022-00022 2025-09-07 09:11:45.602860 +0000 [ forkit ] WRN  The systemplate directory [/opt/cool/systemplate] is re │
│ kit-00027-00027 2025-09-07 09:11:45.577990 +0000 [ kit_spare_001 ] TRC  #25: Set socket buffer size to 262144| net/Socke │
│ kit-00027-00027 2025-09-07 09:11:45.577994 +0000 [ kit_spare_001 ] INF  New kit client websocket inserted.| kit/Kit.cpp: │
│ kit-00027-00027 2025-09-07 09:11:45.577998 +0000 [ kit_spare_001 ] INF  Kit initialization complete: setting log-level t │
│ wsd-00001-00021 2025-09-07 09:11:45.578333 +0000 [ prisoner_poll ] TRC  ppoll start, timeoutMicroS: 17988773 size 3| net │
│ wsd-00001-00001 2025-09-07 09:11:45.578378 +0000 [ coolwsd ] INF  WSD initialization complete: setting log-level to [war │
│

I didn´t setup a reverse proxy, as collabora will be running in my internal Kubernetes cluster, and will only be accessible by nextcloud, using the internal service.

hii @Ancient2114

Collabora’s coolwsd does not serve a normal HTTP page on /.
It only exposes a couple of very specific endpoints (/hosting/discovery, /loleaflet/*, /cool/*) that are meant to be consumed by Nextcloud/OwnCloud/Seafile/etc. If you just hit / with curl, it immediately closes the connection, which is why you see “Empty reply from server.”

How to verify it’s working

Instead of:

curl -v http://localhost:9980/

try:

curl -vk http://localhost:9980/hosting/discovery

Thanks
Darshan

Same issue. A

cool@collabora-b99bc56cf-ddbjd:/$ curl -vk http://localhost:9980/hosting/discovery
* Host localhost:9980 was resolved.
* IPv6: ::1
* IPv4: 127.0.0.1
*   Trying [::1]:9980...
* Connected to localhost (::1) port 9980
* using HTTP/1.x
> GET /hosting/discovery HTTP/1.1
> Host: localhost:9980
> User-Agent: curl/8.14.1
> Accept: */*
>
* Request completely sent off
* Empty reply from server
* shutting down connection #0
curl: (52) Empty reply from server

I am not doing anything special. Here is my kubernetes deployment.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: collabora
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: collabora
  template:
    spec:
      serviceAccountName: collabora
      containers:
        - name: collabora
          image: collabora/code:25.04.5.1.1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 9980
              name: http
          env:
            - name: domain
              value: "nextcloud\\.my.\\domain.\\dev"