Deploiement de HackInScience avec ansible (par Julien Palard) ¶
-
https://discuss.afpy.org/t/deploiement-d-une-application-django/1643
-
https://framagit.org/hackinscience/hkis-ansible/-/blob/main/roles/website/tasks/main.yml
Pour ma part je déploie tout systématiquement avec Ansible.
Mais que ce soit Ansible, Salt, Puppet, Chef, un Makefile, un shell script, ou n’importe quoi d’autre, peu importe en fait, ce qui compte pour moi c’est le côté reproductible : ton serveur brûle ?
Pas de soucis, tu relances le playbook, tu recharges une sauvegarde, et c’est reparti.
J’ai par exemple HackInScience qui est déployé comme ça https://framagit.org/hackinscience/hkis-ansible/-/blob/main/roles/website/tasks/main.yml
1---
2
3- name: Install dependencies
4 apt:
5 state: present
6 name:
7 - build-essential
8 - gettext
9 - cron
10 - git
11 - nginx
12 - postgresql
13 - postgresql-server-dev-all # To compile Python client.
14 - pgbadger
15 - python3
16 - python3-pip
17 - python3-psycopg2
18 - python3-venv
19 - sudo
20 update_cache: true
21 tags: website
22
23- name: Add unix user website
24 user:
25 name: website
26 shell: /bin/false
27 system: yes
28 home: /opt/hkis-website
29 tags: website
30
31- name: install hkis-daphne.service (systemd)
32 copy:
33 src: systemd/hkis-daphne.service
34 dest: /etc/systemd/system/hkis-daphne.service
35 owner: root
36 group: root
37 mode: 0644
38 notify: restart daphne
39 tags: website
40
41- name: add user website to pgsql
42 become: true
43 become_user: postgres
44 postgresql_user:
45 user: website
46 tags: website
47
48- name: add database hkis
49 become: true
50 become_user: postgres
51 postgresql_db:
52 name: hkis
53 owner: website
54 tags: website
55
56- name: Configure psql
57 notify: reload psql
58 copy:
59 dest: /etc/postgresql/13/main/conf.d/hkis.conf
60 owner: postgres
61 group: postgres
62 mode: 0644
63 content: |
64 log_min_duration_statement = 0
65 log_checkpoints = on
66 log_connections = on
67 log_disconnections = on
68 log_lock_waits = on
69 log_temp_files = 0
70 log_autovacuum_min_duration = 0
71 log_error_verbosity = default
72 lc_messages='en_US.UTF-8'
73 lc_messages='C'
74
75- name: git website repo
76 git:
77 repo: https://framagit.org/hackinscience/hkis-website.git
78 dest: /opt/hkis-website/src
79 force: true
80 tags: website
81 notify: restart website
82
83- name: read git HEAD ref
84 command: git -C /opt/hkis-website/src rev-parse HEAD
85 register: git_head
86 tags: website
87
88- name: Creates a /opt/hkis-website/venv for virtual environments
89 file:
90 path: /opt/hkis-website/venv
91 state: directory
92 mode: 0755
93 tags: website
94
95- name: Creates a /opt/hkis-website/locale for translations
96 file:
97 path: /opt/hkis-website/locale
98 state: directory
99 mode: 0755
100 tags: website
101
102- name: pip installs requirements
103 pip:
104 chdir: /opt/hkis-website/src
105 requirements: requirements.txt
106 virtualenv: /opt/hkis-website/venv
107 virtualenv_command: /usr/bin/python3 -m venv
108 tags: website
109
110- name: pip installs sentry
111 pip:
112 chdir: /opt/hkis-website/src
113 name: sentry-sdk>=0.19.5
114 virtualenv: /opt/hkis-website/venv
115 virtualenv_command: /usr/bin/python3 -m venv
116 tags: website
117
118- name: pip installs psycopg2
119 pip:
120 chdir: /opt/hkis-website/src
121 name: psycopg2
122 virtualenv: /opt/hkis-website/venv
123 virtualenv_command: /usr/bin/python3 -m venv
124 tags: website
125
126- name: Install website configuration
127 template:
128 src: local_settings.py.j2
129 dest: /opt/hkis-website/src/hackinscience_org/local_settings.py
130 owner: root
131 group: website
132 mode: 0640
133 notify: restart website
134 tags: website
135
136- name: Migrate db
137 command: "/opt/hkis-website/venv/bin/python manage.py migrate"
138 args:
139 chdir: "/opt/hkis-website/src"
140 register: migrate_result
141 changed_when: '" Applying " in migrate_result.stdout'
142 run_once: true
143 become: true
144 become_user: website
145 tags: [website, test]
146
147- name: Collectstatic
148 command: "/opt/hkis-website/venv/bin/python manage.py collectstatic --noinput"
149 args:
150 chdir: "/opt/hkis-website/src"
151 register: collectstatic_result
152 changed_when: '"Copying " in collectstatic_result.stdout'
153 tags: [website, test]
154
155- name: Compile gettext
156 command: "/opt/hkis-website/venv/bin/python manage.py compilemessages"
157 args:
158 chdir: "/opt/hkis-website/src"
159 notify: restart website
160 tags: [website, test]
161
162- name: Ensure website is running
163 service: name=hkis-daphne state=started enabled=yes
164 tags: website
165
166- name: Configure nginx host
167 template:
168 src: nginx-vhost
169 dest: "/etc/nginx/sites-available/{{ website_vhost }}"
170 owner: root
171 group: root
172 mode: 0644
173 notify: reload nginx
174 tags: website
175
176- name: Create symlink for API nginx site
177 file:
178 src: "/etc/nginx/sites-available/{{ website_vhost }}"
179 dest: "/etc/nginx/sites-enabled/{{ website_vhost }}"
180 state: link
181 notify: reload nginx
182 tags: website
183
184- name: Daily backup
185 cron:
186 user: website
187 name: "backup"
188 job: "/usr/bin/pg_dump --clean hkis > backup.sql"
189 hour: '2'
190 minute: '0'
Ça s’occupe des statiques, de l’i18n, du certificat HTTPS, de la configuration de nginx…
Libre à toi de cp -r, tout relire, élaguer ce qui ne t’es pas utile, renommer ce qui le doit, n’hésite pas à me poser des questions, te faire relire (je ne suis pas le seul ici à lire de l’Ansible, d’ailleurs je ne suis pas du tout le meilleur ici, je me contente de peu avec Ansible).
Attention ne cherche pas de gunicorn ou de uwsgi dans ma config hkis, j’utilise daphne car j’ai des websockets (et donc vite de l’asyncio), donc ça passe par asgi.py et pas wsgi.py.
Mais ça marche pareil sinon, ça sait très bien délivrer des vues synchrones aussi.
Je te déconseille de déployer automatiquement via de la CI/CI, du moins pas maintenant : KISS.
Pour héberger ça il te faut un serveur et un nom de domaine, dis-nous si tu as aussi besoin de guidage sur le sujet.