chore: update
This commit is contained in:
@@ -20,15 +20,15 @@ backend_dir: "/home/ubuntu/backend"
|
||||
backend_binary: "/home/ubuntu/backend/main"
|
||||
uploads_dir: "/home/ubuntu/backend/uploads"
|
||||
frontend_port: 5173
|
||||
domain_name: "mln-uber.club"
|
||||
domain_name: "uber-demo.club"
|
||||
# Utilisateurs et permissions
|
||||
user_web: "www-data" # Utilisateur pour les applications web
|
||||
user_deploy: "ubuntu" # Utilisateur pour le déploiement
|
||||
user_owner: "root" # Propriétaire des fichiers systemd
|
||||
|
||||
ip: "5.181.0.112"
|
||||
# Backend
|
||||
backend_local_port: 8080
|
||||
backend_port: 443
|
||||
backend_port: 80
|
||||
# Timeouts
|
||||
nginx_proxy_timeout: 60
|
||||
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
[all]
|
||||
uber-stup ansible_host=5.252.20.129 ansible_user=root ansible_ssh_pass=rL9lY6YkcDQmfRuZ3Z
|
||||
uber-stup-web ansible_host=185.234.9.102 ansible_user=root ansible_ssh_pass=hTASFYOydY46haeO3J
|
||||
demo-uber ansible_host=5.181.0.112 ansible_user=root ansible_ssh_pass=jQCpl49FcISQfHaF8j
|
||||
|
||||
[uber-stup]
|
||||
uber-stup ansible_host=5.252.20.129 ansible_user=root ansible_ssh_pass=rL9lY6YkcDQmfRuZ3Z
|
||||
|
||||
[uber-stup-web]
|
||||
uber-stup-web ansible_host=185.234.9.102 ansible_user=root ansible_ssh_pass=hTASFYOydY46haeO3J
|
||||
|
||||
[demo-uber]
|
||||
demo-uber ansible_host=5.181.0.112 ansible_user=root ansible_ssh_pass=jQCpl49FcISQfHaF8j
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
- name: Installation et configuration du frontend et backend
|
||||
hosts: uber-stup
|
||||
hosts: demo-uber
|
||||
become: true
|
||||
gather_facts: true
|
||||
|
||||
@@ -203,7 +203,6 @@
|
||||
port: "{{ item }}"
|
||||
proto: tcp
|
||||
loop:
|
||||
- "{{ backend_port }}"
|
||||
- 80
|
||||
- 22
|
||||
|
||||
@@ -211,15 +210,15 @@
|
||||
ansible.builtin.ufw:
|
||||
state: enabled
|
||||
|
||||
- name: Vérifier si un certificat existe déjà
|
||||
ansible.builtin.stat:
|
||||
path: "/etc/letsencrypt/live/{{ domain_name }}/fullchain.pem"
|
||||
register: cert_file
|
||||
tags: [certbot]
|
||||
|
||||
# - name: Vérifier si un certificat existe déjà
|
||||
# ansible.builtin.stat:
|
||||
# path: "/etc/letsencrypt/live/{{ domain_name }}/fullchain.pem"
|
||||
# register: cert_file
|
||||
# tags: [certbot]
|
||||
#
|
||||
- name: Déployer la configuration Nginx HTTP
|
||||
ansible.builtin.template:
|
||||
src: templates/nginx.conf.j2
|
||||
src: templates/nginx2.conf.j2
|
||||
dest: /etc/nginx/sites-available/api
|
||||
vars:
|
||||
ssl_enabled: false
|
||||
@@ -254,59 +253,57 @@
|
||||
# ============================================================
|
||||
# Certificat SSL Let's Encrypt
|
||||
# ============================================================
|
||||
|
||||
- name: Générer le certificat SSL avec Certbot
|
||||
ansible.builtin.command: >
|
||||
certbot certonly --nginx
|
||||
-d {{ domain_name }}
|
||||
--non-interactive
|
||||
--agree-tos
|
||||
--email admin@{{ domain_name }}
|
||||
when: not cert_file.stat.exists
|
||||
tags: [certbot]
|
||||
# - name: Générer le certificat SSL avec Certbot
|
||||
# ansible.builtin.command: >
|
||||
# certbot certonly --nginx
|
||||
# -d {{ domain_name }}
|
||||
# --non-interactive
|
||||
# --agree-tos
|
||||
# --email admin@{{ domain_name }}
|
||||
# tags: [certbot]
|
||||
|
||||
# ============================================================
|
||||
# Nginx - reconfiguration HTTPS après certificat
|
||||
# ============================================================
|
||||
- name: Vérifier la présence du certificat
|
||||
ansible.builtin.stat:
|
||||
path: "/etc/letsencrypt/live/{{ domain_name }}/fullchain.pem"
|
||||
register: cert_file_after
|
||||
tags: [nginx]
|
||||
# - name: Vérifier la présence du certificat
|
||||
# ansible.builtin.stat:
|
||||
# path: "/etc/letsencrypt/live/{{ domain_name }}/fullchain.pem"
|
||||
# register: cert_file_after
|
||||
# tags: [nginx]
|
||||
|
||||
- name: Déployer la configuration Nginx HTTPS
|
||||
ansible.builtin.template:
|
||||
src: templates/nginx.conf.j2
|
||||
dest: /etc/nginx/sites-available/api
|
||||
vars:
|
||||
ssl_enabled: true
|
||||
when: cert_file_after.stat.exists
|
||||
notify: Restart nginx
|
||||
tags: [nginx]
|
||||
#- name: Déployer la configuration Nginx HTTPS
|
||||
# ansible.builtin.template:
|
||||
# src: templates/nginx.conf.j2
|
||||
# dest: /etc/nginx/sites-available/api
|
||||
# vars:
|
||||
# ssl_enabled: true
|
||||
# when: cert_file_after.stat.exists
|
||||
# notify: Restart nginx
|
||||
# tags: [nginx]
|
||||
|
||||
- name: Test de la configuration Nginx finale
|
||||
ansible.builtin.command: nginx -t
|
||||
changed_when: false
|
||||
tags: [nginx]
|
||||
#- name: Test de la configuration Nginx finale
|
||||
# ansible.builtin.command: nginx -t
|
||||
# changed_when: false
|
||||
# tags: [nginx]
|
||||
|
||||
- name: Redémarrage de Nginx avec SSL
|
||||
ansible.builtin.systemd:
|
||||
name: nginx
|
||||
state: restarted
|
||||
when: cert_file_after.stat.exists
|
||||
tags: [nginx]
|
||||
# - name: Redémarrage de Nginx avec SSL
|
||||
# ansible.builtin.systemd:
|
||||
# name: nginx
|
||||
# state: restarted
|
||||
# when: cert_file_after.stat.exists
|
||||
# tags: [nginx]
|
||||
|
||||
- name: Vérifier le renouvellement automatique
|
||||
ansible.builtin.command: certbot renew --dry-run
|
||||
register: certbot_renew
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
tags: [certbot]
|
||||
# - name: Vérifier le renouvellement automatique
|
||||
# ansible.builtin.command: certbot renew --dry-run
|
||||
# register: certbot_renew
|
||||
# changed_when: false
|
||||
# failed_when: false
|
||||
# tags: [certbot]
|
||||
|
||||
- name: Afficher le statut du renouvellement
|
||||
ansible.builtin.debug:
|
||||
msg: "{{ certbot_renew.stdout_lines }}"
|
||||
tags: [certbot]
|
||||
# - name: Afficher le statut du renouvellement
|
||||
# ansible.builtin.debug:
|
||||
# msg: "{{ certbot_renew.stdout_lines }}"
|
||||
# tags: [certbot]
|
||||
|
||||
handlers:
|
||||
- name: Reload systemd
|
||||
|
||||
+2
-76
@@ -3,7 +3,7 @@
|
||||
# PostgreSQL Installation (vm-postgres uniquement)
|
||||
# ============================================
|
||||
- name: Installation et configuration de PostgreSQL
|
||||
hosts: uber-stup
|
||||
hosts: demo-uber
|
||||
become: true
|
||||
gather_facts: true
|
||||
|
||||
@@ -120,80 +120,6 @@
|
||||
privs: ALL
|
||||
state: present
|
||||
|
||||
# ============================================================
|
||||
# Données initiales - corrections d'adresses
|
||||
# ============================================================
|
||||
- name: Insérer les corrections d'adresses
|
||||
become_user: postgres
|
||||
ansible.builtin.postgresql_query:
|
||||
db: "{{ db_name }}"
|
||||
query: |
|
||||
INSERT INTO adresse_correction (invalid_address, correct_address) VALUES
|
||||
('6 Place Alfred Lallié 44000 Nantes', '13 Rue Saint-Rogatien 44000 Nantes'),
|
||||
('26 boulevard Vincent gâche 44200', '62 Rue des Français Libres 44200'),
|
||||
('41 quai Malakoff 44000', '41 rue du pré Gauchet 44000'),
|
||||
('au 6 rue du Rhône 44100', '106 rue du bois Hardy 44100'),
|
||||
('10 allée de l''île gloriette 44000', '8 rue Deurbroucq 44000'),
|
||||
('1 Ter Boulevard de Launay 44100', '5 Rue Lavoisier 44100'),
|
||||
('6 Boulevard de la prairie au duc 44200', '10 Rue Alain Barbe Torte 44200'),
|
||||
('4 rue de mauves , 44470 thouaré sur Loire', '4 Rue de la Halbarderie 44470 Thouaré-sur-Loire'),
|
||||
('26 rue Louis blanc, 44200 Nantes', '6 Rue de Hercé 44200 Nantes'),
|
||||
('4 rue la tour d''Auvergne 44200 nantes', '6 Rue de Hercé 44200 Nantes'),
|
||||
('12 rue d''Orléans 44000', '10 rue de l''industrie 44000'),
|
||||
('3 rue Bertrand Geslin 44000 Nantes', '10 Rue de Sévigné 44000 Nantes'),
|
||||
('33 boulevard de doulon 44300', '3 Avenue du Forgeron 44300 Nantes'),
|
||||
('2 rue Stanislas Baudry 44000 Nantes', '9 Rue de Richebourg 44000 Nantes'),
|
||||
('8 Place Saint-Pierre, 44000 Nantes', '2 Rue Saint-Denis 44000 Nantes'),
|
||||
('20 boulevard du petit port 44300', '3 Rue du Transvaal 44300 Nantes'),
|
||||
('5 cours Sully 44000 Nantes', '75 Rue Préfet Bonnefoy 44000'),
|
||||
('50 rue Paul Bellamy 44000', '2 rue du docteur Heurteaux 44000'),
|
||||
('33 rue de la petite sensive 44300', '8 Rue du Docteur Chenantais 44300'),
|
||||
('45 rue Louis guiotton 44300 Nantes', '59 Rue de Nancy 44300 Nantes'),
|
||||
('6 rue Meuris 44000 Nantes', '3 Rue Daubenton 44100 Nantes'),
|
||||
('26 rue Félix Faure 44000', '12 rue bonaparte 44000'),
|
||||
('1 rue Charles Dullin 44100 nantes', '12 Avenue de l''Églantine 44800 Saint-Herblain'),
|
||||
('16 rue Anatole de monzie 44200', '1 Rue Georges Leygues 44200 Nantes'),
|
||||
('52 boulevard de l''Estuaire 44200', '1 Rue Ruth First 44200 Nantes'),
|
||||
('186 Route de Saint-Joseph 44300 Nantes', 'Rue de Pontecorvo 44300 Nantes'),
|
||||
('16 Rue Jules Launey 44100 Nantes', '5 Chemin du Pressoir Chênaie 44100 Nantes'),
|
||||
('1 rue maréchal Lyautey 44000', '9 rue Louis Mékarski 44000'),
|
||||
('74 boulevard de la prairie au duc 44200', '7 Rue René Siegfried 44200'),
|
||||
('1 impasse du baut 44300 Nantes', '8 Avenue d''Assise 44300 Nantes'),
|
||||
('5 rue moquechien, 44000 Nantes', '4 Rue Adolphe Moitié 44000 Nantes'),
|
||||
('21 chaussée de la madeleine 44000', '4 bis Rue Perrault 44000 Nantes'),
|
||||
('31 boulevard Michelet 44000', '26 Rue de la Haute Forêt 44000 Nantes'),
|
||||
('95 Boulevard longchamp 44300', '7 Petite Avenue de Longchamp 44300'),
|
||||
('7 Quai Marcel Boissard, 44400 Rezé', '6 Rue Jean Jouneau 44400 Rezé'),
|
||||
('43 avenue de la libération 44400', '10 rue de l''Erdronnière 44400'),
|
||||
('165 route de rennes 44700 orvault', '5 Rue de l''Ascension 44700 Orvault'),
|
||||
('17rue yves bodiguel 44000', '8 Rue Frédureau 44000 Nantes'),
|
||||
('176 boulevard Jules verne 44300', '44 Rue des Platanes 44300 Nantes'),
|
||||
('133 Boulevard Jules Verne 44300', '28 Rue Moriceau Thébault 44300'),
|
||||
('53 Boulevard Jules Verne 44300', '66 Rue de la Moisdonnière 44300'),
|
||||
('7 chaussé de la madeleine, 44000', '3 Rue Perrault 44000 Nantes'),
|
||||
('LA CHEVROLIÈRE', '12 Rue des Ajoncs 44400 Rezé'),
|
||||
('9 rue Delattre de tassigny 44000 nantes', '1 Rue des Cadeniers 44000 Nantes'),
|
||||
('14 place de l''Oratoire 44000 Nantes', '2 Rue Élie Delaunay 44000 Nantes'),
|
||||
('19 allée Baco, 44000 Nantes', '23 Rue Crucy 44000 Nantes'),
|
||||
('21bd babin chevaye 44200', '7 Rue de Hercé 44200 Nantes'),
|
||||
('49 boulevard dalby 44000', '51 Rue de la Ville en Pierre 44000'),
|
||||
('96 route de Vannes 44100', '14 Avenue des Coucous 44300'),
|
||||
('1 rue du Luxembourg 44000 Nantes', '5 Rue de l''Indre 44000 Nantes'),
|
||||
('3 rue de bretagne 44880 Sautron', '9 Rue de Flore 44880 Sautron'),
|
||||
('42 rue paul bellamy 44000 nantes', '5 Rue de Bouillé 44000 Nantes'),
|
||||
('125 Rue Paul Bellamy 44000 Nantes', '14 Rue Anatole le Braz 44000 Nantes'),
|
||||
('214 Rue Paul Bellamy 44000 Nantes', '17 Rue de la Saulzinière 44000 Nantes'),
|
||||
('49 Boulevard Robert Schuman 44300 Nantes', '47 Rue Georges Bizot 44300 Nantes'),
|
||||
('142 Boulevard Robert Schuman 44300', '10 Rue St-Mihiel 44300 Nantes'),
|
||||
('23 route de la chapelle sur erdre 44300', '14 Rue de la Boulonnerie 44300 Nantes'),
|
||||
('27 Rue Pierre Blard 44800 Saint-Herblain', '2 Rue Louis Boutin 44800 Saint-Herblain'),
|
||||
('109 Boulevard Ernest Dalby 44000 Nantes', '53 bis rue de la ville en pierre 44000'),
|
||||
('13 rue pitre chevalier 44000', '10 Rue Jean-Émile Laboureur 44000'),
|
||||
('Rue lesage - 44000 - Nantes', '4 rue Maurice Sibille 44000'),
|
||||
('86 Rue de la Bourgeonnière 44300', '6 Avenue de l''Alverne 44300'),
|
||||
('8 boulevard Émile romanet 44100', '33 Route de St-Herblain 44100 Nantes')
|
||||
ON CONFLICT (invalid_address) DO NOTHING;
|
||||
|
||||
# ============================================================
|
||||
# Authentification pg_hba.conf
|
||||
# ============================================================
|
||||
@@ -250,7 +176,7 @@
|
||||
# Redis Installation (vm-redis uniquement)
|
||||
# ============================================
|
||||
- name: Installation et configuration de Redis
|
||||
hosts: uber-stup
|
||||
hosts: demo-uber
|
||||
become: true
|
||||
gather_facts: true
|
||||
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
# =========================================================
|
||||
# Request ID for correlation
|
||||
# =========================================================
|
||||
map $http_x_request_id $req_id {
|
||||
default $http_x_request_id;
|
||||
"" $request_id;
|
||||
}
|
||||
|
||||
# =========================================================
|
||||
# Rate limiting
|
||||
# =========================================================
|
||||
limit_req_zone $binary_remote_addr zone=api:10m rate=30r/m;
|
||||
limit_req_zone $binary_remote_addr zone=uploads:10m rate=10r/m;
|
||||
|
||||
# =========================================================
|
||||
# Upstream backend
|
||||
# =========================================================
|
||||
upstream backend {
|
||||
server 127.0.0.1:{{ backend_local_port }} max_fails=3 fail_timeout=30s;
|
||||
keepalive 32;
|
||||
keepalive_requests 100;
|
||||
keepalive_timeout 60s;
|
||||
}
|
||||
|
||||
# =========================================================
|
||||
# API Server
|
||||
# =========================================================
|
||||
server {
|
||||
listen {{ backend_port }};
|
||||
listen [::]:{{ backend_port }};
|
||||
server_name {{ ip }};
|
||||
client_max_body_size {{ nginx_max_body_size }};
|
||||
|
||||
server_tokens off;
|
||||
|
||||
# =========================================================
|
||||
# Security headers
|
||||
# =========================================================
|
||||
add_header X-Frame-Options "DENY" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
||||
proxy_hide_header X-Powered-By;
|
||||
proxy_hide_header Server;
|
||||
|
||||
# =========================================================
|
||||
# API proxy
|
||||
# =========================================================
|
||||
location / {
|
||||
limit_req zone=api burst=20 nodelay;
|
||||
|
||||
limit_except GET POST PUT PATCH DELETE OPTIONS { deny all; }
|
||||
|
||||
proxy_pass http://backend;
|
||||
proxy_http_version 1.1;
|
||||
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Request-ID $req_id;
|
||||
proxy_set_header Connection "";
|
||||
|
||||
proxy_connect_timeout 60s;
|
||||
proxy_send_timeout 60s;
|
||||
proxy_read_timeout 60s;
|
||||
}
|
||||
|
||||
# =========================================================
|
||||
# Uploads
|
||||
# =========================================================
|
||||
location /uploads/ {
|
||||
alias {{ uploads_dir }}/;
|
||||
limit_req zone=uploads burst=20 nodelay;
|
||||
limit_except GET HEAD { deny all; }
|
||||
|
||||
# Bloquer les fichiers exécutables
|
||||
location ~* \.(php|php5|phtml|sh|py|pl|cgi|exe|asp|aspx|jsp)$ {
|
||||
deny all;
|
||||
}
|
||||
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
}
|
||||
|
||||
location ^~ /uploads/images/ {
|
||||
alias {{ uploads_dir }}/images/;
|
||||
limit_req zone=uploads burst=20 nodelay;
|
||||
limit_except GET HEAD OPTIONS { deny all; }
|
||||
|
||||
add_header Access-Control-Allow-Origin "*" always;
|
||||
add_header Access-Control-Allow-Methods "GET, HEAD, OPTIONS" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable" always;
|
||||
|
||||
types {
|
||||
image/jpeg jpg jpeg;
|
||||
image/png png;
|
||||
image/gif gif;
|
||||
image/webp webp;
|
||||
image/svg+xml svg;
|
||||
}
|
||||
default_type image/jpeg;
|
||||
}
|
||||
|
||||
location ^~ /uploads/videos/ {
|
||||
alias {{ uploads_dir }}/videos/;
|
||||
limit_req zone=uploads burst=20 nodelay;
|
||||
limit_except GET HEAD OPTIONS { deny all; }
|
||||
|
||||
add_header Access-Control-Allow-Origin "*" always;
|
||||
add_header Access-Control-Allow-Methods "GET, HEAD, OPTIONS" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable" always;
|
||||
|
||||
types {
|
||||
video/mp4 mp4;
|
||||
video/webm webm;
|
||||
video/ogg ogv;
|
||||
}
|
||||
default_type video/mp4;
|
||||
}
|
||||
|
||||
# =========================================================
|
||||
# Deny hidden files and sensitive files
|
||||
# =========================================================
|
||||
location ~ /\. {
|
||||
deny all;
|
||||
access_log off;
|
||||
log_not_found off;
|
||||
}
|
||||
|
||||
location ~* (\.env|\.git|package\.json|package-lock\.json|yarn\.lock|Dockerfile|docker-compose\.yml)$ {
|
||||
deny all;
|
||||
access_log off;
|
||||
log_not_found off;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user