Djadhere » Historique » Version 11
Matthieu Herrb, 26/05/2022 11:39
adherents -> adhesions
1 | 1 | Élie Bouttier | h1. Djadhere |
---|---|---|---|
2 | 1 | Élie Bouttier | |
3 | 1 | Élie Bouttier | C’est le SI de tetaneutral.net ! Il est codé en Python avec le framework web Django. |
4 | 9 | Matthieu Herrb | Il est accessible à l’adresse https://adhesions.tetaneutral.net. |
5 | 1 | Élie Bouttier | |
6 | 1 | Élie Bouttier | h2. Contribuer |
7 | 1 | Élie Bouttier | |
8 | 1 | Élie Bouttier | Le code source est sur la forge de ffdn : https://code.ffdn.org/tetaneutral.net/djadhere |
9 | 1 | Élie Bouttier | Celle-ci permet également d’ouvrir des tickets ou de créer des pull-requests. |
10 | 1 | Élie Bouttier | Pour rejoindre l’équipe, demander à djanos ou nim65s sur IRC. |
11 | 2 | Élie Bouttier | Pad de travail : http://pad.tetaneutral.net/p/djadhere |
12 | 8 | Laurent GUERBY | Pad : http://pad.tetaneutral.net/p/web |
13 | 8 | Laurent GUERBY | Liste : https://lists.tetaneutral.net/listinfo/projet-web |
14 | 1 | Élie Bouttier | |
15 | 4 | Élie Bouttier | h2. Utilisation |
16 | 4 | Élie Bouttier | |
17 | 5 | Élie Bouttier | h3. Ligne de commande |
18 | 5 | Élie Bouttier | |
19 | 4 | Élie Bouttier | Accès au @manage.py@ : |
20 | 4 | Élie Bouttier | |
21 | 4 | Élie Bouttier | @# ./go-prod.sh |
22 | 4 | Élie Bouttier | $ cd app |
23 | 4 | Élie Bouttier | $ ./manage.py@ |
24 | 4 | Élie Bouttier | |
25 | 4 | Élie Bouttier | Création d’un super utilisateur : |
26 | 4 | Élie Bouttier | |
27 | 4 | Élie Bouttier | @$ ./manage.py createsuperuser@ |
28 | 4 | Élie Bouttier | |
29 | 4 | Élie Bouttier | Statistiques financières des services : |
30 | 4 | Élie Bouttier | |
31 | 4 | Élie Bouttier | @$ ./manage.py servicesstats@ |
32 | 5 | Élie Bouttier | |
33 | 5 | Élie Bouttier | h3. Interface django admin |
34 | 5 | Élie Bouttier | |
35 | 10 | Matthieu Herrb | Accès : https://adhesions.tetaneutral.net/admin/ |
36 | 5 | Élie Bouttier | |
37 | 7 | Élie Bouttier | h4. Comptes de tests |
38 | 7 | Élie Bouttier | |
39 | 7 | Élie Bouttier | Différents comptes de tests sont disponibles pour tester les fonctionnalités en tant que membre d’équipage pour un service donnée ou responsable banquaire. |
40 | 7 | Élie Bouttier | Les logins et mots de passe sont disponibles dans le fichier 'password.txt' présent dans le home de l’utilisateur django-prod. |
41 | 7 | Élie Bouttier | |
42 | 5 | Élie Bouttier | h4. Création d’un nouveau type de service et délégation de sa gestion |
43 | 5 | Élie Bouttier | |
44 | 5 | Élie Bouttier | * Créer un groupe « equipage-toulouse » par exemple |
45 | 5 | Élie Bouttier | * Créer un nouveau type de service « Abo Toulouse » par exemple, et définir le groupe « equipage-toulouse » comme groupe de gestion |
46 | 5 | Élie Bouttier | * Dans le profil des utilisateurs gestionnaires : |
47 | 5 | Élie Bouttier | * Cocher « Statut équipe » pour lui permettre de se connecter à l’interface d’administration |
48 | 5 | Élie Bouttier | * L’ajouter au groupe « equipage-toulouse » pour lui donner les droits nécessaires |
49 | 5 | Élie Bouttier | * Créer un ou des services de type « Abo Toulouse » en configurant la / les IP associé(s) mais sans spécifier d’adhérent. |
50 | 5 | Élie Bouttier | |
51 | 5 | Élie Bouttier | h4. Gestion d’un service par un membre d’une équipe |
52 | 5 | Élie Bouttier | |
53 | 5 | Élie Bouttier | Un utilisateur appartenant à un équipage peut : |
54 | 5 | Élie Bouttier | |
55 | 5 | Élie Bouttier | * Consulter les utilisateurs, modifier leur nom, prénom, adresse emails, numéro de téléphone et adresse. |
56 | 5 | Élie Bouttier | * Définir comme adhérent un utilisateur et ainsi lui obtenir un numéro d’adhérent. |
57 | 10 | Matthieu Herrb | * Consulter les adhérent·es (utilisateur·rice ou personne morale) et ajouter une cotisation. |
58 | 6 | Élie Bouttier | Une cotisation reste modifiable ou supprimable jusqu’à validation par l’équipage « banque ». |
59 | 5 | Élie Bouttier | * Consulter les services des types correspondant aux groupes de gestion auquel l’utilisateur appartient. |
60 | 1 | Élie Bouttier | * Modifier les services : adhérent, date de début, date de fin et paiements liés au service. |
61 | 6 | Élie Bouttier | Les paiements sont modifiable et supprimable jusqu’à validation par l’équipage « banque ». |
62 | 6 | Élie Bouttier | |
63 | 6 | Élie Bouttier | h4. Configuration d’un équipage « banque » |
64 | 6 | Élie Bouttier | |
65 | 6 | Élie Bouttier | * Créer un groupe « equipage-banque » et lui donner les 4 permissions « banking | paiement » : add / change / delete / validate. |
66 | 6 | Élie Bouttier | * Éditer les utilisateurs voulus et les ajouter au groupe « equipage-banque ». |
67 | 6 | Élie Bouttier | |
68 | 6 | Élie Bouttier | h4. Gestion des paiements par l’équipage « banque » |
69 | 6 | Élie Bouttier | |
70 | 6 | Élie Bouttier | Un utilisateur avec les permissions « banking | paiement » peut consulter et modifier l’ensemble des paiements. |
71 | 6 | Élie Bouttier | Il peut en particulier les valider ; ceux-ci ne sont alors plus modifiable par les membres d’équipage « services ». |
72 | 6 | Élie Bouttier | FIXME: Il n’y a pour le moment aucun stoquage des coordonnées banquaires. |
73 | 4 | Élie Bouttier | |
74 | 1 | Élie Bouttier | h2. Déploiement |
75 | 1 | Élie Bouttier | |
76 | 1 | Élie Bouttier | Il est déployé sur la VM djadhere.tetaneutral.net (Debian 8.6 Jessie). |
77 | 1 | Élie Bouttier | Deux instances sont déployées, la première pour la version de production, et la deuxième pour la version de developpement. |
78 | 1 | Élie Bouttier | |
79 | 1 | Élie Bouttier | Le serveur web utilisé est nginx. |
80 | 1 | Élie Bouttier | La configuration se trouve dans le fichier @/etc/nginx/sites-available/djadhere@. |
81 | 1 | Élie Bouttier | |
82 | 1 | Élie Bouttier | Les certificats letsencrypt sont généré avec @certbot@ (installé depuis les backports) : |
83 | 1 | Élie Bouttier | |
84 | 1 | Élie Bouttier | @certbot -c /etc/letsencrypt/webroot.ini -d mondomaine.tetaneutral.net@ |
85 | 1 | Élie Bouttier | |
86 | 1 | Élie Bouttier | La base de données utilisée est postgresql. |
87 | 1 | Élie Bouttier | |
88 | 1 | Élie Bouttier | Django est lancé par @uwsgi@. |
89 | 1 | Élie Bouttier | La configuration de celui-ci se trouve dans le dossier @/etc/uwsgi/@. |
90 | 1 | Élie Bouttier | Les dossiers @apps-available@ et @apps-enabled@ ne sont pas utilisé. |
91 | 1 | Élie Bouttier | En effet, l’ajout du .service systemd uwsgi@.service permet de lancer de manière indépendante chaque instance. |
92 | 1 | Élie Bouttier | |
93 | 1 | Élie Bouttier | Voici une description du déploiement de la prod, le déploiement en dev étant analogue. |
94 | 1 | Élie Bouttier | |
95 | 1 | Élie Bouttier | Le dossier @/etc/uwsgi/djadhere/@ contient un lien symbolique vers la configuration uwsgi de cette instance. |
96 | 1 | Élie Bouttier | Le lien est nommé @prod@ permettant d’utiliser systemd ainsi : |
97 | 1 | Élie Bouttier | |
98 | 1 | Élie Bouttier | @systemctl {start,stop,restart,status} uwsgi@djadhere-prod@ |
99 | 1 | Élie Bouttier | |
100 | 1 | Élie Bouttier | Un utilisateur @djadhere-prod@ a été créé (et automatiquement un groupe du même nom). |
101 | 1 | Élie Bouttier | L’utilisateur @www-data@ a été rajouté au groupe @djadhere-prod@. |
102 | 1 | Élie Bouttier | L’umask de @djadhere-prod@ est définie à 077 dans son @.bashrc@. |
103 | 1 | Élie Bouttier | |
104 | 1 | Élie Bouttier | Le home de djadhere-prod se trouve dans le dossier @/srv/djadhere/prod@ et contient : |
105 | 1 | Élie Bouttier | |
106 | 1 | Élie Bouttier | * @uwsgi.ini@ : la conf uwsgi symlinké depuis @/etc/uwsgi/djadhere/prod@ |
107 | 1 | Élie Bouttier | * @uwsgi.socket@ : le socket unix référencé dans la conf de nginx |
108 | 1 | Élie Bouttier | * @touch-to-reload@ : un fichier permettant de relancer uwsgi via la commande touch : @touch touch-to-reload@ |
109 | 1 | Élie Bouttier | * @app@ : un clone du projet Git |
110 | 1 | Élie Bouttier | * @log@ : les logs (nginx + uwsgi + django) |
111 | 1 | Élie Bouttier | * @venv@ : le virtualenv dans lequel tourne django |
112 | 1 | Élie Bouttier | * @webdir@ : le dossier servie par nginx (g+rX) qui contient un dossier static et un dossier media (géré par django) |
113 | 1 | Élie Bouttier | * @update.sh@ : un script pour mettre à jour |
114 | 1 | Élie Bouttier | |
115 | 1 | Élie Bouttier | Voici la conf uwsgi.ini : |
116 | 1 | Élie Bouttier | |
117 | 1 | Élie Bouttier | <pre> |
118 | 1 | Élie Bouttier | [uwsgi] |
119 | 1 | Élie Bouttier | |
120 | 1 | Élie Bouttier | uid = djadhere-prod |
121 | 1 | Élie Bouttier | gid = djadhere-prod |
122 | 1 | Élie Bouttier | |
123 | 1 | Élie Bouttier | chdir = /srv/djadhere/prod/app |
124 | 1 | Élie Bouttier | |
125 | 1 | Élie Bouttier | plugin=python3 |
126 | 1 | Élie Bouttier | module=djadhere.wsgi:application |
127 | 1 | Élie Bouttier | virtualenv = /srv/djadhere/prod/venv |
128 | 1 | Élie Bouttier | env=DJANGO_SETTINGS_MODULE=djadhere.local_settings |
129 | 1 | Élie Bouttier | |
130 | 1 | Élie Bouttier | uwsgi-socket=/srv/djadhere/prod/uwsgi.socket |
131 | 1 | Élie Bouttier | chmod-socket=660 |
132 | 1 | Élie Bouttier | |
133 | 1 | Élie Bouttier | pidfile=/srv/djadhere/prod/uwsgi.pid |
134 | 1 | Élie Bouttier | touch-reload = /srv/djadhere/prod/touch-to-reload |
135 | 1 | Élie Bouttier | |
136 | 1 | Élie Bouttier | logto=/srv/djadhere/prod/log/uwsgi.log |
137 | 1 | Élie Bouttier | logfile-chmod=400 |
138 | 1 | Élie Bouttier | logfile-chown=djadhere-prod:djadhere-prod |
139 | 1 | Élie Bouttier | |
140 | 1 | Élie Bouttier | vacuum=True |
141 | 1 | Élie Bouttier | </pre> |
142 | 1 | Élie Bouttier | |
143 | 1 | Élie Bouttier | Voici une partie de la configuration local de django (situé dans @app/djadhere/local_settings.py@) : |
144 | 1 | Élie Bouttier | |
145 | 1 | Élie Bouttier | <pre> |
146 | 1 | Élie Bouttier | from djadhere.settings import * |
147 | 1 | Élie Bouttier | |
148 | 1 | Élie Bouttier | from os.path import join |
149 | 1 | Élie Bouttier | |
150 | 1 | Élie Bouttier | |
151 | 1 | Élie Bouttier | BASE_DIR = '/srv/djadhere/prod/' |
152 | 1 | Élie Bouttier | |
153 | 1 | Élie Bouttier | SECRET_KEY = 'removed' |
154 | 1 | Élie Bouttier | |
155 | 1 | Élie Bouttier | DATABASES = { |
156 | 1 | Élie Bouttier | 'default': { |
157 | 1 | Élie Bouttier | 'ENGINE': 'django.db.backends.postgresql_psycopg2', |
158 | 1 | Élie Bouttier | 'NAME': 'djadhere_prod', |
159 | 1 | Élie Bouttier | 'USER': 'djadhere_prod', |
160 | 1 | Élie Bouttier | 'PASSWORD': 'removed', |
161 | 1 | Élie Bouttier | 'HOST': 'localhost', |
162 | 1 | Élie Bouttier | 'PORT': '', |
163 | 1 | Élie Bouttier | }, |
164 | 1 | Élie Bouttier | } |
165 | 1 | Élie Bouttier | |
166 | 1 | Élie Bouttier | DEBUG = False |
167 | 1 | Élie Bouttier | |
168 | 1 | Élie Bouttier | LOGGING = { |
169 | 1 | Élie Bouttier | 'version': 1, |
170 | 1 | Élie Bouttier | 'disable_existing_loggers': False, |
171 | 1 | Élie Bouttier | 'handlers': { |
172 | 1 | Élie Bouttier | 'file': { |
173 | 1 | Élie Bouttier | 'level': 'WARNING', |
174 | 1 | Élie Bouttier | 'class': 'logging.FileHandler', |
175 | 1 | Élie Bouttier | 'filename': join(BASE_DIR, 'log/debug.log'), |
176 | 1 | Élie Bouttier | }, |
177 | 1 | Élie Bouttier | 'mail_admins': { |
178 | 1 | Élie Bouttier | 'class': 'django.utils.log.AdminEmailHandler', |
179 | 1 | Élie Bouttier | 'level': 'ERROR', |
180 | 1 | Élie Bouttier | # But the emails are plain text by default - HTML is nicer |
181 | 1 | Élie Bouttier | 'include_html': True, |
182 | 1 | Élie Bouttier | }, |
183 | 1 | Élie Bouttier | }, |
184 | 1 | Élie Bouttier | 'loggers': { |
185 | 1 | Élie Bouttier | 'django.request': { |
186 | 1 | Élie Bouttier | 'handlers': ['file', 'mail_admins'], |
187 | 1 | Élie Bouttier | 'level': 'WARNING', |
188 | 1 | Élie Bouttier | 'propagate': True, |
189 | 1 | Élie Bouttier | }, |
190 | 1 | Élie Bouttier | }, |
191 | 1 | Élie Bouttier | } |
192 | 1 | Élie Bouttier | |
193 | 1 | Élie Bouttier | STATIC_ROOT = join(BASE_DIR, 'webdir/static') |
194 | 1 | Élie Bouttier | STATIC_URL = '/static/' |
195 | 1 | Élie Bouttier | |
196 | 1 | Élie Bouttier | MEDIA_ROOT = join(BASE_DIR, 'webdir/media') |
197 | 1 | Élie Bouttier | MEDIA_URL = '/media/' |
198 | 1 | Élie Bouttier | |
199 | 11 | Matthieu Herrb | ALLOWED_HOSTS = [ 'adhesions.tetaneutral.net' ] |
200 | 1 | Élie Bouttier | |
201 | 1 | Élie Bouttier | DEFAULT_FROM_EMAIL = 'noreply@tetaneutral.net' |
202 | 1 | Élie Bouttier | SERVER_EMAIL = 'djadhere <projet-web-at-lists.tetaneutral.net>' |
203 | 1 | Élie Bouttier | EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' |
204 | 1 | Élie Bouttier | EMAIL_HOST = 'smtp' |
205 | 1 | Élie Bouttier | EMAIL_SUBJECT_PREFIX = "[PROD] " |
206 | 1 | Élie Bouttier | |
207 | 1 | Élie Bouttier | ADMINS = ( |
208 | 1 | Élie Bouttier | ('Prénom Nom', 'adresse mail'), |
209 | 1 | Élie Bouttier | ) |
210 | 1 | Élie Bouttier | </pre> |
211 | 1 | Élie Bouttier | |
212 | 1 | Élie Bouttier | Et le script d’easy update : |
213 | 1 | Élie Bouttier | |
214 | 1 | Élie Bouttier | <pre> |
215 | 1 | Élie Bouttier | #!/bin/bash |
216 | 1 | Élie Bouttier | |
217 | 1 | Élie Bouttier | cd ~/app |
218 | 1 | Élie Bouttier | git fetch |
219 | 1 | Élie Bouttier | git checkout master |
220 | 1 | Élie Bouttier | pip install --upgrade -r requirements.txt |
221 | 1 | Élie Bouttier | ./manage.py migrate |
222 | 3 | Élie Bouttier | ./manage.py collectstatic --noinput |
223 | 1 | Élie Bouttier | |
224 | 1 | Élie Bouttier | cd ~ |
225 | 1 | Élie Bouttier | chmod g+rX webdir -R |
226 | 1 | Élie Bouttier | touch touch-to-reload |
227 | 1 | Élie Bouttier | </pre> |