This is dockerized version of Live Helper Chat. It includes these images
web- nginx servicephp- php-fpm servicecobrowse- cobrowsing running NodeJS servicephp-cronjob- cronjobs running servicephp-resque- php-resque worker running servicenodejshelper- NodeJS Helper NodeJS running serviceredis- Redis servicedb- Database service
-
Checkout the repository
-
Run
cd docker-standalone -
Copy
.env.defaultto.env -
Edit
.envfile and changeLHC_SECRET_HASHto any random string -
Database default settings if you don't change those in
.envfile.- Host -
db - Database name -
lhc - Database username -
lhc - Database password -
lhc
- Host -
-
For version with NodeJS plugin (Recommended)
- Run
install-nodejs.shthis will checkout Live Helper Chat and required extensions - Optional. Run
docker compose -f docker-compose-nodejs.yml build --no-cacheto build from scratch. You might need it you are running onlinux/arm64as I only providelinux/amd64architecture - Run
docker compose -f docker-compose-nodejs.yml pull && docker-compose -f docker-compose-nodejs.yml upto use already existingimages
- Run
-
For standard version without NodeJS plugin run
- Run
install.shthis will checkout Live Helper Chat and required extensions - Optional. Run
docker compose -f docker-compose-standard.yml build --no-cacheto build from scratch. Build is optional. You might need it you are running onlinux/arm64as I only providelinux/amd64architecture - Run
docker compose -f docker-compose-standard.yml pull && docker-compose -f docker-compose-standard.yml up
- Run
-
You will need to install composer dependencies:
- Open a shell in the docker container
docker exec -it --workdir /code docker-standalone-php-1 /bin/bash - Visit https://getcomposer.org/download/ and run the commands to get
composer.phar - Run this to actually install the dependencies:
php composer.phar update php composer.phar install
- Open a shell in the docker container
-
Edit
docker-standalone/lhc-php-resque/lhcphpresque/settings/settings.ini.phpand put propersite_addressdomain value. php-resque does not know what domain it's running -
Make sure the
cache,settingsandvarfolders have the correct permissions:
docker exec -it docker-standalone-web-1 chown -R www-data:www-data /code/cache
docker exec -it docker-standalone-web-1 chown -R www-data:www-data /code/settings
docker exec -it docker-standalone-web-1 chown -R www-data:www-data /code/var- Navigate to localhost:8081 and follow install instructions.
- db username and password: Check
.envfile - db host:
db. - db port: 3306
- db username and password: Check
- If you want to run docker as a service append
-dto docker commands.docker-compose -f docker-compose-nodejs.yml up -d
Edit .env file and set LHC_PUBLIC_PORT and LHC_NODE_JS_PORT port to 80
That's up to you. You can have in host machine runing nginx and just proxy request or tweak images/docker files I provided. You should play around with web service.
E.g to the ones who are too lazy too use google :D
Generate SSL certificate under docker folder for demo.livehelperchat.com domain. Change paths in this command. You have to be pointed domain to your sever
certbot certonly --config-dir /opt/lhc/docker-standalone/conf/nginx/ssl --webroot --webroot-path /opt/lhc/docker-standalone/livehelperchat/lhc_web -d demo.livehelperchat.com
This is how cronjob can look like. Make sure you put your domain and correct docker-standalone-web-1 name.
0 0 * * * certbot certonly --keep-until-expiring --config-dir /opt/lhc/docker-standalone/conf/nginx/ssl --webroot --webroot-path /opt/lhc/docker-standalone/livehelperchat/lhc_web -d demo.livehelperchat.com --post-hook "docker restart docker-standalone-web-1" > /dev/null 2>&1
If you are migrating server and want to setup fresh certbot, you can just use this command
certbot certonly --manual --preferred-challenges http --config-dir /opt/lhc/docker-standalone/conf/nginx/ssl -d demo.livehelperchat.com
web service part will have to look like
web:
image: nginx:latest
env_file: .env
ports:
- "${LHC_PUBLIC_PORT}:80"
- "443:443"
volumes:
- ./livehelperchat/lhc_web:/code
- ./conf/nginx/site-ssl.conf:/etc/nginx/conf.d/default.conf
- ./conf/nginx/mime.types:/etc/nginx/mime.types
- ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./conf/nginx/ssl/live/demo.livehelperchat.com/fullchain.pem:/etc/nginx/ssl/demo.livehelperchat.com/fullchain.pem
- ./conf/nginx/ssl/live/demo.livehelperchat.com/privkey.pem:/etc/nginx/ssl/demo.livehelperchat.com/privkey.pem
depends_on:
- db
- php
- php-cronjob
networks:
- code-network
restart: alwaysModify /conf/nginx/site-ssl.conf and change where you see demo.livehelperchat.com to your domain.
Re-create docker image after a changes.
cd /opt/lhc/docker-standalone && docker compose -f docker-compose-nodejs.yml up -d --no-deps --force-recreate web
Remember to automated SSL issuing workflow :)
cd /opt/lhc/docker-standalone && docker compose -f docker-compose-nodejs.yml down
cd /opt/lhc/docker-standalone && docker compose -f docker-compose-nodejs.yml up -d
Nginx and PHP-FPM status endpoints are available from within the Docker network (e.g. from inside any container) or from the host machine.
The allowed IPs are configured directly in the nginx conf files (conf/nginx/site-nodejs.conf, conf/nginx/site.conf, conf/nginx/site-ssl.conf) under the nginx_status and fpm-status location blocks. By default private network ranges and the Docker host IP are allowed.
To get overview of docker containers
docker statsAlso check server files limits https://gemini.google.com/share/9f106a446951
Open a shell in the nginx container. Get yours name first docker ps:
docker exec -it docker-standalone-web-1 /bin/bashThen run any of the following:
# PHP-FPM status (pool summary: accepted conn, active/idle processes, req/sec since start)
curl http://web/fpm-status
# PHP-FPM status with per-worker details (pid, state, last URI, cpu, memory)
curl 'http://web/fpm-status?full'
# PHP-FPM status as JSON (useful for scripts and monitoring tools)
curl 'http://web/fpm-status?json'
# PHP-FPM status in Prometheus metrics format
curl 'http://web/fpm-status?prometheus'
# Nginx connection/request counts
curl http://web/nginx_statusTo calculate real-time requests per second for php-fpm, poll accepted conn twice and divide by the interval:
A=0; while true; do \
B=$(curl -s 'http://web/fpm-status?json' | grep -o '"accepted conn":[0-9]*' | grep -o '[0-9]*'); \
[ "$A" -gt 0 ] && awk "BEGIN {printf \"req/s: %.2f\n\", $B - $A}"; \
A=$B; sleep 1; \
doneFor nginx calculate real-time requests per second:
A=0; while true; do \
B=$(curl -s 'http://web/nginx_status' | awk '/accepts handled requests/{getline; print $3}'); \
[ "$A" -gt 0 ] && awk "BEGIN {printf \"req/s: %.2f\n\", $B - $A}"; \
A=$B; sleep 1; \
doneTo allow additional IPs, edit the allow lines in the relevant nginx conf file and recreate the web container:
docker compose -f docker-compose-nodejs.yml up -d --no-deps --force-recreate webYou have to edit back office mail settings and use SMTP.
# Update docker images
cd docker-standalone && git pull origin master
# If there is any changes you can build your containers
docker compose -f docker-compose-nodejs.yml build --no-cache
# Or just pull new ones
docker-compose -f docker-compose-nodejs.yml pull
# I would recommend also just restart composer containers
docker compose -f docker-compose-nodejs.yml down
docker compose -f docker-compose-nodejs.yml up
# OR start docker as service
docker compose -f docker-compose-nodejs.yml up -d
# All these commands are executed from docker-standalone folder
cd livehelperchat && git pull origin master
cd lhc-php-resque && git pull origin master
cd NodeJS-Helper && git pull origin master
# Login to php-fpm container and execute
docker exec -it docker-standalone-php-1 /bin/bash
# Execute in container. You might need to download composer.phar file
cd /code && php composer.phar update
cd /code && php composer.phar install
cd /code && php cron.php -s site_admin -c cron/util/update_database -p local
cd /code && php cron.php -s site_admin -c cron/util/clear_cache- Go to
Settings -> Live help confgiuration -> Chat configuration -> Screen sharingand- Check
NodeJs support enabled - In
socket.io path, optionalenter/wsnodejs/socket.io
- Check
- Go to
Settings -> Live help confgiuration -> Chat configuration -> Online trackingand- Check
Cleanup should be done only using cronjob. - Check
Footprint updates should be processed in the background. Make sure you are running workflow background cronjob.
- Check
- Go to
Settings -> Live help confgiuration -> Chat configuration -> Miscand- Check
Disable live auto assign
- Check
- Go to
Settings -> Live help confgiuration -> Chat configuration -> Workflowand- Check
Should cronjob run departments transfer workflow, even if user leaves a chat
- Check
- Set
'site_address' => 'https://chat.example.com'insettings/settings.ini.phpto your install installation path. It has to be location whereindex.phpis located. - Set
site_addressindocker-standalone/lhc-php-resque/lhcphpresque/settings/settings.ini.php - After install make sure
settings/settings.ini.phpfile looks like this if you are usingphp-resqueandnodejs -
array ( 0 => 'lhcphpresque', 1 => 'nodejshelper', ),```
As there is no mysql or mysqldump inside of containers docker mysql can be reached using 127.0.0.1:3307 so you can use master host where all your containers are running and just dump database.
server {
listen *:80; # This line should be gone once SSL is setup
server_name server_name chat.example.com; # Change to your domain
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
# Uncomment below two lines if you are running under https. So LHC will pickup https correctly
# proxy_set_header X-Forwarded-Proto https;
# proxy_set_header X-Forwarded-Ssl on;
proxy_pass http://localhost:8081/; # Change port to your docker public port
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# Those will appear automaticlaly once you setup SSL using certbot
# listen 443 ssl; # managed by Certbot
# ssl_certificate /etc/letsencrypt/live/chat.example.com/fullchain.pem; # managed by Certbot
# ssl_certificate_key /etc/letsencrypt/live/chat.example.com/privkey.pem; # managed by Certbot
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
# ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}- (Required) Set to true so IP will be detected correctly under proxy - https://github.com/LiveHelperChat/livehelperchat/blob/3e5d1249faddb15273e6897492edcd3798074b36/lhc_web/settings/settings.ini.default.php#L20
- (Optional) In
System configuration > Live help configuration -> Chat configuration -> MiscunderPlease enter explicit http mode. Either http: or https:, do not forget : at the end.enterhttps:it will force always to use HTTPS once setup.