processone / ejabberd-contrib

Growing and curated ejabberd contributions repository - PR or ask to join !
http://ejabberd.im
250 stars 137 forks source link

The dependency library doesn't exist in the docker image (cuesport library for ejabberd_auth_http module) #326

Closed kacperjurak closed 3 months ago

kacperjurak commented 11 months ago

Hi, I use ejabberd in docker-compose.yml (at M1 Mac but I think this doesn't matter):

 ejabberd:
    image: ghcr.io/processone/ejabberd
    ...

When I install ejabberd_auth_http module and change ejabberd.yml config file to:

auth_method: http
auth_opts:
  host: "http://localhost:12000"

ejabberd stops working. For example, when I try to refresh admin page at web GUI I'm getting an error (full error at the end):

2023-11-04 18:10:42.636646+00:00 [info] (<0.997.0>) Accepted connection [::ffff:192.168.65.1]:45126 -> [::ffff:172.21.0.3]:5280
2023-11-04 18:10:44.712044+00:00 [error] HTTP handler crashed: exception error: undefined function cuesport:get_worker/1
   in function  ejabberd_auth_http:make_req/5 (/opt/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/ejabberd_auth_http/src/ejabberd_auth_http.erl, line 213)

It looks like the library cuesport, which is a dependency for an ejabberd_auth_http module is not present in the docker build. I think ejabberdctl module_install must be broken in this docker image because there's no way to compile a dependency library while running Alpine Linux (without any compile tools).

Full error below:

2023-11-04 18:10:42.636646+00:00 [info] (<0.997.0>) Accepted connection [::ffff:192.168.65.1]:45126 -> [::ffff:172.21.0.3]:5280
2023-11-04 18:10:44.712044+00:00 [error] HTTP handler crashed: exception error:
 undefined function cuesport:get_worker/1
   in function  ejabberd_auth_http:make_req/5 (/opt/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/ejabberd_auth_http/src/ejabberd_auth_http.erl, line 213)
   in call from ejabberd_auth_http:check_password/4 (/opt/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/ejabberd_auth_http/src/ejabberd_auth_http.erl, line 64)
   in call from ejabberd_auth:'-db_check_password/7-fun-0-'/5 (src/ejabberd_auth.erl, line 692)
   in call from ets_cache:update/5 (/home/runner/work/ejabberd/ejabberd/deps/cache_tab/src/ets_cache.erl, line 226)
   in call from ejabberd_auth:db_check_password/7 (src/ejabberd_auth.erl, line 689)
   in call from ejabberd_auth:'-check_password_with_authmodule/6-fun-0-'/8 (src/ejabberd_auth.erl, line 250)
   in call from lists:foldl/3 (lists.erl, line 1594)
...
prefiks commented 11 months ago

Hello,

How did you install this extra module? It indeed require couple extra modules that aren't distributed with ejabberd.

badlop commented 11 months ago

Right, problem confirmed.

ejabberdctl module_install ejabberd_auth_http fails in the ejabberd container image: to install the module dependencies, git and make are required, and they aren't available in the container image (neither in ejabberd/ecs nor the ghcr.io/processone/ejabberd container images).


The manual solution is to install the development requirements:

sudo docker exec --user root eja apk add git make

And now in the container:

$ rm -rf .ejabberd-modules
$ ejabberdctl modules_update_specs
$ ejabberdctl module_install ejabberd_auth_http
/opt/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/ejabberd_auth_http/deps/fusco/src/fusco_lib.erl:273:22: Warning: http_uri:decode/1 is deprecated and will be removed in OTP 27; use uri_string:unquote function instead
%  273|                     {http_uri:decode(User), "", HostPortPath};
%     |                      ^

/opt/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/ejabberd_auth_http/deps/fusco/src/fusco_lib.erl:275:22: Warning: http_uri:decode/1 is deprecated and will be removed in OTP 27; use uri_string:unquote function instead
%  275|                     {http_uri:decode(User), http_uri:decode(Passwd),
%     |                      ^

/opt/ejabberd/.ejabberd-modules/sources/ejabberd-contrib/ejabberd_auth_http/deps/fusco/src/fusco_lib.erl:275:45: Warning: http_uri:decode/1 is deprecated and will be removed in OTP 27; use uri_string:unquote function instead
%  275|                     {http_uri:decode(User), http_uri:decode(Passwd),
%     |                                             ^

Module ejabberd_auth_http has been installed.
Now you can configure it in your ejabberd.yml

A definitive solution could be to include those packages in the container image (increasing the image size from 45 to 54 MB):

diff --git a/.github/container/Dockerfile b/.github/container/Dockerfile
index 94a9422f2..fa65931d4 100644
--- a/.github/container/Dockerfile
+++ b/.github/container/Dockerfile
@@ -158,6 +158,8 @@ RUN apk -U upgrade --available --no-cache \
         $(cat /tmp/runDeps) \
         so:libcap.so.2 \
         so:libtdsodbc.so.0 \
+        git \
+        make \
         tini \
     && ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so

After regenerating the image, running a new container and setting this in ejabberd.yml, it starts correctly:

install_contrib_modules:
  - ejabberd_auth_http

auth_method: http
auth_opts:
  host: "http://localhost:12000"
sando38 commented 8 months ago

Hello, I am not intending to compete with the official image, however, for https://github.com/sando38/helm-ejabberd I use a custom image which includes the ejabberd_auth_http module:

version: '3'

services:
  ejabberd:
    image: ghcr.io/sando38/ejabberd:23.10-k8s3
    command: >
      sh -c "ejabberdctl foreground"
    environment:
      - ERLANG_NODE_ARG=ejabberd@localhost

Note: command and environment are required to simulate the behavior of the official image.

Update: I just saw you use a M1 (ARM64). The referenced image above is only built for (x86-64).