Update mix/ecs containers

pull/5/head
Christophe Romain 6 years ago
parent 8eef239776
commit 9cec10effa

@ -2,10 +2,10 @@
This repository contains a set of Docker images for ejabberd.
- [ejabberd/mix](https://hub.docker.com/r/ejabberd/mix/): This image allows you to build develop for ejabberd, using
all dependencies packaged from the Docker image. You do not need anything else
to build ejabberd from source and write your own ejabberd plugins.
- [ejabberd/ecs](https://hub.docker.com/r/ejabberd/ecs/): This image is build from ejabberd-base. It generates an image
suitable for running ejabberd with Docker in a simple, single-node cluster setup.
- [ejabberd/mix](https://hub.docker.com/r/ejabberd/mix/): This image allows you to build develop
environment for ejabberd, using all dependencies packaged from the Docker image. You do not
need anything else to build ejabberd from source and write your own ejabberd plugins.
- [ejabberd/ecs](https://hub.docker.com/r/ejabberd/ecs/): This image is suitable for running
ejabberd with Docker in a simple, single-node setup.
Please read the README file in each repository for documentation for each image.

@ -0,0 +1,41 @@
FROM alpine:3.7
ARG VERSION
ENV TERM=xterm \
LC_ALL=C.UTF-8 \
LANG=en_US.UTF-8 \
LANGUAGE=en_US.UTF-8 \
REPLACE_OS_VARS=true \
HOME=/home/ejabberd \
VERSION=${VERSION:-latest} \
ARCHIVE=ejabberd-${VERSION:-latest}.tar.gz
LABEL maintainer="ProcessOne <contact@process-one.net>" \
product="Ejabberd Community Edition" \
version=$VERSION
# Create directory structure and user for ejabberd
RUN addgroup ejabberd -g 9000 && adduser -s /bin/sh -D -G ejabberd ejabberd -u 9000 \
&& mkdir -p /home/ejabberd/config /home/ejabberd/db /home/ejabberd/log \
&& chown -R ejabberd:ejabberd /home/ejabberd
# Install required dependencies
RUN apk upgrade --update musl \
&& apk add bash libstdc++ ncurses-libs openssl expat yaml zlib sqlite curl ca-certificates \
&& rm -rf /var/cache/apk/* \
&& update-ca-certificates
# Install ejabberd
ADD $ARCHIVE $HOME
COPY ejabberd-api $HOME/bin/
COPY ejabberdctl $HOME/bin/
COPY config/* $HOME/config/
RUN chown ejabberd:ejabberd $HOME/config/*
COPY docker-entrypoint.sh /
# Setup runtime environment
USER ejabberd
WORKDIR $HOME
VOLUME ["$HOME/db","$HOME/config","$HOME/log"]
EXPOSE 5222 5269 5280
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["ejabberd"]

@ -1,6 +1,9 @@
#/bin/bash
#!/bin/bash
VERSION=17.12
VERSION=${1:-HEAD}
REF=$VERSION
[ "$VERSION" = "HEAD" ] && VERSION=latest
ARCHIVE=ejabberd-${VERSION}.tar.gz
GREEN='\033[0;32m'
NC='\033[0m' # No Color]]'
@ -10,11 +13,13 @@ docker images | grep -q "ejabberd/mix" || {
docker pull ejabberd/mix
}
echo -e "${GREEN}Cloning ejabberd${NC}"
if [ ! -d ejbuild ]; then
echo -e "${GREEN}Cloning ejabberd${NC}"
git clone https://github.com/processone/ejabberd.git ejbuild
else
echo -e "${GREEN}Fetch ejabberd${NC}"
(cd ejbuild; git checkout master && git pull)
fi
(cd ejbuild; git checkout master && git pull && git checkout $VERSION)
cat > ejbuild/vars.config <<EOF
{mysql, true}.
{pgsql, true}.
@ -25,18 +30,21 @@ cat > ejbuild/vars.config <<EOF
{iconv, true}.
EOF
echo -e "${GREEN}Building ejabberd release${NC}"
if [ ! -e ejabberd.tar.gz ]; then
if [ ! -e ${ARCHIVE} ]; then
echo -e "${GREEN}Checkout ejabberd ${REF}${NC}"
(cd ejbuild; git checkout $REF)
echo -e "${GREEN}Building ejabberd release${NC}"
# Copy release configuration
cp rel/*.exs ejbuild/rel/
# Force clock resync ?
#docker run -it --rm --privileged --entrypoint="/sbin/hwclock" ejabberd/mix -s
# Build ejabberd and generate release
docker run -it -v $(pwd)/ejbuild:$(pwd)/ejbuild -w $(pwd)/ejbuild -e "MIX_ENV=prod" ejabberd/mix do deps.get, deps.compile, compile, release.init, release --env=prod
docker run -it -v $(pwd)/ejbuild:$(pwd)/ejbuild -w $(pwd)/ejbuild -e "MIX_ENV=prod" ejabberd/mix do clean, deps.get, deps.compile, compile, release.init, release --env=prod
# Copy generated ejabberd release archive
cp ejbuild/_build/prod/rel/ejabberd/releases/*/ejabberd.tar.gz .
relvsn=$(grep version ejbuild/mix.exs | cut -d'"' -f2)
cp ejbuild/_build/prod/rel/ejabberd/releases/$relvsn/ejabberd.tar.gz ${ARCHIVE}
fi
# Build ejabberd base container
echo -e "${GREEN}Building ejabberd Community Edition container${NC}"
docker build -t ejabberd/ecs:${VERSION} .
docker build --build-arg VERSION=${VERSION} -t ejabberd/ecs:${VERSION} .

File diff suppressed because it is too large Load Diff

@ -0,0 +1,8 @@
-----BEGIN DH PARAMETERS-----
MIIBCAKCAQEA6/sznqAfpkS3X0jBBmYgIm3XAq2mteWVGD3/CbQ2rfk8/38fEGN7
j5G+WnulMkf9WvGtRnFQrsIsnHUyMy4ay1p7ERKCA+TLd+biOIFXOnABpvnVcPjQ
LP/G5t7kJ/kM5G8eHDk1R7rvhA8Xecv7oX6QFqsdYRSM1tO9HR0l53tSPQ0swk6v
PhWZmOSfjugfOKwHMuXwI112pyXI1XEqC/mq+CJNJw0Z3eLcOcJWuFIZuoOwXDdU
GXK0kEypq+bMTVuq1B3WMxFon8PffQ/rmbH6Bk3SXrJz6koKCcBhm019/fuNSGQ5
6uVCmIbxWeYL6Yn8qRBVMlgC3DEGMzONWwIBAg==
-----END DH PARAMETERS-----

@ -111,12 +111,11 @@ hosts:
## automatically by ejabberd.
##
certfiles:
- "/home/p1/ejabberd/config/server.pem"
- "/home/ejabberd/config/server.pem"
## - "/etc/letsencrypt/live/example.org/*.pem"
## - "/etc/letsencrypt/live/example.com/*.pem"
##
## If your system provides only a single CA file (CentOS/FreeBSD):
## s2s_cafile: "/etc/ssl/certs/ca-bundle.pem"
ca_file: "/home/ejabberd/config/cacert.pem"
###. =================
###' TLS configuration
@ -127,10 +126,10 @@ define_macro:
- "no_sslv3"
- "cipher_server_preference"
- "no_compression"
## 'DH_FILE': "/path/to/dhparams.pem" # generated with: openssl dhparam -out dhparams.pem 2048
##
## c2s_dhfile: 'DH_FILE'
## s2s_dhfile: 'DH_FILE'
'DH_FILE': "/home/ejabberd/config/dhparams.pem" # generated with: openssl dhparam -out dhparams.pem 2048
c2s_dhfile: 'DH_FILE'
s2s_dhfile: 'DH_FILE'
c2s_ciphers: 'TLS_CIPHERS'
s2s_ciphers: 'TLS_CIPHERS'
c2s_protocol_options: 'TLS_OPTIONS'
@ -148,7 +147,7 @@ listen:
port: 5222
ip: "::"
module: ejabberd_c2s
## starttls: true
starttls: true
##
## To enforce TLS encryption for client connections,
## use this instead of the "starttls" option:
@ -237,6 +236,9 @@ listen:
## request_handlers:
## "": mod_http_upload
## tls: true
## protocol_options: 'TLSOPTS'
## dhfile: 'DHFILE'
## ciphers: 'CIPHERS'
## Disabling digest-md5 SASL authentication. digest-md5 requires plain-text
## password storage (see auth_password_format option).
@ -252,15 +254,6 @@ listen:
##
s2s_use_starttls: optional
##
## domain_certfile: Specify a different certificate for each served hostname.
##
## host_config:
## "example.org":
## domain_certfile: "/path/to/example_org.pem"
## "example.com":
## domain_certfile: "/path/to/example_com.pem"
##
## S2S whitelist or blacklist
##
@ -412,7 +405,7 @@ auth_method: internal
## SQLite:
##
## sql_type: sqlite
## sql_database: "/home/p1/ejabberd/database/ejabberd.db"
## sql_database: "/home/ejabberd/database/ejabberd.db"
##
## ODBC compatible or MSSQL server:
@ -654,7 +647,7 @@ language: "en"
##
## Full path to a script that generates the image.
##
## captcha_cmd: "/lib/ejabberd/priv/bin/captcha.sh"
## captcha_cmd: "/home/ejabberd/lib/ejabberd-17.12/priv/bin/captcha.sh"
##
## Host for the URL and port where ejabberd listens for CAPTCHA requests.
@ -758,6 +751,7 @@ modules:
## XEP compliant, but increases resource comsumption
## ignore_pep_from_offline: false
last_item_cache: false
max_items_node: 10
plugins:
- "flat"
- "pep" # pep requires mod_caps
@ -804,7 +798,7 @@ modules:
search: false
mod_vcard_xupdate: {}
## Convert all avatars posted by Android clients from WebP to JPEG
## mod_avatar: # this module needs compile option
## mod_avatar: # this module needs compile option --enable-graphics
## convert:
## webp: jpeg
mod_version: {}

@ -0,0 +1,84 @@
-----BEGIN PRIVATE KEY-----
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
LQheTRhu+UYYcbxy+AHQ8pqBBdnRsxLZ
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFnDCCA4SgAwIBAgIJANCgN0JN5H4RMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNV
BAYTAkZSMQ4wDAYDVQQIDAVQYXJpczEOMAwGA1UEBwwFUGFyaXMxEzARBgNVBAoM
ClByb2Nlc3NPbmUxCzAJBgNVBAsMAklUMRIwEAYDVQQDDAlsb2NhbGhvc3QwHhcN
MTcxMjI5MTExMzA3WhcNNDUwNTE2MTExMzA3WjBjMQswCQYDVQQGEwJGUjEOMAwG
A1UECAwFUGFyaXMxDjAMBgNVBAcMBVBhcmlzMRMwEQYDVQQKDApQcm9jZXNzT25l
MQswCQYDVQQLDAJJVDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B
AQEFAAOCAg8AMIICCgKCAgEA5M7PkFrLUs8kTVmlgmG8cris6EXxqcQ4ueGDi6Mi
EleLpTFbmJ91M+gCRh9XeKKofyQGlTsdYf23QZ4QGMtuXND+3WLanXKN29UjGSLd
xGMB7IHnU1TamYxtfhMY6lIlPFfK+7RixQYzvzux/c9M12yeyGIVXZ/fYo66PFh3
RKjaZ1h8VUBfyqFXk7xX3KKQ/UAYXLtbr8IjFBuJgjqWG8rJf/TUArDT+E1faUP+
g+o0IyBk87lzu+HBIbYm2i5e3tWjwyMqs4nMEkoJ3ijP8qRvF/VYDPNa9/533ubr
P76yFtLl7x96jrvv2++h1C3WmfDgCLWs8waFDrZfv5GpAjeSfLqCnT+tYcz2Vgi0
/OE+/VkKVjmuHQ4kD7bjjDJadCmQwx/n1t1jBiphfMYhYoJj5m/UmMgFbGR/TrEH
oJUUktXRFdr1cx91qVU62XT0jOrDoWXpfXzlyJH65WV5Rb0B5bb4tI1HnmDPM9Xt
4hQMyeiFyCrtlG27aOpIRQmU8eBQCaITqFkSYGXDJpxh5STZEQWB+SJkLqS4cEq9
lxDz4YnVubvOzfmTZPZ6f2cpAnCNcYlxX4HJ6woJhFo11FfJ4YIl8peRBQKsjpa7
I3NSyy98pMzWVx8kEhY2mXuRwg8djY8UbHZSn4HC7on1b2mjOVZm+Bshy690dhzU
3IcCAwEAAaNTMFEwHQYDVR0OBBYEFCTwPSToCR8fTNGz5o2Czlc/BlfqMB8GA1Ud
IwQYMBaAFCTwPSToCR8fTNGz5o2Czlc/BlfqMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
KoZIhvcNAQELBQADggIBADnvcqMt+ESTM12BuX6E+4mA0iR//Lxp8FzQkZEb7YPR
eIor6iPVDX+oRo/uVhEPvjH+SXGb+9FOOexIoxoB4C+1UpBRHBS2PROX0BNmIDb7
abRY6iCkIlyrVkVAtswNZdJHLJX5OMPfV52p6HELd4oYlI+AnQDXkrHA8DD7Y59r
o5MonTJV26L2mq2+ceciqviZzQLA0QJxTOPLaz/pq1a2bauP0Q1EjhB0nYJ9hZxp
CuAWXrVA7veElXg7EKyrQrOt6kcnNqpBj7Pk3R1Zq2xNMlfMMqQlJFt7uKy49EwI
qGgmVj1ScL/Savp967LjRaTz0CnJhSLUlCmLq/4JGPWI/AKEi0Hg14EgRiGbha2B
E+3sQxWmCWDeIMLM6m3001VMyT1JgEoJkbhGruDayxPDQuG4nrpK8lNMrnS1Ji0j
6VQ6OL66RFlpK+/LRYc8cXsh6+hDUaXLQTPs9v880SpoerbjW5Rh9Z7Dh+fX2SJj
8x6IbNbppn7SGD4iOaHd6+gq0j6iB1zOcTaU5OnZGb4qWNyqm0m94UWFMMr5zlmn
/MwQAnvgLhfcQ1T5iq3AAIrC1D0jn0b5D2CdCFNW1DmbDZiy8db+Pz5g36G9OceQ
oFdxG1n7Nre84DwOlohVYtFkeYy3D6hd+/sbyNa5YqswuKLdm6fWrp/e3es1auXy
-----END CERTIFICATE-----

@ -0,0 +1,12 @@
#!/bin/sh
set -e
if [ "${1:0:1}" = '-' ]; then
set -- ejabberd "$@"
fi
case "$1" in
'ejabberd') exec $HOME/bin/ejabberd foreground ;;
'console') exec $HOME/bin/ejabberd console ;;
*) exit ;;
esac

@ -0,0 +1,329 @@
#!/bin/sh
# define default configuration
POLL=true
SMP=enable
ERL_MAX_PORTS=32000
ERL_PROCESSES=250000
ERL_MAX_ETS_TABLES=1400
FIREWALL_WINDOW="4370-4380"
INET_DIST_INTERFACE=""
ERLANG_NODE=ejabberd@$(hostanme -s)
# define default environment variables
ROOT_DIR="/home/ejabberd"
HOME_DIR="$ROOT_DIR"
ERL="$ROOT_DIR"/erts-9.1.5/bin/erl
IEX="$ROOT_DIR"/erts-9.1.5/bin/iex
EPMD="$ROOT_DIR"/erts-9.1.5/bin/epmd
INSTALLUSER=ejabberd
# check the proper system user is used
case $(id -un) in
"$INSTALLUSER")
EXEC_CMD="as_current_user"
[ -e "$HOME"/config/ejabberd.yml ] && HOME_DIR="$HOME"
;;
root)
if [ -n "$INSTALLUSER" ] ; then
EXEC_CMD="as_install_user"
HOME=$(su - ejabberd -c pwd)
[ -e "$HOME"/config/ejabberd.yml ] && HOME_DIR="$HOME"
else
EXEC_CMD="as_current_user"
echo "WARNING: This is not recommended to run ejabberd as root" >&2
fi
;;
*)
if [ -n "$INSTALLUSER" ] ; then
echo "ERROR: This command can only be run by root or the user $INSTALLUSER" >&2
exit 7
else
EXEC_CMD="as_current_user"
fi
;;
esac
# parse command line parameters
for arg; do
case $arg in
-n|--node) ERLANG_NODE_ARG=$2; shift;;
-s|--spool) SPOOL_DIR=$2; shift;;
-l|--logs) LOGS_DIR=$2; shift;;
-f|--config) EJABBERD_CONFIG_PATH=$2; shift;;
-c|--ctl-config) EJABBERDCTL_CONFIG_PATH=$2; shift;;
-d|--config-dir) ETC_DIR=$2; shift;;
-t|--no-timeout) NO_TIMEOUT="--no-timeout";;
--) :;;
*) break;;
esac
shift
done
# define ejabberd variables if not already defined from the command line
: "${ETC_DIR:="$HOME_DIR/config"}"
: "${LOGS_DIR:="$HOME_DIR/log"}"
: "${EJABBERD_CONFIG_PATH:="$ETC_DIR/ejabberd.yml"}"
: "${EJABBERDCTL_CONFIG_PATH:="$ETC_DIR/ejabberdctl.cfg"}"
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
: "${SPOOL_DIR:="$HOME_DIR/database/$ERLANG_NODE"}"
# define erl parameters
ERLANG_OPTS="+K $POLL -smp $SMP +P $ERL_PROCESSES $ERL_OPTIONS"
if [ -n "$FIREWALL_WINDOW" ] ; then
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
fi
if [ -n "$INET_DIST_INTERFACE" ] ; then
INET_DIST_INTERFACE2=$("$ERL" -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
if [ -n "$INET_DIST_INTERFACE2" ] ; then
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
fi
fi
ERL_LIBS="$ROOT_DIR/lib"
ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
ERL_INETRC="$ETC_DIR"/inetrc
# define ejabberd parameters
EJABBERD_OPTS="$EJABBERD_OPTS\
$(sed '/^log_rate_limit/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")\
$(sed '/^log_rotate_date/!d;s/:[ \t]*\(.[^ ]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")"
[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
# export global variables
export EJABBERD_CONFIG_PATH
export EJABBERD_LOG_PATH
export EJABBERD_PID_PATH
export ERL_CRASH_DUMP
export ERL_EPMD_ADDRESS
export ERL_INETRC
export ERL_MAX_PORTS
export ERL_MAX_ETS_TABLES
export CONTRIB_MODULES_PATH
export CONTRIB_MODULES_CONF_DIR
export ERL_LIBS
# export dynamic library path
case $(uname -m) in
i[3456]86) cpu="x86" ;;
i86pc) cpu="x86" ;;
armv7*) cpu="armhf" ;;
*) cpu=$(uname -m | tr A-Z a-z) ;;
esac
os=$(uname -s | tr A-Z a-z)
export LD_FALLBACK_LIBRARY_PATH="$ROOT_DIR"/lib/${os}-${cpu}
export DYLD_FALLBACK_LIBRARY_PATH="$LD_FALLBACK_LIBRARY_PATH"
# run command either directly or via su $INSTALLUSER
exec_cmd()
{
case $EXEC_CMD in
as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;;
as_current_user) "$@" ;;
esac
}
exec_erl()
{
NODE=$1; shift
exec_cmd "$ERL" ${S:--}name "$NODE" $ERLANG_OPTS "$@"
}
exec_iex()
{
NODE=$1; shift
exec_cmd "$IEX" -${S:--}name "$NODE" --erl "$ERLANG_OPTS" "$@"
}
# usage
debugwarning()
{
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
echo "--------------------------------------------------------------------"
echo ""
echo "IMPORTANT: we will attempt to attach an INTERACTIVE shell"
echo "to an already running ejabberd node."
echo "If an ERROR is printed, it means the connection was not successful."
echo "You can interact with the ejabberd node if you know how to use it."
echo "Please be extremely cautious with your actions,"
echo "and exit immediately if you are not completely sure."
echo ""
echo "To detach this shell from ejabberd, press:"
echo " control+c, control+c"
echo ""
echo "--------------------------------------------------------------------"
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
echo " EJABBERD_BYPASS_WARNINGS=true"
echo "Press return to continue"
read -r input
echo ""
fi
}
livewarning()
{
if [ "$EJABBERD_BYPASS_WARNINGS" != "true" ] ; then
echo "--------------------------------------------------------------------"
echo ""
echo "IMPORTANT: ejabberd is going to start in LIVE (interactive) mode."
echo "All log messages will be shown in the command shell."
echo "You can interact with the ejabberd node if you know how to use it."
echo "Please be extremely cautious with your actions,"
echo "and exit immediately if you are not completely sure."
echo ""
echo "To exit this LIVE mode and stop ejabberd, press:"
echo " q(). and press the Enter key"
echo ""
echo "--------------------------------------------------------------------"
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
echo " EJABBERD_BYPASS_WARNINGS=true"
echo "Press return to continue"
read -r input
echo ""
fi
}
help()
{
echo ""
echo "Commands to start an ejabberd node:"
echo " start Start an ejabberd node in server mode"
echo " debug Attach an interactive Erlang shell to a running ejabberd node"
echo " iexdebug Attach an interactive Elixir shell to a running ejabberd node"
echo " live Start an ejabberd node in live (interactive) mode"
echo " iexlive Start an ejabberd node in live (interactive) mode, within an Elixir shell"
echo " foreground Start an ejabberd node in server mode (attached)"
echo ""
echo "Optional parameters when starting an ejabberd node:"
echo " --config-dir dir Config ejabberd: $ETC_DIR"
echo " --config file Config ejabberd: $EJABBERD_CONFIG_PATH"
echo " --ctl-config file Config ejabberdctl: $EJABBERDCTL_CONFIG_PATH"
echo " --logs dir Directory for logs: $LOGS_DIR"
echo " --spool dir Database spool dir: $SPOOL_DIR"
echo " --node nodename ejabberd node name: $ERLANG_NODE"
echo ""
}
# dynamic node name helper
uid()
{
uuid=$(uuidgen 2>/dev/null)
[ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid)
[ -z "$uuid" ] && uuid=$(printf "%X" "${RANDOM:-$$}$(date +%M%S)")
uuid=${uuid%%-*}
[ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}"
[ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}"
[ $# -eq 2 ] && echo "${uuid}-${1}@${2}"
}
# stop epmd if there is no other running node
stop_epmd()
{
"$EPMD" -names 2>/dev/null | grep -q name || "$EPMD" -kill >/dev/null
}
# make sure node not already running and node name unregistered
# if all ok, ensure runtime directory exists and make it current directory
check_start()
{
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
pgrep -f "$ERLANG_NODE" >/dev/null && {
echo "ERROR: The ejabberd node '$ERLANG_NODE' is already running."
exit 4
}
pgrep beam >/dev/null && {
echo "ERROR: The ejabberd node '$ERLANG_NODE' is registered,"
echo " but no related beam process has been found."
echo "Shutdown all other erlang nodes, and call 'epmd -kill'."
exit 5
}
"$EPMD" -kill >/dev/null
}
}
# allow sync calls
wait_status()
{
# args: status try delay
# return: 0 OK, 1 KO
timeout="$2"
status=4
while [ "$status" -ne "$1" ] ; do
sleep "$3"
timeout=$((timeout - 1))
if [ $timeout -eq 0 ] ; then
status="$1"
else
exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
status="$?"
fi
done
[ $timeout -gt 0 ]
}
# ensure we can change current directory to SPOOL_DIR
[ -d "$SPOOL_DIR" ] || exec_cmd mkdir -p "$SPOOL_DIR"
cd "$SPOOL_DIR" || {
echo "ERROR: can not access directory $SPOOL_DIR"
exit 6
}
# main
case $1 in
start)
check_start
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput -detached
;;
foreground)
check_start
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -noinput
;;
live)
livewarning
check_start
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS
;;
debug)
debugwarning
exec_erl "$(uid debug)" -hidden -remsh "$ERLANG_NODE"
;;
etop)
exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \
-s erlang halt -output text
;;
iexdebug)
debugwarning
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
;;
iexlive)
livewarning
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS" --app ejabberd
;;
ping)
PEER=${2:-$ERLANG_NODE}
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
-noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
-s erlang halt -output text
;;
started)
wait_status 0 30 2 # wait 30x2s before timeout
;;
stopped)
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
;;
*)
exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
result=$?
case $result in
2|3) help;;
*) :;;
esac
exit $result
;;
esac

