Projekt

Allgemein

Profil

Setup erpnext15 dockerized » Historie » Version 14

Jeremias Keihsler, 14.05.2025 10:23

1 1 Jeremias Keihsler
h1. Setup erpnext15 dockerized 
2
3
the basic idea is taken from https://www.youtube.com/watch?v=8Q5B7DnxmLg
4
5
use of docker compose v2
6
7 12 Jeremias Keihsler
h2. download pwd.yml (version erpnext:v15.60.1)
8 1 Jeremias Keihsler
9 12 Jeremias Keihsler
https://github.com/frappe/frappe_docker/blob/7d4d0b18f4f1ad318b9d70b71fd229eff3c6874e/pwd.yml
10 1 Jeremias Keihsler
11
save in @/opt/docker.compose/erpnext@ as @docker-compose.yml@
12
13
<pre><code class="yaml">
14
services:
15
  backend:
16 12 Jeremias Keihsler
    image: frappe/erpnext:v15.60.1
17 2 Jeremias Keihsler
    networks:
18
      - frappe_network
19 1 Jeremias Keihsler
    deploy:
20
      restart_policy:
21
        condition: on-failure
22
    volumes:
23
      - sites:/home/frappe/frappe-bench/sites
24
      - logs:/home/frappe/frappe-bench/logs
25 2 Jeremias Keihsler
    environment:
26
      DB_HOST: db
27
      DB_PORT: "3306"
28
      MYSQL_ROOT_PASSWORD: admin
29
      MARIADB_ROOT_PASSWORD: admin
30 1 Jeremias Keihsler
31
  configurator:
32 12 Jeremias Keihsler
    image: frappe/erpnext:v15.60.1
33 2 Jeremias Keihsler
    networks:
34
      - frappe_network
35 1 Jeremias Keihsler
    deploy:
36
      restart_policy:
37
        condition: none
38
    entrypoint:
39
      - bash
40
      - -c
41
    command:
42
      - >
43
        ls -1 apps > sites/apps.txt;
44
        bench set-config -g db_host $$DB_HOST;
45
        bench set-config -gp db_port $$DB_PORT;
46
        bench set-config -g redis_cache "redis://$$REDIS_CACHE";
47
        bench set-config -g redis_queue "redis://$$REDIS_QUEUE";
48 2 Jeremias Keihsler
        bench set-config -g redis_socketio "redis://$$REDIS_QUEUE";
49 1 Jeremias Keihsler
        bench set-config -gp socketio_port $$SOCKETIO_PORT;
50
    environment:
51
      DB_HOST: db
52
      DB_PORT: "3306"
53
      REDIS_CACHE: redis-cache:6379
54
      REDIS_QUEUE: redis-queue:6379
55
      SOCKETIO_PORT: "9000"
56
    volumes:
57
      - sites:/home/frappe/frappe-bench/sites
58
      - logs:/home/frappe/frappe-bench/logs
59
60
  create-site:
61 12 Jeremias Keihsler
    image: frappe/erpnext:v15.60.1
62 2 Jeremias Keihsler
    networks:
63
      - frappe_network
64 1 Jeremias Keihsler
    deploy:
65
      restart_policy:
66
        condition: none
67
    volumes:
68
      - sites:/home/frappe/frappe-bench/sites
69
      - logs:/home/frappe/frappe-bench/logs
70
    entrypoint:
71
      - bash
72
      - -c
73
    command:
74
      - >
75
        wait-for-it -t 120 db:3306;
76
        wait-for-it -t 120 redis-cache:6379;
77
        wait-for-it -t 120 redis-queue:6379;
78
        export start=`date +%s`;
