/
/
/
Ansible role that deployes services on my runner machine
1# {{ ansible_managed }}
2#
3# Mealie recipe manager. Upstream image, pinned to {{ mealie_version }}.
4
5name: mealie
6
7services:
8 mealie:
9 container_name: mealie
10 image: "{{ mealie_image }}"
11 restart: unless-stopped
12 depends_on:
13 mealie-db:
14 condition: service_healthy
15 env_file:
16 - mealie.env
17 ports:
18 - "{{ mealie_port }}:9000"
19 deploy:
20 resources:
21 limits:
22 memory: {{ mealie_memory_limit }}
23 volumes:
24 - {{ mealie_data_dir }}:/app/data
25 networks:
26 - mealie
27 - {{ runner_docker_network }}
28
29{% if mealie_stt_enabled %}
30 # Speech-to-text for video imports, on the CPU (the GPU is the LLM's).
31 mealie-stt:
32 container_name: mealie-stt
33 image: "{{ mealie_stt_image }}"
34 restart: unless-stopped
35 environment:
36 - TZ={{ runner_timezone }}
37 - WHISPER__INFERENCE_DEVICE=cpu
38 - WHISPER__COMPUTE_TYPE=int8
39 - STT_MODEL_TTL={{ mealie_stt_model_ttl }}
40 ports:
41 - "127.0.0.1:{{ mealie_stt_port }}:8000"
42 deploy:
43 resources:
44 limits:
45 memory: {{ mealie_stt_memory_limit }}
46 volumes:
47 - {{ mealie_stt_model_dir }}:/home/ubuntu/.cache/huggingface
48 healthcheck:
49 test: ["CMD", "curl", "-fsS", "http://localhost:8000/health"]
50 interval: 30s
51 timeout: 10s
52 retries: 3
53 networks:
54 - mealie
55
56{% endif %}
57 mealie-db:
58 container_name: mealie-db
59 image: "{{ mealie_postgres_image }}"
60 restart: unless-stopped
61 environment:
62 - POSTGRES_USER=mealie
63 - POSTGRES_DB=mealie
64 - POSTGRES_PASSWORD={{ mealie_postgres_password }}
65 - PGUSER=mealie
66 volumes:
67 # Local disk, not NFS: Postgres and NFS locking do not mix.
68 - {{ mealie_db_dir }}:/var/lib/postgresql/data
69 networks:
70 - mealie
71 healthcheck:
72 test: ["CMD-SHELL", "pg_isready -U mealie -d mealie"]
73 interval: 10s
74 timeout: 5s
75 retries: 5
76
77 # Nightly: a pg_dump of the database and a tarball of the images/assets,
78 # onto the share. {{ mealie_backup_keep_days }} days kept.
79 mealie-backup:
80 container_name: mealie-backup
81 image: "{{ mealie_postgres_image }}"
82 restart: unless-stopped
83 depends_on:
84 - mealie-db
85 environment:
86 - PGPASSWORD={{ mealie_postgres_password }}
87 - TZ={{ runner_timezone }}
88 volumes:
89 - {{ mealie_data_dir }}:/data:ro
90 - {{ mealie_backup_dir }}:/backups
91 networks:
92 - mealie
93 entrypoint: ["/bin/sh", "-c"]
94 command:
95 - |
96 until pg_isready -q -h mealie-db -U mealie; do sleep 5; done
97 while true; do
98 d=$$(date +%F)
99 # Dump to a file first: in a `pg_dump | gzip` pipe a failed dump
100 # still leaves a valid (empty) gzip behind.
101 if pg_dump -h mealie-db -U mealie -f /tmp/dump.sql mealie; then
102 gzip -c /tmp/dump.sql > "/backups/mealie-db-$$d.sql.gz.tmp" \
103 && mv "/backups/mealie-db-$$d.sql.gz.tmp" "/backups/mealie-db-$$d.sql.gz" \
104 && echo "backup mealie-db-$$d.sql.gz"
105 else
106 echo "database backup FAILED" >&2
107 fi
108 rm -f /tmp/dump.sql
109 # Recipe images and assets. Mealie's own backups and caches are
110 # left out: they are derived data.
111 tar -czf "/backups/mealie-data-$$d.tar.gz.tmp" -C /data \
112 --exclude=./backups --exclude=./.temp --exclude=./cache . \
113 && mv "/backups/mealie-data-$$d.tar.gz.tmp" "/backups/mealie-data-$$d.tar.gz" \
114 && echo "backup mealie-data-$$d.tar.gz"
115 find /backups -name 'mealie-*' -mtime +{{ mealie_backup_keep_days }} -delete
116 sleep 86400
117 done
118
119networks:
120 mealie:
121 {{ runner_docker_network }}:
122 external: true
123