@echo off :: :: ejabberd Docker installer for Windows :: ------------------------------------- :: v0.3 :: :: This batch script downloads an ejabberd docker image :: and setups a docker container to run ejabberd. :: :: 1. Download and install Docker: :: :: If you use Windows 10, download Docker Desktop from: :: https://www.docker.com/ :: :: If you use Windows 7 or 8, download Docker Toolbox from: :: https://github.com/docker/toolbox/releases :: After installation, run Docker Quickstart Installer :: :: :: 2. Edit those options: :: Directory where your ejabberd deployment files will be installed :: (configuration, database, logs, ...) :: :: In Windows 10 you can configure the path: set INSTALL_DIR_WINDOWS10=C:\ejabberd :: In older Windows, not configurable, it will be installed in: :: C:\Users\%USERNAME%\ejabberd :: Please enter the desired ejabberd domain name. :: The domain is the visible attribute that is added to the username :: to form the Jabber Identifier (for example: user@example.net). :: This computer must be known on the network with this address name. :: You can later add more in conf/ejabberd.yml set HOST=localhost :: Please enter the administrator username for the current :: ejabberd installation. A Jabber account with this username :: will be created and granted administrative privileges. :: Don't use blankspaces in the username. set USER=admin :: Please provide a password for that new administrator account set PASSWORD= :: By default this downloads 'latest' ejabberd version, :: but you can set a specific version, for example 21.01 set VERSION=latest :: This tells docker what ports ejabberd will use. :: You can later configure them in conf/ejabberd.yml set PORTS=5180 5222 5269 5443 :: :: 3. Now save this script and run it. :: :: :: 4. When installation is completed: :: :: If using Windows 10, open Docker Desktop and you can: :: :: - (>) START the ejabberd container :: - Enter WebAdmin: click the ([->]) OPEN IN BROWSER button :: - To try ejabberdctl, click the (>_) CLI button, then: bin/ejabberdctl :: - ([]) STOP the ejabberd container :: :: If using an old Windows, open Kitematic and you can: :: :: - START the ejabberd container :: - Open your configuration, logs, ... in Settings > Volumes :: - Enter WebAdmin in Settings > Hostname/Ports > click on the 5180 port :: - Try ejabberdctl in EXEC, then: bin/ejabberdctl :: - STOP the ejabberd container :: :: You can delete the container and create it again running this script, :: the configuration and database are maintained. :: ::=============================================================== :: Check Windows version :: ::=============================================================== set INSTALL_DIR_DOCKER=c/Users/%USERNAME%/ejabberd for /f "tokens=4-5 delims=. " %%i in ('ver') do set WVERSION=%%i.%%j if "%wversion%" == "10.0" ( echo === Preparing paths to install in Windows 10... set INSTALL_DIR=%INSTALL_DIR_WINDOWS10% set VC=-v %INSTALL_DIR_WINDOWS10%\conf:/home/ejabberd/conf set VD=-v %INSTALL_DIR_WINDOWS10%\database:/home/ejabberd/database set VL=-v %INSTALL_DIR_WINDOWS10%\logs:/home/ejabberd/logs set VM=-v %INSTALL_DIR_WINDOWS10%\ejabberd-modules:/home/ejabberd/.ejabberd-modules set DOCKERDOWNLOAD="First download and install Docker Desktop from https://www.docker.com/" ) else ( echo === Preparing paths to install in Windows older than 10... set INSTALL_DIR=C:\Users\%USERNAME%\ejabberd set VC=-v "/%INSTALL_DIR_DOCKER%/conf:/home/ejabberd/conf" set VD=-v "/%INSTALL_DIR_DOCKER%/database:/home/ejabberd/database" set VL=-v "/%INSTALL_DIR_DOCKER%/logs:/home/ejabberd/logs" set VM=-v "/%INSTALL_DIR_DOCKER%/ejabberd-modules:/home/ejabberd/.ejabberd-modules" set DOCKERDOWNLOAD="First download and install Docker Toolbox from https://github.com/docker/toolbox/releases" ) set VOLUMES=%VC% %VD% %VL% %VM% ::=============================================================== :: Check docker is installed :: ::=============================================================== docker version >NUL if %ERRORLEVEL% NEQ 0 ( echo. echo === ERROR: It seems docker is not installed!!! echo. echo %DOCKERDOWNLOAD% echo === Then try to run this script again. echo. pause exit 1 ) ::=============================================================== :: Check install options are correctly set :: ::=============================================================== if [%PASSWORD%]==[] ( echo. echo === ERROR: PASSWORD not set!!! echo. echo === Please edit this script and set the PASSWORD. echo === Then try to run this script again. echo. pause exit 1 ) ::=============================================================== :: Download Docker image :: ::=============================================================== set IMAGE=ejabberd/ecs:%VERSION% echo. echo === Checking if the '%IMAGE%' docker image was already downloaded... docker image history %IMAGE% >NUL if %ERRORLEVEL% NEQ 0 ( echo === The '%IMAGE%' docker image was not downloaded yet. echo. echo === Downloading the '%IMAGE%' docker image, please wait... docker pull %IMAGE% ) else ( echo === The '%IMAGE%' docker image was already downloaded. ) ::=============================================================== :: Create preliminary container :: ::=============================================================== echo. echo === Checking if the 'ejabberd' docker container already exists... docker container logs ejabberd if %ERRORLEVEL% EQU 0 ( echo. echo === The 'ejabberd' docker container already exists. echo === Nothing to do, so installation finishes now. echo === You can go to Docker Desktop and start the 'ejabberd' container. echo. pause exit 1 ) else ( echo === The 'ejabberd' docker container doesn't yet exist, echo === so let's continue the installation process. ) echo. if exist %INSTALL_DIR% ( echo === The INSTALL_DIR %INSTALL_DIR% already exists. echo === No need to create the preliminary 'ejabberd-pre' image. ) else ( echo === The INSTALL_DIR %INSTALL_DIR% doesn't exist. echo === Let's create the preliminary 'ejabberd-pre' image. CALL :create-ejabberd-pre ) ::=============================================================== :: Create final container :: ::=============================================================== echo. echo === Creating the final 'ejabberd' docker container using %IMAGE% image... setlocal EnableDelayedExpansion set PS= for %%a in (%PORTS%) do ( set PS=!PS! -p %%a:%%a ) docker create --name ejabberd --hostname localhost %PS% %VOLUMES% %IMAGE% echo. echo === Installation completed. echo. pause EXIT /B %ERRORLEVEL% ::=============================================================== :: Function to create preliminary container :: ::=============================================================== :create-ejabberd-pre echo. echo === Creating a preliminary 'ejabberd-pre' docker image using %IMAGE% image... docker create --name ejabberd-pre --hostname localhost %IMAGE% echo. echo === Now 'ejabberd-pre' will be started. docker container start ejabberd-pre echo. echo === Waiting ejabberd to be running... set /A timeout = 10 set status=4 goto :while :statusstart docker exec -it ejabberd-pre bin/ejabberdctl status goto :statusend :while if %status% GTR 0 ( echo. timeout /t 1 /nobreak >NUL set /A timeout = timeout - 1 if %timeout% EQU 0 ( set status=-1 ) else ( goto :statusstart :statusend set status=%ERRORLEVEL% ) goto :while ) echo. echo === Setting a few options... docker exec -it ejabberd-pre sed -i "s!- localhost!- %HOST%!g" conf/ejabberd.yml docker exec -it ejabberd-pre sed -i "s!admin@localhost!%USER%@%HOST%!g" conf/ejabberd.yml docker exec -it ejabberd-pre sed -i "s!5280!5180!g" conf/ejabberd.yml docker exec -it ejabberd-pre sed -i "s!\"/admin\"!/!g" conf/ejabberd.yml docker exec -it ejabberd-pre bin/ejabberdctl reload_config echo. echo === Registering the administrator account... docker exec -it ejabberd-pre bin/ejabberdctl register %USER% %HOST% %PASSWORD% docker exec -it ejabberd-pre bin/ejabberdctl stop echo. echo === Copying conf, database, logs... mkdir %INSTALL_DIR% mkdir %INSTALL_DIR%\conf mkdir %INSTALL_DIR%\database mkdir %INSTALL_DIR%\logs mkdir %INSTALL_DIR%\ejabberd-modules docker cp ejabberd-pre:/home/ejabberd/conf/ %INSTALL_DIR% docker cp ejabberd-pre:/home/ejabberd/database/ %INSTALL_DIR% docker cp ejabberd-pre:/home/ejabberd/logs/ %INSTALL_DIR% echo. echo === Deleting the preliminary 'ejabberd-pre' docker image... docker stop ejabberd-pre docker rm ejabberd-pre EXIT /B 0