Projekt

Allgemein

Profil

Aktionen

Setup erpnext15 dockerized » Historie » Revision 7

« Zurück | Revision 7/11 (Vergleich) | Weiter »
Jeremias Keihsler, 12.12.2024 10:50


Setup erpnext15 dockerized

the basic idea is taken from https://www.youtube.com/watch?v=8Q5B7DnxmLg

use of docker compose v2

download pwd.yml (version erpnext:v15.45.4)

https://github.com/frappe/frappe_docker/blob/0333e62884b706d01d38804472f71b3f6a039ff6/pwd.yml

save in /opt/docker.compose/erpnext as docker-compose.yml

services:
  backend:
    image: frappe/erpnext:v15.45.4
    networks:
      - frappe_network
    deploy:
      restart_policy:
        condition: on-failure
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs
    environment:
      DB_HOST: db
      DB_PORT: "3306" 
      MYSQL_ROOT_PASSWORD: admin
      MARIADB_ROOT_PASSWORD: admin

  configurator:
    image: frappe/erpnext:v15.45.4
    networks:
      - frappe_network
    deploy:
      restart_policy:
        condition: none
    entrypoint:
      - bash
      - -c
    command:
      - >
        ls -1 apps > sites/apps.txt;
        bench set-config -g db_host $$DB_HOST;
        bench set-config -gp db_port $$DB_PORT;
        bench set-config -g redis_cache "redis://$$REDIS_CACHE";
        bench set-config -g redis_queue "redis://$$REDIS_QUEUE";
        bench set-config -g redis_socketio "redis://$$REDIS_QUEUE";
        bench set-config -gp socketio_port $$SOCKETIO_PORT;
    environment:
      DB_HOST: db
      DB_PORT: "3306" 
      REDIS_CACHE: redis-cache:6379
      REDIS_QUEUE: redis-queue:6379
      SOCKETIO_PORT: "9000" 
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs

  create-site:
    image: frappe/erpnext:v15.45.4
    networks:
      - frappe_network
    deploy:
      restart_policy:
        condition: none
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs
    entrypoint:
      - bash
      - -c
    command:
      - >
        wait-for-it -t 120 db:3306;
        wait-for-it -t 120 redis-cache:6379;
        wait-for-it -t 120 redis-queue:6379;
        export start=`date +%s`;
        until [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && \
          [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_cache // empty"` ]] && \
          [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_queue // empty"` ]];
        do
          echo "Waiting for sites/common_site_config.json to be created";
          sleep 5;
          if (( `date +%s`-start > 120 )); then
            echo "could not find sites/common_site_config.json with required keys";
            exit 1
          fi
        done;
        echo "sites/common_site_config.json found";
        bench new-site --mariadb-user-host-login-scope='%' --admin-password=admin --db-root-username=root --db-root-password=admin --install-app erpnext --set-default erpnext;

  db:
    image: mariadb:10.6
    networks:
      - frappe_network
    healthcheck:
      test: mysqladmin ping -h localhost --password=admin
      interval: 1s
      retries: 20
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --skip-character-set-client-handshake
      - --skip-innodb-read-only-compressed # Temporary fix for MariaDB 10.6
    environment:
      MYSQL_ROOT_PASSWORD: admin
      MARIADB_ROOT_PASSWORD: admin
    volumes:
      - db-data:/var/lib/mysql

  frontend:
    image: frappe/erpnext:v15.45.4
    networks:
      - frappe_network
    depends_on:
      - websocket
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - nginx-entrypoint.sh
    environment:
      BACKEND: backend:8000
      FRAPPE_SITE_NAME_HEADER: erpnext
      SOCKETIO: websocket:9000
      UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1
      UPSTREAM_REAL_IP_HEADER: X-Forwarded-For
      UPSTREAM_REAL_IP_RECURSIVE: "off" 
      PROXY_READ_TIMEOUT: 120
      CLIENT_MAX_BODY_SIZE: 50m
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs
    ports:
      - "80:8080" 

  queue-long:
    image: frappe/erpnext:v15.45.4
    networks:
      - frappe_network
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - bench
      - worker
      - --queue
      - long,default,short
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs

  queue-short:
    image: frappe/erpnext:v15.45.4
    networks:
      - frappe_network
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - bench
      - worker
      - --queue
      - short,default
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs

  redis-queue:
    image: redis:6.2-alpine
    networks:
      - frappe_network
    deploy:
      restart_policy:
        condition: on-failure
    volumes:
      - redis-queue-data:/data

  redis-cache:
    image: redis:6.2-alpine
    networks:
      - frappe_network
    deploy:
      restart_policy:
        condition: on-failure
    volumes:
      - redis-cache-data:/data

  scheduler:
    image: frappe/erpnext:v15.45.4
    networks:
      - frappe_network
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - bench
      - schedule
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs

  websocket:
    image: frappe/erpnext:v15.45.4
    networks:
      - frappe_network
    deploy:
      restart_policy:
        condition: on-failure
    command:
      - node
      - /home/frappe/frappe-bench/apps/frappe/socketio.js
    volumes:
      - sites:/home/frappe/frappe-bench/sites
      - logs:/home/frappe/frappe-bench/logs

volumes:
  db-data:
  redis-queue-data:
  redis-cache-data:
  sites:
  logs:

networks:
  frappe_network:
    driver: bridge

usage of mounts instead of docker-volumes

didn't work for me .. mariadb yes, but erpnext no

create directory structure

mkdir -p /opt/docker.compose/erpnext/{c_db/var/lib/mysql,c_erp/home/frappe/frappe-bench/sites,c_erp/home/frappe/frappe-bench/logs,c_redis_cache/data,c_redis_queue/data,c_redis_socketio/data}
chmod -R g+w /opt/docker.compose/erpnext/c_*
chmod -R o+w /opt/docker.compose/erpnext/c_*

fix permission issue within volume

sudo docker exec --user root -it erpnext-backend-1 /bin/bash
chown -R frappe:frappe logs
chown -R frappe:frappe sites

as a consequence stuck with volumes. Although they can be easily accessed from within the host.

migrate erpnext from different server

https://discuss.frappe.io/t/moving-to-docker/80457/4

Take bench --site {site-name} backup --with-files on the running setup.
Copy files from sites/{site-name}/private/backups to new server and optionally stop old server so users don’t create new data.
In case of container setup copy files from server into container using docker cp or placing files in volume location.
If existing site matches new site ... drop site first (https://frappeframework.com/docs/user/en/bench/reference/drop-site)
bench drop-site erpnext --db-root-password admin
Enter any worker container and create site using bench new-site --no-mariadb-socket command. Name the site as per configured domain name. (Note down the db_name from site_config.json created)
bench new-site erpnext --no-mariadb-socket --verbose --db-root-password admin
Enter mariadb container / use mysql client and execute drop database {db_name}; create database {db_name}. This will clean the site db that was created by new site. We do this so that we have a running site configured without any database resulting in Internal Server Error.

sudo docker exec -it erpnext-db-1 /bin/bash
mysql -p
  show database;
  drop database _76e6a5f706540e85;
  create database _76e6a5f706540e85;
In mysql shell execute, use {db_name}; source /path/to/database.sql. This will restore the database from backup on fresh db. We use source from mysql shell as it re-connects in case of disconnection or timeout during restoration of huge database. Simple alternate command will be mysql -uroot -p{root-password} -h{hostname} {db_name} < /path/to/database.sql
Copy additional keys and encryption_key from backed up site_config.json. (Note, DO NOT change the db_name, db_password keys from newly created site, only copy other keys from backup site_config) The keys are important for the email-service, the hostname is important to 'wkhtmltopdf'

and don't forget ..

bench --site erpnext migrate

copy the tar-ed files into the corresponding directories

erpnext as a service

https://stackoverflow.com/questions/43671482/how-to-run-docker-compose-up-d-at-system-start-up

# /etc/systemd/system/docker-compose-erpnext.service 

[Unit]
Description=Docker Compose Application Service (erpnext)
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/docker.compose/erpnext
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target
systemctl enable docker-compose-app

backup erpnext from outside a container

sudo docker exec -t erpnext-backend-1 /usr/local/bin/bench --site all backup --with-files

upgrade erpnext v15

shutdown erpnext

sudo systemctl stop docker-compose-erpnext

modify compose-file

sudo vim /opt/docker.compose/erpnext/docker-compose.yml

replace all frappe/erpnext:v15.45.4 with the version desired (e.g. v15.46.0)

check whether mariadb-version or redis-version should be changed as well. (e.g. mariadb 10.6 / redis-6.2)

restart erpnext manually

cd /opt/docker.compose/erpnext/
sudo docker compose up

migrate erpnext installation (from within any erpnext-container)

sudo docker ps
sudo docker exec -it b84444ac0cdb /bin/bash
bench --site erpnext migrate

stop manually started instance and restart service

CTRL-C
sudo systemctl start docker-compose-erpnext

tidy up ..

sudo docker system prune

create custom app image (erpnext & eu_einvoice)

https://github.com/frappe/frappe_docker/blob/main/docs/custom-apps.md

docker pull mariadb:10.6
docker pull redis:6.2-alpine
export APPS_JSON='[
  {
    "url": "https://github.com/frappe/erpnext",
    "branch": "version-15" 
  },
  {
    "url": "https://github.com/alyf-de/eu_einvoice.git",
    "branch": "version-15" 
  }
]'

export APPS_JSON_BASE64=$(echo ${APPS_JSON} | base64 -w 0)

echo ${APPS_JSON}
echo ${APPS_JSON_BASE64}
cd ~
git clone https://github.com/frappe/frappe_docker
cd frappe_docker
docker build \
  --build-arg=FRAPPE_PATH=https://github.com/frappe/frappe \
  --build-arg=FRAPPE_BRANCH=version-15 \
  --build-arg=PYTHON_VERSION=3.11.6 \
  --build-arg=NODE_VERSION=18.18.2 \
  --build-arg=APPS_JSON_BASE64=$APPS_JSON_BASE64 \
  --tag=customapp:1.0.0 \
  --file=images/custom/Containerfile .

docker build \
  --build-arg=FRAPPE_PATH=https://github.com/frappe/frappe \
  --build-arg=FRAPPE_BRANCH=version-15 \
  --build-arg=APPS_JSON_BASE64=$APPS_JSON_BASE64 \
  --tag=customapp:1.0.0 \
  --file=images/layered/Containerfile .

docker image ls
... image: customapp:1.0.0 pull_policy: never

backend container
bench --site erpnext migrate bench --site erpnext install-app eu_einvoice bench --site erpnext migrate

restart

Von Jeremias Keihsler vor 10 Tagen aktualisiert · 7 Revisionen