/
/
/
Ansible role that deployes services on my runner machine
1---
2
3- name: Configure Git safe directory for CVAT
4 command: git config --global --add safe.directory "{{ cvat_config_dir }}"
5 changed_when: false
6
7- name: Clone CVAT upstream at pinned version
8 git:
9 repo: "{{ cvat_repo_url }}"
10 dest: "{{ cvat_config_dir }}"
11 version: "{{ cvat_repo_version }}"
12 force: yes
13
14- name: Set ownership on CVAT install dir
15 file:
16 path: "{{ cvat_config_dir }}"
17 state: directory
18 owner: "{{ runner_user }}"
19 group: "{{ runner_group }}"
20 mode: '2775'
21 recurse: true
22
23- name: Check CVAT share dir exists
24 stat:
25 path: "{{ cvat_share_dir }}"
26 register: cvat_share_stat
27
28- name: Fail if CVAT share dir missing
29 fail:
30 msg: "CVAT share {{ cvat_share_dir }} not found. Ensure NFS mounts ran first."
31 when: not cvat_share_stat.stat.exists
32
33- name: Write .env for compose
34 template:
35 src: "cvat.env.j2"
36 dest: "{{ cvat_config_dir }}/.env"
37 owner: "{{ runner_user }}"
38 group: "{{ runner_group }}"
39 mode: '0664'
40
41- name: Create CVAT Docker Compose override file
42 template:
43 src: "cvat-docker-compose.override.yml.j2"
44 dest: "{{ cvat_config_dir }}/docker-compose.override.yml"
45 owner: "{{ runner_user }}"
46 group: "{{ runner_group }}"
47 mode: '0664'
48 notify: restart cvat
49
50- name: Modify base Docker Compose file ports
51 lineinfile:
52 path: "{{ cvat_config_dir }}/docker-compose.yml"
53 regexp: '^\s+- "?8080:8080"?$'
54 line: ' - "{{ cvat_http_port }}:8080"'
55 backrefs: yes
56 notify: restart cvat
57
58- name: Modify base Docker Compose dashboard ports
59 lineinfile:
60 path: "{{ cvat_config_dir }}/docker-compose.yml"
61 regexp: '^\s+- "?8090:8090"?$'
62 line: ' - "{{ cvat_dashboard_port }}:8090"'
63 backrefs: yes
64 notify: restart cvat
65
66- name: Add share volume mount to base Docker Compose
67 lineinfile:
68 path: "{{ cvat_config_dir }}/docker-compose.yml"
69 insertafter: '^\s+- cvat_keys:/home/django/keys'
70 line: ' - "{{ cvat_share_dir }}:/home/django/share:ro"'
71 notify: restart cvat
72
73- name: Add share volume mount to worker services
74 lineinfile:
75 path: "{{ cvat_config_dir }}/docker-compose.yml"
76 insertafter: '^\s+ cvat_worker_.*:'
77 line: ' volumes:'
78 loop:
79 - cvat_worker_utils
80 - cvat_worker_import
81 - cvat_worker_export
82 - cvat_worker_annotation
83 - cvat_worker_webhooks
84 - cvat_worker_quality_reports
85 - cvat_worker_chunks
86 - cvat_worker_consensus
87 notify: restart cvat
88
89- name: Add share volume line to worker services
90 lineinfile:
91 path: "{{ cvat_config_dir }}/docker-compose.yml"
92 insertafter: '^\s+ volumes:'
93 line: ' - "{{ cvat_share_dir }}:/home/django/share:ro"'
94 loop:
95 - cvat_worker_utils
96 - cvat_worker_import
97 - cvat_worker_export
98 - cvat_worker_annotation
99 - cvat_worker_webhooks
100 - cvat_worker_quality_reports
101 - cvat_worker_chunks
102 - cvat_worker_consensus
103 notify: restart cvat
104
105
106
107 # - name: Validate Docker Compose files
108 # command: docker compose --project-directory "{{ cvat_config_dir }}" config
109 # register: compose_validate
110 # failed_when: compose_validate.rc != 0
111 # changed_when: false
112
113
114- name: Build compose file list
115 set_fact:
116 cvat_compose_files: >-
117 {{ [ 'docker-compose.yml', 'docker-compose.override.yml' ]
118 + (cvat_https_enabled | ternary(['docker-compose.https.yml'], []))
119 + (cvat_serverless_enabled | ternary(['components/serverless/docker-compose.serverless.yml'], []))
120 + (cvat_external_db_enabled | ternary(['docker-compose.external_db.yml'], [])) }}
121
122- name: Show compose files being used
123 debug:
124 var: cvat_compose_files
125
126- name: Validate Docker Compose files (exact set)
127 command: >
128 docker compose
129 {% for f in cvat_compose_files %} -f {{ cvat_config_dir }}/{{ f }}{% endfor %}
130 config
131 args:
132 chdir: "{{ cvat_config_dir }}"
133 register: compose_validate
134 changed_when: false
135 failed_when: compose_validate.rc != 0
136
137- name: Parse merged compose YAML
138 set_fact:
139 merged_compose: "{{ compose_validate.stdout | from_yaml }}"
140
141- name: Show merged Traefik ports
142 debug:
143 var: merged_compose.services.traefik.ports
144
145
146- name: Pull CVAT images
147 community.docker.docker_compose_v2:
148 project_src: "{{ cvat_config_dir }}"
149 files: "{{ cvat_compose_files }}"
150 pull: always
151 state: present
152 register: cvat_pull_result
153
154- name: Start CVAT
155 community.docker.docker_compose_v2:
156 project_src: "{{ cvat_config_dir }}"
157 files: "{{ cvat_compose_files }}"
158 state: present
159 remove_orphans: true
160 register: cvat_start_result
161
162- name: Wait for CVAT health_check
163 command: docker exec -t cvat_server python manage.py health_check
164 register: cvat_hc
165 retries: 20
166 delay: 6
167 until: cvat_hc.rc == 0
168 changed_when: false
169 failed_when: cvat_hc.rc != 0
170
171- name: Bootstrap CVAT admin superuser
172 when: cvat_bootstrap_admin | default(true)
173 shell: |
174 docker exec -i cvat_server bash -lc "python3 - <<'PY'
175 import os
176 import django
177 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cvat.settings.production')
178 django.setup()
179 from django.contrib.auth import get_user_model
180 User = get_user_model()
181 u='{{ cvat_admin_username | default("admin") }}'
182 e='{{ cvat_admin_email | default("[email protected]") }}'
183 p='{{ cvat_admin_password | default("ChangeMe!123") }}'
184 if not User.objects.filter(username=u).exists():
185 User.objects.create_superuser(u, e, p)
186 PY"
187 args:
188 executable: /bin/bash
189 changed_when: false
190
191- name: Display CVAT deployment summary
192 debug:
193 msg: |
194 CVAT Deployment:
195 - Status: {{ 'Updated' if (cvat_pull_result.changed or cvat_start_result.changed) else 'Already running' }}
196 - URL: {{ (cvat_https_enabled | default(false)) | ternary('https','http') }}://{{ cvat_domain }}{{ (cvat_https_enabled | default(false)) | ternary('', ':' ~ cvat_http_port | default(':8080')) }}
197 - Repo: {{ cvat_repo_url }} @ {{ cvat_repo_version }}
198 - Images: CVAT_VERSION={{ cvat_image_tag }}
199 - NAS Share (host): {{ cvat_share_dir }} â (in-container): /home/django/share
200 - Compose files: {{ cvat_compose_files | join(', ') }}
201 - Admin User: {{ cvat_admin_username | default('admin') }}
202
203