79
        until [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && \
80
          [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_cache // empty"` ]] && \
81
          [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_queue // empty"` ]];
82
        do
83
          echo "Waiting for sites/common_site_config.json to be created";
84
          sleep 5;
85
          if (( `date +%s`-start > 120 )); then
86
            echo "could not find sites/common_site_config.json with required keys";
87
            exit 1
88
          fi
89
        done;
90
        echo "sites/common_site_config.json found";
91 2 Jeremias Keihsler
        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;
92 1 Jeremias Keihsler
93
  db:
94
    image: mariadb:10.6
95 2 Jeremias Keihsler
    networks:
96
      - frappe_network
97 1 Jeremias Keihsler
    healthcheck:
98
      test: mysqladmin ping -h localhost --password=admin
99
      interval: 1s
100 2 Jeremias Keihsler
      retries: 20
101 1 Jeremias Keihsler
    deploy:
102
      restart_policy:
103
        condition: on-failure
104
    command:
105
      - --character-set-server=utf8mb4
106
      - --collation-server=utf8mb4_unicode_ci
107
      - --skip-character-set-client-handshake
108
      - --skip-innodb-read-only-compressed # Temporary fix for MariaDB 10.6
109
    environment:
110
      MYSQL_ROOT_PASSWORD: admin
111 2 Jeremias Keihsler
      MARIADB_ROOT_PASSWORD: admin
112 1 Jeremias Keihsler
    volumes:
113
      - db-data:/var/lib/mysql
114
115
  frontend:
116 12 Jeremias Keihsler
    image: frappe/erpnext:v15.60.1
117 2 Jeremias Keihsler
    networks:
118
      - frappe_network
119
    depends_on:
120
      - websocket
121 1 Jeremias Keihsler
    deploy:
122
      restart_policy:
123
        condition: on-failure
124
    command:
125
      - nginx-entrypoint.sh
126
    environment:
127
      BACKEND: backend:8000
128
      FRAPPE_SITE_NAME_HEADER: erpnext
129
      SOCKETIO: websocket:9000
130
      UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1
131
      UPSTREAM_REAL_IP_HEADER: X-Forwarded-For
132
      UPSTREAM_REAL_IP_RECURSIVE: "off"
133
      PROXY_READ_TIMEOUT: 120
134
      CLIENT_MAX_BODY_SIZE: 50m
135
    volumes:
136
      - sites:/home/frappe/frappe-bench/sites
137
      - logs:/home/frappe/frappe-bench/logs
138
    ports:
139
      - "80:8080"
140
141
  queue-long:
142 12 Jeremias Keihsler
    image: frappe/erpnext:v15.60.1
143 2 Jeremias Keihsler
    networks:
144
      - frappe_network
145 1 Jeremias Keihsler
    deploy:
146
      restart_policy:
147
        condition: on-failure
148
    command:
149
      - bench
150
      - worker
151
      - --queue
152 2 Jeremias Keihsler
      - long,default,short
153 1 Jeremias Keihsler
    volumes:
154
      - sites:/home/frappe/frappe-bench/sites
155
      - logs:/home/frappe/frappe-bench/logs
156
157
  queue-short:
158 12 Jeremias Keihsler
    image: frappe/erpnext:v15.60.1
159 2 Jeremias Keihsler
    networks:
160
      - frappe_network
161 1 Jeremias Keihsler
    deploy:
162
      restart_policy:
163
        condition: on-failure
164
    command:
165
      - bench
166
      - worker
167
      - --queue
168 2 Jeremias Keihsler
      - short,default
169 1 Jeremias Keihsler
    volumes:
170
      - sites:/home/frappe/frappe-bench/sites
171
      - logs:/home/frappe/frappe-bench/logs
172
173
  redis-queue:
174
    image: redis:6.2-alpine
175 2 Jeremias Keihsler
    networks:
176
      - frappe_network
177 1 Jeremias Keihsler
    deploy:
178
      restart_policy:
179
        condition: on-failure
180
    volumes:
181
      - redis-queue-data:/data
182
183
  redis-cache:
184
    image: redis:6.2-alpine
185 2 Jeremias Keihsler
    networks:
186
      - frappe_network
187 1 Jeremias Keihsler
    deploy:
188
      restart_policy:
189
        condition: on-failure
190
191
  scheduler:
192 12 Jeremias Keihsler
    image: frappe/erpnext:v15.60.1
193 2 Jeremias Keihsler
    networks:
194
      - frappe_network
195 1 Jeremias Keihsler
    deploy:
196
      restart_policy:
197
        condition: on-failure
198
    command:
199
      - bench
200
      - schedule
201
    volumes:
202
      - sites:/home/frappe/frappe-bench/sites
203
      - logs:/home/frappe/frappe-bench/logs
204
205
  websocket:
206 12 Jeremias Keihsler
    image: frappe/erpnext:v15.60.1
207 2 Jeremias Keihsler
    networks:
208
      - frappe_network
209 1 Jeremias Keihsler
    deploy:
210
      restart_policy:
211
        condition: on-failure
212
    command:
213
      - node
214
      - /home/frappe/frappe-bench/apps/frappe/socketio.js
215
    volumes:
216
      - sites:/home/frappe/frappe-bench/sites
217
      - logs:/home/frappe/frappe-bench/logs
218
219
volumes:
220
  db-data:
221
  redis-queue-data:
222
  sites:
223
  logs:
224 2 Jeremias Keihsler
225
networks:
226
  frappe_network:
227
    driver: bridge
228 1 Jeremias Keihsler
</code></pre>
229
230
h2. usage of mounts instead of docker-volumes
231
232
didn't work for me .. mariadb yes, but erpnext no
233
234
h3. create directory structure
235
236
<pre><code class="shell">
237
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}
238
chmod -R g+w /opt/docker.compose/erpnext/c_*
239
chmod -R o+w /opt/docker.compose/erpnext/c_*
240
</code></pre>
241
242
fix permission issue within volume
243
244
<pre><code class="shell">
245
sudo docker exec --user root -it erpnext-backend-1 /bin/bash
246
chown -R frappe:frappe logs
247
chown -R frappe:frappe sites
248
</code></pre>
249
250
as a consequence stuck with volumes. Although they can be easily accessed from within the host.
251
252
h2. migrate erpnext from different server
253
254
https://discuss.frappe.io/t/moving-to-docker/80457/4
255
256
Take @bench --site {site-name} backup --with-files@ on the running setup.
257
Copy files from @sites/{site-name}/private/backups@ to new server and optionally stop old server so users don’t create new data.
258
In case of container setup copy files from server into container using docker cp or placing files in volume location.
259
If existing site matches new site ... drop site first (https://frappeframework.com/docs/user/en/bench/reference/drop-site)
260
@bench drop-site erpnext --db-root-password admin@
261
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)
262
@bench new-site erpnext --no-mariadb-socket --verbose --db-root-password admin@
263
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.
264
265
<pre><code class="shell">
266
sudo docker exec -it erpnext-db-1 /bin/bash
267
mysql -p
268
  show database;
269
  drop database _76e6a5f706540e85;
270
  create database _76e6a5f706540e85;
271
</code></pre>
272
273
    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
274
    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'
275
276
and don't forget ..
277
278
<pre><code class="shell">
279
bench --site erpnext migrate
280
</code></pre>
281
282
copy the tar-ed files into the corresponding directories
283
284
h2. erpnext as a service
285
286
https://stackoverflow.com/questions/43671482/how-to-run-docker-compose-up-d-at-system-start-up
287
288
<pre>
289
# /etc/systemd/system/docker-compose-erpnext.service 
290
291
[Unit]
292
Description=Docker Compose Application Service (erpnext)
293
Requires=docker.service
294
After=docker.service
295
296
[Service]
297
Type=oneshot
298
RemainAfterExit=yes
299
WorkingDirectory=/opt/docker.compose/erpnext
300
ExecStart=/usr/bin/docker compose up -d
301
ExecStop=/usr/bin/docker compose down
302
TimeoutStartSec=0
303
304
[Install]
305
WantedBy=multi-user.target
306
</pre>
307
308
<pre><code class="shell">
309
systemctl enable docker-compose-app
310
</code></pre>
311
312
h2. backup erpnext from outside a container
313
314
<pre><code class="shell">
315
sudo docker exec -t erpnext-backend-1 /usr/local/bin/bench --site all backup --with-files
316
</code></pre>
317
318
h1. upgrade erpnext v15
319
320
h2. shutdown erpnext
321
322
<pre><code class="shell">
323
sudo systemctl stop docker-compose-erpnext
324
</code></pre>
325
326
h2. modify compose-file
327
328
<pre><code class="shell">
329
sudo vim /opt/docker.compose/erpnext/docker-compose.yml
330
</code></pre>
331
332 3 Jeremias Keihsler
replace all @frappe/erpnext:v15.45.4@ with the version desired (e.g. @v15.46.0@)
333 1 Jeremias Keihsler
334
check whether mariadb-version or redis-version should be changed as well. (e.g. @mariadb 10.6@ / @redis-6.2@)
335
336
h2. restart erpnext manually
337
338
<pre><code class="shell">
339
cd /opt/docker.compose/erpnext/
340
sudo docker compose up
341
</code></pre>
342
343
h2. migrate erpnext installation (from within any erpnext-container)
344
345
<pre><code class="shell">
346
sudo docker ps
347 13 Jeremias Keihsler
sudo docker exec -it erpnext-backend-1 /bin/bash
348 1 Jeremias Keihsler
bench --site erpnext migrate
349
</code></pre>
350
351
h2. stop manually started instance and restart service
352
353
<pre><code class="shell">
354
CTRL-C
355
sudo systemctl start docker-compose-erpnext
356
</code></pre>
357
358
h2. tidy up ..
359
360
<pre><code class="shell">
361
sudo docker system prune
362
</code></pre>
363 4 Jeremias Keihsler
364
h2. create custom app image (erpnext & eu_einvoice)
365
366
https://github.com/frappe/frappe_docker/blob/main/docs/custom-apps.md
367
368
<pre><code class="shell">
369 8 Jeremias Keihsler
cd ~
370
git clone https://github.com/frappe/frappe_docker
371
cd frappe_docker
372
373 6 Jeremias Keihsler
docker pull mariadb:10.6
374
docker pull redis:6.2-alpine
375
</code></pre>
376
377
<pre><code class="shell">
378 4 Jeremias Keihsler
export APPS_JSON='[
379
  {
380
    "url": "https://github.com/frappe/erpnext",
381
    "branch": "version-15"
382
  },
383
  {
384
    "url": "https://github.com/alyf-de/eu_einvoice.git",
385
    "branch": "version-15"
386
  }
387
]'
388
389
export APPS_JSON_BASE64=$(echo ${APPS_JSON} | base64 -w 0)
390
391
echo ${APPS_JSON}
392
echo ${APPS_JSON_BASE64}
393 5 Jeremias Keihsler
</code></pre>
394 4 Jeremias Keihsler
395
<pre><code class="shell">
396
docker build \
397
  --build-arg=FRAPPE_PATH=https://github.com/frappe/frappe \
398
  --build-arg=FRAPPE_BRANCH=version-15 \
399
  --build-arg=APPS_JSON_BASE64=$APPS_JSON_BASE64 \
400 9 Jeremias Keihsler
  --tag=bf_erpnext_e:15.45.4 \
401 4 Jeremias Keihsler
  --file=images/layered/Containerfile .
402 7 Jeremias Keihsler
403 5 Jeremias Keihsler
docker image ls
404 1 Jeremias Keihsler
</code></pre>
405 5 Jeremias Keihsler
406 10 Jeremias Keihsler
<pre><code class="shell">
407 5 Jeremias Keihsler
...
408 9 Jeremias Keihsler
  image: bf_erpnext_e:15.45.4
409 5 Jeremias Keihsler
  pull_policy: never
410 10 Jeremias Keihsler
</code></pre>
411 7 Jeremias Keihsler
412
backend container
413 10 Jeremias Keihsler
<pre><code class="shell">
414 9 Jeremias Keihsler
docker exec -it erpnext-backend-1 bash
415 7 Jeremias Keihsler
bench --site erpnext migrate
416
bench --site erpnext install-app eu_einvoice
417
bench --site erpnext migrate
418 10 Jeremias Keihsler
</code></pre>
419 7 Jeremias Keihsler
420 11 Jeremias Keihsler
* restart
421
* tidy up
422
423
<pre><code class="shell">
424
cd ~
425
/bin/rm -r frappe_docker
426
docker system prune
427
docker image ls
428
docker image rm "unneeded image"
429
</code></pre>