@ -0,0 +1,10 @@
use Mix.Config
# This is standard path in the context of ejabberd release
config :ejabberd,
file: "/home/p1/ejabberd/config/ejabberd.yml",
log_path: '/home/p1/ejabberd/log/ejabberd.log'
# Customize Mnesia directory:
config :mnesia,
dir: '/home/p1/ejabberd/database/'

@ -2,9 +2,9 @@ use Mix.Config
# This is standard path in the context of ejabberd release
config :ejabberd,
file: "/home/p1/cfg/ejabberd.yml",
log_path: '/home/p1/log/ejabberd.log'
file: "/home/p1/ejabberd/config/ejabberd.yml",
log_path: '/home/p1/ejabberd/log/ejabberd.log'
# Customize Mnesia directory:
config :mnesia,
dir: '/home/p1/db/'
dir: '/home/p1/ejabberd/database/'

@ -1,52 +0,0 @@
FROM alpine:3.7
MAINTAINER ProcessOne <contact@process-one.net>
ENV REFRESHED_AT=2017-12-22 \
HOME=/home/p1 \
TERM=xterm \
LC_ALL=C.UTF-8 \
LANG=en_US.UTF-8 \
LANGUAGE=en_US.UTF-8 \
REPLACE_OS_VARS=true
# Create directory structure and user for ejabberd
RUN addgroup p1 -g 9000 && adduser -s /bin/bash -D -G p1 p1 -u 9000 && \
mkdir -p ${HOME}/ejabberd ${HOME}/ejabberd/config ${HOME}/ejabberd/log ${HOME}/ejabberd/mnesiadb && \
chown -R p1:p1 ${HOME}
ENV P1DATA=${HOME}/ejabberd/mnesiadb \
P1LOG=${HOME}/ejabberd/log \
P1CFG=${HOME}/ejabberd/config
COPY ejabberd.yml ${HOME}/ejabberd/config/
COPY server.pem ${HOME}/ejabberd/config/
# TODO Make it possible to define which version of Alpine we would like to use.
#RUN echo "http://nl.alpinelinux.org/alpine/v3.6/main" > /etc/apk/repositories && \
# echo "http://nl.alpinelinux.org/alpine/v3.6/community" >> /etc/apk/repositories && \
RUN apk upgrade --update musl && \
apk add bash su-exec libstdc++ ncurses-libs openssl expat yaml zlib sqlite && \
apk add curl ca-certificates && update-ca-certificates && \
rm -rf /var/cache/apk/*
EXPOSE 5222 5269 5280
WORKDIR ${HOME}
COPY ejabberd.tar.gz ./
RUN tar -xzf ejabberd.tar.gz -C ${HOME}/ejabberd/ && \
chmod -R 777 ${HOME}/ejabberd && \
rm ${HOME}/ejabberd.tar.gz
# Volumes that you may want make persistent (share and backup)
VOLUME ["/home/p1/ejabberd/log/","/home/p1/ejabberd/mnesiadb/","/home/p1/ejabberd/config/"]
WORKDIR ${HOME}/ejabberd
COPY docker-entrypoint.sh /
COPY ejabberd-api ${HOME}
# CMD ./bin/ejabberd foreground
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["ejabberd"]

@ -1,28 +0,0 @@
#!/bin/bash
set -e
if [ "${1:0:1}" = '-' ]; then
set -- ejabberd "$@"
fi
if [ "$1" = 'ejabberd' ]; then
mkdir -p "$P1DATA"
chmod 700 "$P1DATA"
chown -R p1 "$P1DATA"
mkdir -p "$P1LOG"
chmod 700 "$P1LOG"
chown -R p1 "$P1LOG"
su-exec p1 $HOME/ejabberd/bin/ejabberd foreground
fi
if [ "$1" = 'console' ]; then
mkdir -p "$P1DATA"
chmod 700 "$P1DATA"
chown -R p1 "$P1DATA"
mkdir -p "$P1LOG"
chmod 700 "$P1LOG"
chown -R p1 "$P1LOG"
su-exec p1 $HOME/ejabberd/bin/ejabberd console
fi

@ -1,10 +0,0 @@
use Mix.Config
# This is standard path in the context of ejabberd release
config :ejabberd,
file: "/Users/mremond/devel/p1/ejabberd/ejabberd/config/ejabberd.yml",
log_path: '/Users/mremond/devel/p1/ejabberd/ejabberd/log/ejabberd.log'
# Customize Mnesia directory:
config :mnesia,
dir: '/Users/mremond/devel/p1/ejabberd/ejabberd/mnesiadb/'

@ -1,18 +0,0 @@
FROM alpine:3.7
MAINTAINER ProcessOne <contact@process-one.net>
RUN apk upgrade --update musl && \
apk add build-base git zlib-dev openssl-dev yaml-dev expat-dev sqlite-dev \
elixir erlang-crypto erlang-eunit erlang-mnesia erlang-xmerl erlang-erts \
erlang-tools erlang-os-mon erlang-syntax-tools erlang-parsetools \
erlang-runtime-tools erlang-reltool && \
rm -rf /var/cache/apk/*
RUN mix local.hex --force && \
mix local.rebar --force
EXPOSE 5222 5280
ENTRYPOINT ["/usr/bin/mix"]
CMD ["compile"]

@ -0,0 +1,18 @@
FROM alpine:3.7
LABEL maintainer="ProcessOne <contact@process-one.net>" \
product="Ejabberd mix development environment"
# Install required dependencies
RUN apk upgrade --update musl \
&& apk add build-base git zlib-dev openssl-dev yaml-dev expat-dev sqlite-dev \
elixir erlang-crypto erlang-eunit erlang-mnesia erlang-xmerl erlang-erts \
erlang-tools erlang-os-mon erlang-syntax-tools erlang-parsetools \
erlang-runtime-tools erlang-reltool \
&& rm -rf /var/cache/apk/*
# Setup runtime environment
RUN mix local.hex --force \
&& mix local.rebar --force
ENTRYPOINT ["/usr/bin/mix"]
CMD ["compile"]
Loading…
Cancel
Save