====== Installing Avril ====== ===== Create new user on the system (optional) ===== If necessary create a new user: adduser kalaschnikow And add this user to the sudoers group: usermod -aG sudo kalaschnikow ===== Change SSH configuration (optional) ===== Edit the ''sshd_config'' file: sudo nano /etc/ssh/sshd_config Change following options in it: Port 1002 PermitRootLogin no AllowUsers kalaschnikow To apply the new settings reload the SSH service: sudo service ssh reload More about SSH hardening: https://major.io/2013/05/14/changing-your-ssh-servers-port-from-the-default-is-it-worth-it/ ===== Install Docker CE ===== https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce-1 After that install docker-compose: https://docs.docker.com/compose/install/ ===== Create all necessary directories ===== After that create directories for our installation: sudo mkdir -p /dockerdata/avril/upload sudo mkdir -p /dockerdata/avril/wildfly/upload sudo mkdir -p /dockerdata/avril/wildfly/deployments sudo mkdir -p /dockerdata/avrilmysql sudo mkdir -p /dockerdata/keycloakmysql sudo mkdir -p /dockerdata/_artifacts sudo mkdir -p /dockerdata/_projects/Avril sudo mkdir -p /dockerdata/_projects/AvrilKeycloak sudo mkdir -p /dockerdata/_projects/AvrilRabbitMQ # make dirs for volumes (see docker-compose.yml for all volumes): # # keycloakmysql service sudo mkdir -p /dockerdata/volumes/keycloakmysql # avrilkeycloak service sudo mkdir -p /dockerdata/volumes/avrilkeycloak # avrilmysql service sudo mkdir -p /dockerdata/volumes/avrilmysql # avril service sudo mkdir -p /dockerdata/volumes/avril/modules/system/add-ons sudo mkdir -p /dockerdata/volumes/avril/wildfly/deployments sudo mkdir -p /dockerdata/volumes/avril/wildfly/standalone/configuration sudo mkdir -p /dockerdata/volumes/avril/wildfly/standalone/log sudo mkdir -p /dockerdata/volumes/avril/upload sudo mkdir -p /dockerdata/volumes/avril/wildfly/upload sudo mkdir -p /dockerdata/volumes/avril/modules/system/layers/base/com/mysql # avriljrserver service sudo mkdir -p /dockerdata/volumes/jrserver/license sudo mkdir -p /dockerdata/volumes/jrserver/reports # avrilrabbitmq service sudo mkdir -p /dockerdata/volumes/avrilrabbitmq/log # avrilnginx service sudo mkdir -p /dockerdata/volumes/avrilnginx/logs Or all-in-one command -> make all directories (except of volumes): mkdir /dockerdata && mkdir /dockerdata/avril && mkdir /dockerdata/avril/upload && \ mkdir /dockerdata/avril/wildfly && mkdir /dockerdata/avril/wildfly/upload && mkdir /dockerdata/avril/wildfly/deployments && \ mkdir /dockerdata/avrilmysql && mkdir /dockerdata/keycloakmysql && \ mkdir /dockerdata/_artifacts && mkdir /dockerdata/_projects && mkdir /dockerdata/_projects/Avril && \ mkdir /dockerdata/_projects/AvrilKeycloak && mkdir /dockerdata/_projects/AvrilRabbitMQ ===== Move MySQL Databases ===== Move databases (zipped previously on the source system) to the new server with: # on the old server cd /dockerdata/volumes sudo zip -r keycloakmysql.zip keycloakmysql sudo zip -r avrilmysql.zip avrilmysql # then copy zip files to the target system scp -P1002 *.zip kalaschnikow@avril2021.avril.work:/home/kalaschnikow After that (on the new server): mv ~/*.zip /dockerdata/_artifacts cd /dockerdata/_artifacts unzip avrilmysql.zip unzip keycloakmysql.zip # move the inflated directories to /dockerdata/volumes mv avrilmysql ../volumes mv keycloakmysql ../volumes cd ../volumes chmod -R a+w keycloakmysql ===== Create user-defined network ===== Create user-defined network ''avrilnet'', in which all our containers will run: sudo docker network create avrilnet ===== Create container for keycloak database ===== At first create the container for the keycloak database. The best option is to create it with docker-compose. So simply add the following service to the ''docker-compose.yml'' (see the avril workspace for the latest version!) : keycloakmysql: image: mysql:5.5 environment: - MYSQL_DATABASE=keycloak - MYSQL_USER=keycloak - MYSQL_PASSWORD=keycYaopnlp=8 - MYSQL_ROOT_PASSWORD=mysqlYaopnlp=8 ports: - "3307:3306" volumes: - /dockerdata/volumes/keycloakmysql:/var/lib/mysql networks: default: aliases: - keycloakmysql # # To deploy in docker swarm instead of 'restart' use the following: # # deploy: # restart_policy: # condition: on-failure # delay: 5s # max_attempts: 3 restart: on-failure Another option is to create the container with ''docker run'': sudo docker run --network avrilnet -p 3307:3306 \ --name keycloakmysql -v /dockerdata/keycloakmysql:/var/lib/mysql \ -e MYSQL_DATABASE=keycloak -e MYSQL_USER=keycloak -e MYSQL_PASSWORD=keycYaopnlp=8 \ -e MYSQL_ROOT_PASSWORD=mysqlYaopnlp=8 -d mysql:5.5 ===== Create container for keycloak (move it from old server) ===== # # ### On SRC server ### # # pack AvrilKeycloak image sudo docker save -o ./AvrilKeycloak.tar avrilkeycloak:latest # copy file to the DEST server scp AvrilKeycloak.tar -P1002 kalaschnikow@avril2021.avril.work:/home/kalaschnikow # # ### On DEST server ### # # copy file to _artifacts folder cd /dockerdata/_artifacts mv ~/AvrilKeycloak.tar . # load AvrilKeycloak image sudo docker load -i AvrilKeycloak.tar Then copy ''standalone.xml'' from the old server to the new: cd /dockerdata/volumes/avrilkeycloak scp -P1002 stand* kalaschnikow@avril2021.avril.work:/home/kalaschnikow # on the new server: cd /dockerdata/volumes/avrilkeycloak cp ~/standalone.xml . After that start the compose: cd /dockerdata/compose sudo docker-compose up -d Now we should have two services running: ''avrilkeycloak'' and ''keycloakmysql''. ===== Create a NEW container for keycloak (unfortunately it does not work 100%) ===== **Caution**: it does not work 100%, so at the moment moving the image from the old server would be a better option. Under ''/dockerdata/_projects/AvrilKeycloak'' create the file ''Dockerfile'' with the following contents: FROM jboss/keycloak:latest COPY standalone.xml /opt/jboss/keycloak/standalone/configuration/ COPY standalone-ha.xml /opt/jboss/keycloak/standalone/configuration/ #USER jboss #RUN sed -i -e 's/auth<\/web-context>/keycloak\/auth<\/web-context>/' /opt/jboss/keycloak/standalone/configuration/standalone.xml #RUN sed -i -e 's/auth<\/web-context>/keycloak\/auth<\/web-context>/' /opt/jboss/keycloak/standalone/configuration/standalone-ha.xml CMD ["-b", "0.0.0.0", "-Djboss.socket.binding.port-offset=100"] Old content of ''Dockerfile'': FROM jboss/keycloak:4.7.0.Final CMD ["-b", "0.0.0.0", "-Djboss.socket.binding.port-offset=100"] Copy ''/mnt/sda4/development/workspaces/AvrilServer/DockerImages/AvrilKeycloak/src/main/resources/standalone.xml'' and ''/mnt/sda4/development/workspaces/AvrilServer/DockerImages/AvrilKeycloak/src/main/resources/standalone-ha.xml'' to ''/dockerdata/_projects/AvrilKeycloak'' on the new server: cd /mnt/sda4/development/workspaces/AvrilServer/DockerImages/AvrilKeycloak/src/main/resources/ scp -P1002 standalone*.xml kalaschnikow@avril2021.avril.work:/home/kalaschnikow # then on the new server: cd /dockerdata/_projects/AvrilKeycloak sudo mv ~/Dockerfile . sudo mv ~/standalone.xml . sudo mv ~/standalone-ha.xml . ==== Build the image for keycloak server ==== Build the image for keycloak server: cd /dockerdata/_projects/AvrilKeycloak sudo docker image build --tag avrilkeycloak . ==== Option 1: Create a container for keycloak server with ''docker-compose'' ==== Add following service to ''docker-compose.yml'' (see the avril workspace for the latest version!): avrilkeycloak: image: avrilkeycloak environment: - DB_VENDOR=mysql - DB_ADDR=keycloakmysql - MYSQL_PORT_3306_TCP_ADDR=keycloakmysql - MYSQL_PORT_3306_TCP_PORT=3307 - MYSQL_PASSWORD=keycYaopnlp=8 - PROXY_ADDRESS_FORWARDING=true ports: - "8180:8180" volumes: - /dockerdata/volumes/avrilkeycloak/standalone.xml:/opt/jboss/keycloak/standalone/configuration/standalone.xml depends_on: - keycloakmysql networks: default: aliases: - avrilkeycloak restart: on-failure Then copy ''standalone.xml'' from the old server to the new: cd /dockerdata/volumes/avrilkeycloak scp -P1002 stand* kalaschnikow@avril2021.avril.work:/home/kalaschnikow # on the new server: cd /dockerdata/volumes/avrilkeycloak cp ~/standalone.xml . After that start the compose: cd /dockerdata/compose sudo docker-compose up -d Now we should have two services running: ''avrilkeycloak'' and ''keycloakmysql''. ==== Option 2: Create a container for keycloak server with ''docker run'' ==== Create a container for keycloak server and run it: sudo docker image build --tag avrilkeycloak . sudo docker run --network avrilnet --name avrilkeycloak -p 8180:8180 -e DB_VENDOR=mysql -e DB_ADDR=keycloakmysql -e MYSQL_PORT_3306_TCP_ADDR=keycloakmysql -e MYSQL_PORT_3306_TCP_PORT=3306 -e MYSQL_PASSWORD=keycYaopnlp=8 -d avrilkeycloak Now the containers can be started: ''sudo docker start keycloakmysql && sudo docker start avrilkeycloak'' If necessary: open the Keycloak admin console, go to "Clients" and change "Root URL" for: * avril-web * security-admin-console ===== Create container for nginx ===== At first move all necesary config files from old server to the new cd /dockerdata/volumes/avrilnginx scp -P1002 *.conf kalaschnikow@avril2021.avril.work:/home/kalaschnikow # then on the new server: mv ~/*.conf . Then open the file ''nginx.conf'' in editor and change all old IPs to the new: ... Also change lines: ssl_certificate /etc/letsencrypt/live/avril2021.avril.work/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/avril2021.avril.work/privkey.pem; # ssl_trusted_certificate /etc/letsencrypt/live/avril2021.avril.work/chain.pem; ==== Get certificates using certbot ==== Get Let's Encrypt certificates using certbot: sudo certbot certonly --standalone -d avril2021.avril.work --email info@avril.work -n --agree-tos --expand (maybe the better way would be to get certificates not with ''--standalone'' option but with ''--nginx'', but I don't really know how to do it) After that don't forget to renew the certificates before they expire (see [[Avril and Let's Encrypt Certificates]])! So either set an appointment in Google Calendar or (better) troubleshoot the renewing (''sudo certbot renew --dry-run''). ==== Option 1: Create the container with docker-compose ==== The best option is to create it with docker-compose. So simply add the following service to the ''docker-compose.yml'' (see the avril workspace for the latest version!) : avrilnginx: image: nginx:latest ports: - "80:80" - "443:443" - "8183:8183" volumes: - /dockerdata/volumes/avrilnginx/nginx.conf:/etc/nginx/nginx.conf - /dockerdata/volumes/avrilnginx/proxy_params.conf:/etc/nginx/proxy_params.conf - /etc/letsencrypt/:/etc/letsencrypt/ - /dockerdata/volumes/avrilnginx/logs/:/var/log/nginx restart: on-failure ==== Option 2: Create the container with docker-run ==== Another option is to create the container with ''docker run'': # not yet documented... # something like: # sudo docker run --network avrilnet -p 3307:3306 \ # --name avrilnginx -v ... -d nginx ===== Create containers for avril database ===== ==== Option 1: Create container with docker-compose ==== Add the following service to the ''/dockerdata/compose/docker-compose.yml'' (see the avril workspace for the latest version!): avrilmysql: image: mysql:5.5 environment: - MYSQL_DATABASE=avril - MYSQL_USER=avril - MYSQL_PASSWORD=avrilYaopnlp=8 - MYSQL_ROOT_PASSWORD=mysqlYaopnlp=8 ports: - "3306:3306" volumes: - /dockerdata/volumes/avrilmysql:/var/lib/mysql networks: default: aliases: - avrilmysql restart: on-failure Then start the compose: cd /dockerdata/compose # if necessary at first shutdown the compose sudo docker-compose down # then start it sudo docker-compose up -d ==== Option 2: Create container with docker run ==== (This way was not tested in august 2021.) Create and run container for Avril application database sudo docker run --network avrilnet -p 3306:3306 \ --name avrilmysql -v /dockerdata/avrilmysql:/var/lib/mysql \ -e MYSQL_DATABASE=avril -e MYSQL_USER=avril -e MYSQL_PASSWORD=avrilYaopnlp=8 \ -e MYSQL_ROOT_PASSWORD=mysqlYaopnlp=8 -d mysql:5.5 ===== Create container for avril application ===== Under ''/dockerdata/_projects/Avril'' create the file ''Dockerfile'' with the following contents (see the avril workspace for the latest version): FROM jboss/wildfly:15.0.0.Final # no longer necessary because we use a volume to deploy war-files # ADD AvrilDock-201712-SNAPSHOT.war /opt/jboss/wildfly/standalone/deployments/AvrilDock.war # ADD AvrilWebAdmin-201712-SNAPSHOT.war /opt/jboss/wildfly/standalone/deployments/AvrilWebAdmin.war ADD standalone-custom.xml /opt/jboss/wildfly/standalone/configuration/ EXPOSE 9990 EXPOSE 8787 #RUN /opt/jboss/wildfly/bin/add-user.sh admin masterkey --silent #CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0"] CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-c", "standalone-custom.xml", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "--debug"] Copy the content of the file ''standalone-custom.xml'' from the avril workspace to the ''/dockerdata/_projects/Avril'' (or copy the file from the old system). scp -P1002 modules.zip standalone-custom.xml kalaschnikow@avril2021.avril.work:/home/kalaschnikow scp -P1002 *.war modules.zip standalone-custom.xml kalaschnikow@avril2021.avril.work:/home/kalaschnikow Then move *.war files to ''/dockerdata/_projects/Avril'': mv /home/kalaschnikow/Avril*.war /dockerdata/volumes/avril/wildfly/deployments Then move ''standalone-custom.xml'' to ''/dockerdata/_projects/Avril'': sudo mv /home/kalaschnikow/standalone-custom.xml /dockerdata/_projects/Avril Move modules.zip to ''/dockerdata/avril'' and unzip it: sudo mv /home/kalaschnikow/modules.zip /dockerdata/avril cd /dockerdata/avril unzip modules.zip Move content of directory ''/dockerdata/volumes/avril/modules/system/layers/base/com/mysql/'' from source to destination system: # on the SRC system cd /dockerdata/volumes/avril/modules/system/layers/base/com/mysql/jdbc/main scp -P1002 *.* kalaschnikow@avril2021.avril.work:/home/kalaschnikow # on the DEST system cd /dockerdata/volumes/avril/modules/system/layers/base/com/mysql/jdbc/main cp ~/module.xml . cp ~/mysql-connector-java-5.1.31-bin.* . After that build and run avril container: cd /dockerdata/_projects/Avril sudo docker image build --tag avril . ==== Option 1: Create the container for avril application with ''docker-compose'' ==== After that add the avril service to the ''/dockerdata/compose/docker-compose.yml'' (for latest version see the avril workspace): avril: image: avril environment: - PROXY_ADDRESS_FORWARDING=true - "JAVA_OPTS=-server -Xdebug -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -agentlib:jdwp=transport=dt_socket,address=*:8787,server=y,suspend=n --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.unsupported/sun.reflect=ALL-UNNAMED --add-modules=java.se" ports: - "8080:8080" - "8787:8787" - "9990:9990" volumes: - /dockerdata/volumes/avril/modules/system/add-ons:/opt/jboss/wildfly/modules/system/add-ons - /dockerdata/volumes/avril/wildfly/deployments:/opt/jboss/wildfly/standalone/deployments - /dockerdata/volumes/avril/wildfly/standalone/configuration/standalone-custom.xml:/opt/jboss/wildfly/standalone/configuration/standalone-custom.xml - /dockerdata/volumes/avril/upload:/opt/avril/upload - /dockerdata/volumes/avril/wildfly/upload:/opt/jboss/wildfly/upload - /dockerdata/volumes/avril/modules/system/layers/base/com/mysql:/opt/jboss/wildfly/modules/system/layers/base/com/mysql depends_on: - avrilmysql - avrilkeycloak networks: default: aliases: - avril restart: on-failure Then restart the compose: cd /dockerdata/compose sudo docker-compose down sudo docker-compose up -d ==== Option 2: Create the container for avril application with ''docker run'' ==== It is also possible to run the container with ''docker run'', but it was not tested during the installation in august 2021: sudo docker run --network avrilnet --name avril --restart unless-stopped \ -p 8080:8080 -p 9990:9990 -p 8787:8787 \ -v /dockerdata/avril/modules/system/add-ons:/opt/jboss/wildfly/modules/system/add-ons \ -v /dockerdata/avril/wildfly/deployments:/opt/jboss/wildfly/standalone/deployments \ -v /dockerdata/avril/upload:/opt/avril/upload \ -v /dockerdata/avril/wildfly/upload:/opt/jboss/wildfly/upload \ -v /dockerdata/avril/modules/system/layers/base/com/mysql:/opt/jboss/wildfly/modules/system/layers/base/com/mysql \ -it avril ==== Test Avril installation ==== To test the Avril installation open the following URL in browser: http://:8080/avril If troubleshooting will be necessary, ''docker logs '' can be used. E.g.: sudo docker logs compose_avril_1 For more information about wildfly logs in docker see [[https://goldmann.pl/blog/2014/07/18/logging-with-the-wildfly-docker-image/|Logging with the WildFly Docker image]]. ===== Create container for rabbitmq image ===== In ''/dockerdata/_projects/AvrilRabbitMQ'' create a new file ''definitions.json'' with following content (see avril workspace for the latest version): { "rabbit_version": "3.7.7", "users": [ { "name": "guest", "password_hash": "bsrunkbbhUNvyz/TvpC9OHn8EXXjDjJLJq8SUW1glZBDp4tx", "hashing_algorithm": "rabbit_password_hashing_sha256", "tags": "administrator" }, { "name": "avril", "password_hash": "C+PuHIUxvARVdh3iMcrla9H/QULl27va/Z4lF4yGJYqVg5bN", "hashing_algorithm": "rabbit_password_hashing_sha256", "tags": "" } ], "vhosts": [ { "name": "/" } ], "permissions": [ { "user": "guest", "vhost": "/", "configure": ".*", "write": ".*", "read": ".*" }, { "user": "avril", "vhost": "/", "configure": ".*", "write": ".*", "read": ".*" } ], "topic_permissions": [ { "user": "avril", "vhost": "/", "exchange": "", "write": ".*", "read": ".*" } ], "parameters": [], "global_parameters": [ { "name": "cluster_name", "value": "rabbit@kalaschnikow2017" } ], "policies": [], "queues": [ { "name": "mqtt-subscription-123qos1", "vhost": "/", "durable": true, "auto_delete": false, "arguments": { "x-expires": 86400000 } } ], "exchanges": [], "bindings": [] } In ''/dockerdata/_projects/AvrilRabbitMQ'' create a new file ''Dockerfile'' with following content: FROM rabbitmq:3.7.7-management ADD definitions.json /etc/rabbitmq/ #ADD rabbitmq.config /etc/rabbitmq/ #RUN chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.config /etc/rabbitmq/definitions.json RUN chown rabbitmq:rabbitmq /etc/rabbitmq/definitions.json # RUN rabbitmq-plugins enable --offline rabbitmq_management RUN rabbitmq-plugins enable --offline rabbitmq_mqtt EXPOSE 1883 15672 CMD ["rabbitmq-server"] Now build a new image: cd /dockerdata/_projects/AvrilRabbitMQ sudo docker image build --tag avrilrabbitmq . ==== Option 1: start the container with docker-compose ==== Add the following code to the ''/dockerdata/compose/docker-compose.yml'' (see avril workspace for the latest version): avrilrabbitmq: image: avrilrabbitmq environment: - ConnectionString=Server=sql.data;Initial Catalog=CatalogData;User Id=sa;Password=your@password expose: - "80" ports: - "1883:1883" - "15672:15672" volumes: - /dockerdata/volumes/avrilrabbitmq/log:/var/log/rabbitmq/log networks: default: aliases: - avrilrabbitmq restart: on-failure Then restart the compose: cd /dockerdata/compose sudo docker-compose down sudo docker-compose up -d ==== Option 2: start the container with docker run ==== The container can be run with (this option is not tested on ''avril2021'' server): sudo docker run --network avrilnet \ -d --hostname avril2021.avril.work --name avrilrabbitmq \ -p 15672:15672 -p 1883:1883 \ avrilrabbitmq Using IP for hostname (like ''--hostname 185.162.250.65'') is wrong and won't work! ===== Create container for jrserver application ===== ==== Create jrserver image ==== (This description is unfortunately not complete. Some copies etc. are not yet described.) From the local computer: # cd to the install dir, where are all files cd ~/Desktop/install_jrserver # copy build.jar scp -P1002 ./build*.jar kalaschnikow@avril2021.avril.work:/home/kalaschnikow # if necessary copy the report(s) too scp -P1002 ./*.jrxml kalaschnikow@avril2021.avril.work:/home/kalaschnikow On the server: cp ~/build.jar /dockerdata/jrserver/src/build.jar cd /dockerdata/jrserver/ # make script executable sudo chmod a+x builddockerimage.sh # start script which will create our jrserver image(s) sudo ./builddockerimage.sh # copy reports to the volume cd /dockerdata/volumes/jrserver/reports cp ~/*.jrxml . ==== Option 1: start the container with docker-compose ==== Add the following code to the ''/dockerdata/compose/docker-compose.yml'' (see avril workspace for the latest version): avriljrserver: image: jrserver/jrserver-server # environment: # - PROXY_ADDRESS_FORWARDING=true # - "JAVA_OPTS=-server -Xdebug -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -agentlib:jdwp=transport=dt_socket,address=*:8787,server=y,suspend=n --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=jdk.unsupported/sun.reflect=ALL-UNNAMED --add-modules=java.se" ports: - "8380:8080" volumes: - /dockerdata/volumes/jrserver/license:/src/license - /dockerdata/volumes/jrserver/reports:/src/reports depends_on: - avrilmysql - avrilkeycloak networks: default: aliases: - avriljrserver restart: on-failure Then restart the compose: cd /dockerdata/compose sudo docker-compose down sudo docker-compose up -d ==== Option 2: start the container with docker run ==== The container can be run with (this option is **not tested** on ''avril2021'' server): sudo docker run --network avrilnet \ -d --hostname avril2021.avril.work --name avriljrserver \ -p 8380:8380 \ avriljrserver ---- ---- ---- ===== Create autostarting service for all containers ===== ... ===== Start all containers with docker compose===== sudo mkdir /dockerdata/compose chmod -R a+w /dockerdata/compose cd /dockerdata/compose nano docker-compose.yml Paste the content of ''docker-compose.yml'' from the avril workspace (on my machine: ''/mnt/sda4/development/workspaces/AvrilServer/DockerImages/docker-compose.yml'') to nano and save it. After that run the compose: sudo docker-compose -f /dockerdata/compose/docker-compose.yml up -d # OR in the directory where docker-compose.yml is: sudo docker-compose up -d # OR for debugging purposes in "undetached" mode sudo docker-compose up ===== Install Certbot and Let's Encrypt Certificates ===== ...