Difference between revisions of "Docker"

From Bebot Wiki 2
Jump to navigationJump to search
 
(48 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
<pre>
 +
                    ##        .       
 +
              ## ## ##      ==       
 +
          ## ## ## ##      ===       
 +
      /""""""""""""""""\___/ ===     
 +
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
 +
      \______ o          /           
 +
        \    \        __/           
 +
          \____\______/         
 +
</pre>
 +
===== Preamble =====
 +
 +
So using Docker can save you some installation hassle, especially if you're NOT a PHP/SQL expert it will save you huge time ... but beware that understanding Docker also requires some practice of its own !
 +
 +
 +
Generally, you could consider Docker is no less than amazing if you'd run only one (or very few) bot(s), same if you'd want a very quick discovery on Bebot's functions. In such case Docker is unbeatable on many aspects :
 +
 +
With very few actions from you, thanks to Docker's automations based on simple lightweight textfiles, you would configure then install and quickly run some sort of isolated "VMs" bringing your bot(s) and DataBase to life.
 +
 +
 +
But beyond, eg if you wanted to optimizely run multiple bots from an unique PHP-code installation with all pointing towards same Database or needing some proxy (eg Aocp), it'd possibly not be the best choice as each instance would then weight full Docker image(s)/container(s) in RAM/CPU.
 +
 +
For such more complicated cases we'd rather point you at the classical way explained with details within both Bebot README and http://wiki.bebot.link/index.php/Installation
 +
  
 +
Now you're aware of this all, and if you feel ready for it, let's proceed into Docker below.
  
===== Docker =====
 
  
So using Docker can save you some installation hassle, but you'll need to have it installed properly - depending on system hosting your bot(s) :
+
===== Install =====
 +
 
 +
Before anything else, you'll need to have Docker installed properly - depending on system hosting your bot(s) :
  
 
Windows => https://docs.docker.com/desktop/install/windows-install/
 
Windows => https://docs.docker.com/desktop/install/windows-install/
Line 11: Line 37:
 
Mac => https://docs.docker.com/desktop/install/mac-install/
 
Mac => https://docs.docker.com/desktop/install/mac-install/
  
Note : if you're NOT a PHP/SQL expert this will save you time but beware that understanding Docker also requires some practice of its own ...
 
  
 +
Also notice that we'll often refer to "console" below. This is a text command line prompt we'll often need.
  
Generally consider Docker is quite nice if you run 1 (or few) bot(s), or want a very quick discovery on Bebot's functions.
+
For Linux/Mac it should be available into your shortcuts.
  
Beyond this, if you wanted to run multiple bots, loot at the classical way explained in both README and http://wiki.bebot.link/index.php/Installation
+
For Windows you'd have to open menu and type "cmd" or "powershell".
  
  
===== Build =====
+
Just make sure you're installed and ready to type, then continue to next section.
  
Once the software is installed, you first have to build an image from 2 docker elements below.
 
  
Create a dedicated folder (let's name it "botfolder" for later reference) and go in it to create these 2 text files :
+
===== DB prep =====
  
 +
Now we have to determine how to manage our DataBase. For the SQL there are three possibilites :
  
"Dockerfile" (with no extension)
+
SQL1: you already have an external server ; just make sure it's reachable (eg : ping its ip) from your host, and check if its facial port (usually 3306) is correctly opened.
  
<pre>
+
SQL2: you opted for a local service on host ; so you'd usually go for usual SQL port (3306) but instead of 127.0.0.1 default ip we'd advice you default docker0 network ip 172.17.0.1
FROM alpine:latest
 
ENTRYPOINT ["/sbin/tini", "-g", "--"]
 
CMD ["/BeBot/docker-entrypoint.sh"]
 
RUN apk --no-cache --repository http://dl-3.alpinelinux.org/alpine/edge/community/ add \
 
    git php82-cli php82-phar php82-curl php82-sockets php82-pdo php82-pdo_mysql \
 
    php82-mbstring php82-ctype php82-bcmath php82-json php82-posix php82-simplexml \
 
    php82-dom php82-pcntl php82-zip php82-opcache php82-fileinfo php82-mysqli sudo tini
 
RUN adduser -h /BeBot -s /bin/false -D -H bebot
 
RUN git clone https://github.com/bitnykk/BeBot.git
 
COPY docker-entrypoint.sh /BeBot
 
RUN chmod +x /BeBot/docker-entrypoint.sh
 
RUN chown -R bebot:bebot /BeBot
 
RUN chown -R bebot:bebot /BeBot/.git
 
RUN sudo ln -s /usr/bin/php82 /usr/bin/php8
 
USER bebot
 
WORKDIR /BeBot
 
</pre>
 
  
 +
SQL3: you are about to run a container for that ; you can skip this part fully as we'll explain you how to set this up correctly later in "build" section, it's the simplest in fact !
  
"docker-entrypoint.sh"
 
  
<pre>
+
Here some command or documentation to verify elements for cases SQL1/2 :
#!/bin/ash
 
# shellcheck shell=dash
 
errorMessage() {
 
        echo "$*"
 
        exit 1
 
}
 
EXITCODE=255
 
git pull
 
while [ "$EXITCODE" -eq 255 ]; do
 
        trap "" TERM
 
        # shellcheck disable=SC2086
 
        /usr/bin/php8  StartBot.php "$@"
 
        EXITCODE=$?
 
        trap - TERM
 
done
 
exit $EXITCODE
 
</pre>
 
  
 +
- IP/Network on Linux/Mac (try from a console : ip a) and Windows (also in console : ipconfig)
  
NB : if you want more details on the PHP modules and config, go at https://www.php.net/docs.php
+
- Ports/Services on Linux/Mac https://vitux.com/find-open-ports-on-debian and Windows https://www.geeksforgeeks.org/how-to-check-open-tcp-ip-ports-in-windows
  
 +
- also find SQL config (usually .cnf) file(s) and check that your parameter "bind-address" is correct, otherwise change it and restart service
  
Then in command line into that "botfolder" you'd send the following command :
 
  
<pre>docker build -t bebot-imagename .</pre>
+
! <span style="color:#CC9900">ATTENTION</span> ! in upper cases SQL1/2 you will have to :
  
(you can change "imagename" for anything you like but then you'll replace it below accordingly)
+
- CREATE a DATABASE dedicated for the bot (you can name it as you like but remember it)
  
 +
- make an USER with PASSWORD and expected source (eg : @'%' to accept external requests)
  
If all goes fine you should see something like "Building X.Ys (10/10) FINISHED" + <span style="color:#0000FF">several blue lines starting with "=>"</span>.
+
- also GRANT that USER all PRIVILEGES on the DATABASE you created upper
  
  
NOTE : if you already have a SQL server you can use it & skip to "DB prep" below. Otherwise you must also build another container for DataBase.
+
If needed, you may have to read some SQL doc, as https://dev.mysql.com/doc/ and adapt it to you context.
  
The principle is therefore nearly the same. First obtain the base files by doing :
 
  
<pre>docker pull mariadb:latest</pre>
+
But for generic example it will usually look like the following :
  
(you also can choose an X.Y version you'd want instead of "latest" like 10.4 for example, or any other)
+
mysql (enters prompt, optional parameters are --user --password + for distant server --host)
  
 +
> CREATE DATABASE bebotdbname;
  
That once done you may see your created image(s) by doing :
+
> CREATE USER 'bebotuzr'@'%' IDENTIFIED BY 'botpass';
  
<pre>docker image ls</pre>
+
> GRANT ALL PRIVILEGES ON bebotdbname.* TO 'bebotuzr'@'%';
  
(Note : you can also delete some image : docker image rm <full-imagename>)
 
  
 +
If you ain't sure, you can verify your work is fine by doing :
  
===== DB prep =====
+
> SHOW DATABASES; (should show the DB you created upper among list)
  
Now we have to configure both our SQL (so it's opened to Bebot's requests) and Bebot (so it connects to game server & our SQL).
+
> SELECT User, Host FROM mysql.user; (should show your upper user among list)
  
For the SQL there are 3 possibilites :
+
> SHOW GRANTS FOR 'bebotuzr'@'%'; (should show the upper GRANT among list)
  
1: you have an external server ; make sure it's reachable (eg : ping its ip) from your current host, also check its facial port responds.
 
  
2: you opted for a local service on host ; so you'd usually will go for default ip 127.0.0.1 on usual SQL port (3306).
+
If all here is done (or if you're in upper case SQL3) let's move on forward.
  
3: you're about to run a container for that ; be sure to check what ip/port are set when you'll "RUN" it (section below).
 
  
 +
===== Build =====
  
! ATTENTION ! in all 3 cases you will have to :
+
Once the software is installed, you first have to build runnable images from Bebot Docker preset configs :
 +
 
 +
Get them from https://github.com/bitnykk/DockerBeBot/ (download/decompress the .zip or use git clone)
  
- CREATE a DATABASE dedicated for the bot (you can name it as you like but remember it)
 
  
- make an USER with PASSWORD and expected source (eg : @'%' to accept external requests)
+
Then in command line, enter (cd) into the folder corresponding to your situation. Their name have 3 parts :
  
- also GRANT that USER all PRIVILEGES on the DATABASE you created upper
+
1: "linux" or "windows", which depends on your host Operating System,
  
 +
2: "official" to run latest stable bot, or "sandbox" for some dev/beta testing,
  
If needed, you may have to read some SQL doc, eg here https://dev.mysql.com/doc/ and adapt it to you context.
+
3: "botonly" (in upper cases SQL1/2) or "botplusdb" (in upper case SQL3).
  
  
But for generic example it will usually look like the following :
+
Once inside the folder meeting your requirements, you can check (ls or dir) its content :
  
mysql (enters prompt, optional parameters are --user --password + for distant server --host)
+
You get those 3 files : docker-compose.yml | docker-entrypoint.sh | Dockerfile
  
> CREATE DATABASE bebotdb;
+
Note : you could edit Dockerfile and change PHP version for whatever you like ; more details on its modules/config at https://www.php.net/docs.php
  
> CREATE USER 'bebotuzr'@'%' IDENTIFIED BY 'mypass';
+
In upper case SQL3, you'd also have to setup your SQL credentials within docker-compose.yml (4 values to modify under "environment" part).
  
> GRANT ALL PRIVILEGES ON bebotdb.* TO 'bebotuzr'@'%';
 
  
 +
Once everything seems correct according to your needs, just do :
  
If you ain't sure, you can verify you work is fine by doing :
+
<pre>docker compose build </pre>
  
> SHOW DATABASES; (should show the DB you created upper among list)
+
If all goes fine you should see stuff as "Building X.Ys (10/10) FINISHED" + <span style="color:#0000FF">several blue lines starting with "=>"</span>.
  
> SELECT User, Host FROM mysql.user; (should show your upper user among list)
 
  
> SHOW GRANTS FOR 'bebotuzr'@'%'; (should show the upper GRANT among list)
+
When it's over you are almost ready for the most exciting part ... but we'll need few more actions first ...
  
  
 
===== Bot config =====
 
===== Bot config =====
  
The same way we've prepared our DB for Bebot, we also need to make our Bebot able to connect to the game + to the DB.
+
Beware Docker works in a way that makes the bot could wipes some files at reload so we need to render some persistents.
 
 
Also, beware Docker works in a way that makes the bot wipes all its files at every new run (!) so we need to render some persistents.
 
  
 
For that reason we will extract some files within the image we built earlier, and save them at host level to protect them.
 
For that reason we will extract some files within the image we built earlier, and save them at host level to protect them.
  
To do this, we will run this long line on Linux from our "botfolder" :
+
To do this, we will now run this long line on Linux from within upper chosen folder to get bindable datas :
  
 
<pre>
 
<pre>
docker run --rm --entrypoint tar bebot-buildtest czf - Conf Custom Extras/Bank Extras/Scripts log Text > out.tar.gz && tar xzf out.tar.gz -C . && rm out.tar.gz && chmod 777 * -R && mv Conf/Bot.conf.dist Conf/Bot.conf && mv Conf/Mysql.conf.dist Conf/Mysql.conf
+
docker run --rm --entrypoint tar bebot-image czf - Conf Custom Extras/Bank Extras/Scripts log Text > out.tar.gz && tar xzf out.tar.gz -C . && rm out.tar.gz && chown 1000:1000 * -R
 
</pre>
 
</pre>
  
On Windows a part of it won't work at all, so we will only obtain compress datas into our "botfolder" :
+
On Windows this can't properly, so we will let Docker manage volumes for us that will soon be explorable at network location \\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\
 +
 
 +
https://stackoverflow.com/questions/61083772/where-are-docker-volumes-located-when-running-wsl-using-docker-desktop
 +
 
 +
 
 +
In any case we'll get 5 new folders ("Conf" "Custom" "Extras" "log" "Text") in chosen folder - where our 3 Docker config files are also.
 +
 
 +
Note : in upper case SQL3 we'll also soon have a "db" folder later at the same place, once we'll have our DB container started for first time.
 +
 
 +
Windows only : possibly set permissive rights on those folders/files (select all, right-click > Properties > Security) so our container access them.
 +
 
 +
 
 +
===== Run =====
 +
 
 +
We're now ready to run our container(s) : 1 only if we want Bebot with our usual SQL server, otherwise 2 for Bebot + SQL both as Docker containers.
  
 
<pre>
 
<pre>
docker run --rm --entrypoint tar bebot-buildtest czf - Conf Custom Extras/Bank Extras/Scripts log Text > out.tar.gz
+
docker compose run bebot
 
</pre>
 
</pre>
  
(then we can use any Windows utility, as Winzip or 7-zip etc, to decompress these datas right in place)
+
Your bot should now load (after launching its DB if some), check its updates then show its ip within Docker network.
  
 +
As it's our first run, bot will then ask us to fill up credentials informations.
  
In any case we end up with several new folders ("Conf", "Custom", "Extras", "log" and "Text") in our "botfolder".
+
So give him account name, pass, character, server and also owner and superadmin(s) plus few more questions.
  
Windows only : set permissive rights on all those folders/files (select all, right-click > Properties > Security) so our container can acces them.
+
Then you're asked for the SQL part. In upper cases SQL1/2 you should already have everything needed here.
  
 +
For upper case SQL3 you db ip should but the same than bot but end in .2 (as .1 should be host and .3 the bot itself).
  
We now must enter "Conf" folder to edit 2 files for runnability ; leave all quotes/double-quotes as they are, write your values inside of them.
 
  
Windows only : we also need to rename 2 files as Bot.conf and Mysql.conf (remove .dist in names).
+
Finish the setting up, then bot will create all his DB entries, and endly come online !
  
 +
NB : expect some deep caching at very first run keeping the bot busy for a minute or two. If anything goes wrong, restart containers (see below).
  
In Bot.conf => set your bot account name, pass, char, server, guild if AoC, owner & possibly AO guild (true+number, otherwise false+00000001).
 
  
In Mysql.conf => set you bot database, user, pass & server (possibly :port) ; all depends on your SQL situation as seen earlier ...
+
===== Control =====
  
 +
Now to check if your container(s) run properly, you have a set of commands :
  
===== Run =====
+
To obtain a list of created image(s) : docker image ls
 +
 
 +
To show a list of running container(s) : docker ps (can use -a parameter to also see stopped ones)
 +
 
 +
To see realtime stats of container(s) : docker stats (Ctrl+c to exit)
 +
 
 +
To passively check realtime log of a container : docker logs -f container_name_or_id (Ctrl+c to exit which will NOT shutdown bot/container)
 +
 
 +
To enter container thread interactively : docker attach container_name_or_id (Ctrl+p Ctrl+q to exit without shutting down)
 +
 
 +
To execute container interactively : docker exec -it container_name_or_id sh (Ctrl+p Ctrl+q for the same result that upper)
 +
 
 +
To copy from a running container : docker cp container_name_or_id:/path/to/stuff.ext .
 +
 
 +
The same towards a running container : docker cp stuff.ext container_name_or_id:/path/to/copy/to
 +
 
 +
 
 +
If you need to stop (and then restart) some container(s) :
 +
 
 +
To stop a given container : docker stop container_name_or_id
 +
 
 +
To stop all containers together : docker stop $(docker ps -q)
 +
 
 +
To restart stopped bot : docker compose run -d bebot (-d so it stays in background)
  
We're now ready to run our container(s) : 1 only if we want Bebot with our usual SQL server, otherwise 2 for Bebot + SQL both as Docker containers.
 
  
 +
If Bebot git code was patched, such container restart upper should quickfix to auto-update it.
  
For SQL (optional) :
+
For best reliability you also can delete bot image (its container once stopped/removed) and rebuild it with --no-cache parameter added :
  
<pre>docker run --name mariadb-containername -e MYSQL_ROOT_PASSWORD=mypass -p 33306:3306 -d mariadb --restart=always</pre>
+
- stop all (docker compose down ; docker stop containername)
  
(you can change "containername" for anything you like but remember it)
+
- find & delete the bot container (docker ps -a ; docker rm fullid)
  
 +
- find & delete the bot image (docker image ls ; docker image rm imagename)
  
For Bebot (mandatory) :
+
- rebuild the bot image (docker compose build servicename --no-cache)
  
Windows :
+
- restart the whole network (docker compose run -d servicename)
<pre>
 
docker run -d --rm --name bebot-containername --memory=128M -v C:\Folder\botfolder\Conf:/BeBot/Conf -v C:\Folder\botfolder\Custom:/BeBot/Custom -v C:\Folder\botfolder\Extras\Bank:/BeBot/Extras/Bank -v C:\Folder\botfolder\Extras\Scripts:/BeBot/Extras/Scripts -v C:\Folder\botfolder\log:/BeBot/log -v C:\Folder\botfolder\Text:/BeBot/Text bebot-imagename
 
</pre>
 
  
(replace "imagename" & "C:\Folder\botfolder" depending on your config ; "containername" is free to choose ; all host pathes before ":" use antislashes \)
 
  
Mac/Linux :
+
You may setup some task(s) (crontab on Linux/Mac / Task Manager > Startup on Windows) to run some container(s) right at host startup.
<pre>
 
docker run -d --rm --name bebot-containername --memory=50M -v /path/to/botfolder/Conf:/BeBot/Conf -v /path/to/botfolder/Custom:/BeBot/Custom -v /path/to/botfolder/Extras/Bank:/BeBot/Extras/Bank -v /path/to/botfolder/Extras/Scripts:/BeBot/Extras/Scripts -v /path/to/botfolder/log:/BeBot/log -v /path/to/botfolder/Text:/BeBot/Text bebot-imagename
 
</pre>
 
  
(same than up but all path use slashes / ; also if you have SQL as host local service add this setting before bebot-imagename : --network="host")
+
Sources : https://manpages.debian.org/bullseye/cron/crontab.5.en.html / https://www.howtogeek.com/208224/how-to-add-a-program-to-startup-in-windows/
  
 +
Same way you should strongly save your SQL datas frequently as Docker won't do it for you ; can use task(s) based on mysqldump for that.
  
Your bot should now load and go online to respond commands - if you did it all well ^_^
+
Source : https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html
  
Otherwise you can use this shape of command to troubleshoot better :
 
  
<pre>
+
===== Maintenance =====
docker run --name bebot-containername (+ all parameters you need as -v and possibly --network etc ...) bebot-imagename
 
</pre>
 
  
So you'll see what bot does realtime in your console. Then do Ctlr+c to exit (but that will shutdown the bot container).
+
Before anything, you can troubleshoot most common mistakes verifying in order :
  
 +
- correct software installation (Docker ahead of any other)
  
===== Control =====
+
- your various elements ip, port, state and availability
  
Now to control if your container(s) run properly, and to control things you have a set of commands.
+
- you credentials (check bot's Conf folder in all cases, Docker's compose for case SQL3)
  
To show a list of running container(s) : docker ps (can use -a parameter to see all)
 
  
To see realtime log of the Bebot : docker logs -f <full-containername> (Ctrl+c to exit which will NOT shutdown bot/container)
+
If needed to make house cleaning (assuming you've made <span style="color:#BB0000">BACKUPS</span> of sensible datas you could lose below !) :
  
To enter a given container interactively : docker exec -it <full-containername> sh (Ctrl+p Ctrl+q to exit without shutting down neither)
+
To stop the containers : docker compose down (possibly --volumes param added)
  
To stop a given container : docker stop <full-containername> (bot should go offline as expected)
+
To delete the recent containers : docker rm $(docker ps -a -q)
  
To delete a buggy container : docker rm -f <full-containername>
+
To clear a given image : docker image rm -f image_name
  
 +
To remove all unused images : docker image prune -a
  
You may setup some task(s) (crontab on Linux/Mac / Task Manager > Startup on Windows) to run some container(s) at startup.
+
To trash all useless networks : docker network prune
  
 +
For all upper cleans + cache : docker system prune -a
  
Ff Bebot git code was patched, you simply restart container and it should auto-update : docker restart <full-containername>
 
  
Alternative manual way : enter the container, do "git pull" then exit and !restart the bot from ingame, which should provide same result.
+
Again, any of the upper could make you lose datas, so cover yourself with some previous <span style="color:#BB0000">BACKUPS</span> (or do not blame your poor computer).
  
  
 
===== Conclusion =====
 
===== Conclusion =====
  
This guide is a work in progress and will evolve as we find improvements or tricks.
+
This guide is a work in progress, kept as simple as possible, and will evolve as we find improvements or tricks.
 +
 
 +
For more details and options you can refer to Docker official documentation here https://docs.docker.com/

Latest revision as of 20:59, 11 April 2024

                    ##        .         
              ## ## ##       ==         
           ## ## ## ##      ===         
       /""""""""""""""""\___/ ===       
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          /             
         \    \        __/             
          \____\______/           
Preamble[edit]

So using Docker can save you some installation hassle, especially if you're NOT a PHP/SQL expert it will save you huge time ... but beware that understanding Docker also requires some practice of its own !


Generally, you could consider Docker is no less than amazing if you'd run only one (or very few) bot(s), same if you'd want a very quick discovery on Bebot's functions. In such case Docker is unbeatable on many aspects :

With very few actions from you, thanks to Docker's automations based on simple lightweight textfiles, you would configure then install and quickly run some sort of isolated "VMs" bringing your bot(s) and DataBase to life.


But beyond, eg if you wanted to optimizely run multiple bots from an unique PHP-code installation with all pointing towards same Database or needing some proxy (eg Aocp), it'd possibly not be the best choice as each instance would then weight full Docker image(s)/container(s) in RAM/CPU.

For such more complicated cases we'd rather point you at the classical way explained with details within both Bebot README and http://wiki.bebot.link/index.php/Installation


Now you're aware of this all, and if you feel ready for it, let's proceed into Docker below.


Install[edit]

Before anything else, you'll need to have Docker installed properly - depending on system hosting your bot(s) :

Windows => https://docs.docker.com/desktop/install/windows-install/

Linux => https://docs.docker.com/desktop/install/linux-install/

Mac => https://docs.docker.com/desktop/install/mac-install/


Also notice that we'll often refer to "console" below. This is a text command line prompt we'll often need.

For Linux/Mac it should be available into your shortcuts.

For Windows you'd have to open menu and type "cmd" or "powershell".


Just make sure you're installed and ready to type, then continue to next section.


DB prep[edit]

Now we have to determine how to manage our DataBase. For the SQL there are three possibilites :

SQL1: you already have an external server ; just make sure it's reachable (eg : ping its ip) from your host, and check if its facial port (usually 3306) is correctly opened.

SQL2: you opted for a local service on host ; so you'd usually go for usual SQL port (3306) but instead of 127.0.0.1 default ip we'd advice you default docker0 network ip 172.17.0.1

SQL3: you are about to run a container for that ; you can skip this part fully as we'll explain you how to set this up correctly later in "build" section, it's the simplest in fact !


Here some command or documentation to verify elements for cases SQL1/2 :

- IP/Network on Linux/Mac (try from a console : ip a) and Windows (also in console : ipconfig)

- Ports/Services on Linux/Mac https://vitux.com/find-open-ports-on-debian and Windows https://www.geeksforgeeks.org/how-to-check-open-tcp-ip-ports-in-windows

- also find SQL config (usually .cnf) file(s) and check that your parameter "bind-address" is correct, otherwise change it and restart service


! ATTENTION ! in upper cases SQL1/2 you will have to :

- CREATE a DATABASE dedicated for the bot (you can name it as you like but remember it)

- make an USER with PASSWORD and expected source (eg : @'%' to accept external requests)

- also GRANT that USER all PRIVILEGES on the DATABASE you created upper


If needed, you may have to read some SQL doc, as https://dev.mysql.com/doc/ and adapt it to you context.


But for generic example it will usually look like the following :

mysql (enters prompt, optional parameters are --user --password + for distant server --host)

> CREATE DATABASE bebotdbname;

> CREATE USER 'bebotuzr'@'%' IDENTIFIED BY 'botpass';

> GRANT ALL PRIVILEGES ON bebotdbname.* TO 'bebotuzr'@'%';


If you ain't sure, you can verify your work is fine by doing :

> SHOW DATABASES; (should show the DB you created upper among list)

> SELECT User, Host FROM mysql.user; (should show your upper user among list)

> SHOW GRANTS FOR 'bebotuzr'@'%'; (should show the upper GRANT among list)


If all here is done (or if you're in upper case SQL3) let's move on forward.


Build[edit]

Once the software is installed, you first have to build runnable images from Bebot Docker preset configs :

Get them from https://github.com/bitnykk/DockerBeBot/ (download/decompress the .zip or use git clone)


Then in command line, enter (cd) into the folder corresponding to your situation. Their name have 3 parts :

1: "linux" or "windows", which depends on your host Operating System,

2: "official" to run latest stable bot, or "sandbox" for some dev/beta testing,

3: "botonly" (in upper cases SQL1/2) or "botplusdb" (in upper case SQL3).


Once inside the folder meeting your requirements, you can check (ls or dir) its content :

You get those 3 files : docker-compose.yml | docker-entrypoint.sh | Dockerfile

Note : you could edit Dockerfile and change PHP version for whatever you like ; more details on its modules/config at https://www.php.net/docs.php

In upper case SQL3, you'd also have to setup your SQL credentials within docker-compose.yml (4 values to modify under "environment" part).


Once everything seems correct according to your needs, just do :

docker compose build 

If all goes fine you should see stuff as "Building X.Ys (10/10) FINISHED" + several blue lines starting with "=>".


When it's over you are almost ready for the most exciting part ... but we'll need few more actions first ...


Bot config[edit]

Beware Docker works in a way that makes the bot could wipes some files at reload so we need to render some persistents.

For that reason we will extract some files within the image we built earlier, and save them at host level to protect them.

To do this, we will now run this long line on Linux from within upper chosen folder to get bindable datas :

docker run --rm --entrypoint tar bebot-image czf - Conf Custom Extras/Bank Extras/Scripts log Text > out.tar.gz && tar xzf out.tar.gz -C . && rm out.tar.gz && chown 1000:1000 * -R

On Windows this can't properly, so we will let Docker manage volumes for us that will soon be explorable at network location \\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\

https://stackoverflow.com/questions/61083772/where-are-docker-volumes-located-when-running-wsl-using-docker-desktop


In any case we'll get 5 new folders ("Conf" "Custom" "Extras" "log" "Text") in chosen folder - where our 3 Docker config files are also.

Note : in upper case SQL3 we'll also soon have a "db" folder later at the same place, once we'll have our DB container started for first time.

Windows only : possibly set permissive rights on those folders/files (select all, right-click > Properties > Security) so our container access them.


Run[edit]

We're now ready to run our container(s) : 1 only if we want Bebot with our usual SQL server, otherwise 2 for Bebot + SQL both as Docker containers.

docker compose run bebot

Your bot should now load (after launching its DB if some), check its updates then show its ip within Docker network.

As it's our first run, bot will then ask us to fill up credentials informations.

So give him account name, pass, character, server and also owner and superadmin(s) plus few more questions.

Then you're asked for the SQL part. In upper cases SQL1/2 you should already have everything needed here.

For upper case SQL3 you db ip should but the same than bot but end in .2 (as .1 should be host and .3 the bot itself).


Finish the setting up, then bot will create all his DB entries, and endly come online !

NB : expect some deep caching at very first run keeping the bot busy for a minute or two. If anything goes wrong, restart containers (see below).


Control[edit]

Now to check if your container(s) run properly, you have a set of commands :

To obtain a list of created image(s) : docker image ls

To show a list of running container(s) : docker ps (can use -a parameter to also see stopped ones)

To see realtime stats of container(s) : docker stats (Ctrl+c to exit)

To passively check realtime log of a container : docker logs -f container_name_or_id (Ctrl+c to exit which will NOT shutdown bot/container)

To enter container thread interactively : docker attach container_name_or_id (Ctrl+p Ctrl+q to exit without shutting down)

To execute container interactively : docker exec -it container_name_or_id sh (Ctrl+p Ctrl+q for the same result that upper)

To copy from a running container : docker cp container_name_or_id:/path/to/stuff.ext .

The same towards a running container : docker cp stuff.ext container_name_or_id:/path/to/copy/to


If you need to stop (and then restart) some container(s) :

To stop a given container : docker stop container_name_or_id

To stop all containers together : docker stop $(docker ps -q)

To restart stopped bot : docker compose run -d bebot (-d so it stays in background)


If Bebot git code was patched, such container restart upper should quickfix to auto-update it.

For best reliability you also can delete bot image (its container once stopped/removed) and rebuild it with --no-cache parameter added :

- stop all (docker compose down ; docker stop containername)

- find & delete the bot container (docker ps -a ; docker rm fullid)

- find & delete the bot image (docker image ls ; docker image rm imagename)

- rebuild the bot image (docker compose build servicename --no-cache)

- restart the whole network (docker compose run -d servicename)


You may setup some task(s) (crontab on Linux/Mac / Task Manager > Startup on Windows) to run some container(s) right at host startup.

Sources : https://manpages.debian.org/bullseye/cron/crontab.5.en.html / https://www.howtogeek.com/208224/how-to-add-a-program-to-startup-in-windows/

Same way you should strongly save your SQL datas frequently as Docker won't do it for you ; can use task(s) based on mysqldump for that.

Source : https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html


Maintenance[edit]

Before anything, you can troubleshoot most common mistakes verifying in order :

- correct software installation (Docker ahead of any other)

- your various elements ip, port, state and availability

- you credentials (check bot's Conf folder in all cases, Docker's compose for case SQL3)


If needed to make house cleaning (assuming you've made BACKUPS of sensible datas you could lose below !) :

To stop the containers : docker compose down (possibly --volumes param added)

To delete the recent containers : docker rm $(docker ps -a -q)

To clear a given image : docker image rm -f image_name

To remove all unused images : docker image prune -a

To trash all useless networks : docker network prune

For all upper cleans + cache : docker system prune -a


Again, any of the upper could make you lose datas, so cover yourself with some previous BACKUPS (or do not blame your poor computer).


Conclusion[edit]

This guide is a work in progress, kept as simple as possible, and will evolve as we find improvements or tricks.

For more details and options you can refer to Docker official documentation here https://docs.docker.com/