diff --git a/.env.docker b/.env.docker new file mode 100644 index 0000000..e0e7fa3 --- /dev/null +++ b/.env.docker @@ -0,0 +1,4 @@ +# Variables pour l'interpolation docker compose (${POSTGRES_*}) +POSTGRES_DB=jooldb +POSTGRES_USER=jooluser +POSTGRES_PASSWORD=localdev_password diff --git a/Dockerfile b/Dockerfile index ef8a264..f223490 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,11 +7,7 @@ ENV PYTHONDONTWRITEBYTECODE=1 \ WORKDIR /app -# Dépendances système minimales -RUN apt-get update && apt-get install -y --no-install-recommends \ - libpq-dev \ - gcc \ - && rm -rf /var/lib/apt/lists/* +# psycopg2-binary : pas besoin de gcc/libpq-dev (économise RAM/disque au build) # Dépendances Python COPY requirements.txt . diff --git a/config/settings/prod.py b/config/settings/prod.py index d9ae18b..6246b07 100644 --- a/config/settings/prod.py +++ b/config/settings/prod.py @@ -22,7 +22,7 @@ EMAIL_HOST_USER = env('EMAIL_HOST_USER', default='') EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD', default='') # ── HTTPS / cookies ─────────────────────────────────────── -SECURE_SSL_REDIRECT = True +SECURE_SSL_REDIRECT = env.bool('SECURE_SSL_REDIRECT', default=True) SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # derrière nginx SESSION_COOKIE_SECURE = True diff --git a/docker-compose.local.yml b/docker-compose.local.yml new file mode 100644 index 0000000..c1be007 --- /dev/null +++ b/docker-compose.local.yml @@ -0,0 +1,20 @@ +# Usage local : +# docker compose --env-file .env.prod -f docker-compose.yml -f docker-compose.local.yml up --build + +services: + web: + environment: + ALLOWED_HOSTS: localhost,127.0.0.1,web + SECURE_SSL_REDIRECT: "false" + + nginx: + ports: + - "8888:80" + volumes: + - ./nginx/nginx.local.conf:/etc/nginx/conf.d/default.conf:ro + - static_volume:/app/staticfiles:ro + - media_volume:/app/media:ro + + certbot: + profiles: + - production diff --git a/docker-compose.yml b/docker-compose.yml index 01c9c84..510832c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,12 +30,8 @@ services: condition: service_healthy command: > sh -c "python manage.py migrate --noinput && - gunicorn config.wsgi:application - --bind 0.0.0.0:8000 - --workers 3 - --timeout 60 - --access-logfile - - --error-logfile -" + gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 3 + --timeout 60 --access-logfile - --error-logfile -" # ── Nginx (reverse proxy + static files) ─────────────── nginx: diff --git a/nginx/nginx.conf b/nginx/nginx.conf index dfc68a1..38ae87f 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -11,7 +11,7 @@ limit_req_zone $binary_remote_addr zone=forms:10m rate=2r/m; # ── HTTP → HTTPS redirect ────────────────────────────────── server { listen 80; - server_name jool-int.com www.jool-int.com; + server_name jool-international.com www.jool-international.com; # Let's Encrypt challenge location /.well-known/acme-challenge/ { @@ -27,11 +27,11 @@ server { server { listen 443 ssl; http2 on; - server_name jool-int.com www.jool-int.com; + server_name jool-international.com www.jool-international.com; # ── SSL ──────────────────────────────────────────────── - ssl_certificate /etc/letsencrypt/live/jool-int.com/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/jool-int.com/privkey.pem; + ssl_certificate /etc/letsencrypt/live/jool-international.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/jool-international.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; diff --git a/nginx/nginx.local.conf b/nginx/nginx.local.conf new file mode 100644 index 0000000..2a24e88 --- /dev/null +++ b/nginx/nginx.local.conf @@ -0,0 +1,37 @@ +upstream django { + server web:8000; +} + +server { + listen 80; + server_name localhost 127.0.0.1; + + client_max_body_size 10M; + + location /static/ { + alias /app/staticfiles/; + expires 30d; + access_log off; + } + + location /media/careers/cvs/ { + deny all; + return 404; + } + + location /media/ { + alias /app/media/; + expires 7d; + access_log off; + } + + location / { + proxy_pass http://django; + 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_redirect off; + proxy_read_timeout 60s; + } +} diff --git a/templates/base.html b/templates/base.html index 90273bc..de6527a 100644 --- a/templates/base.html +++ b/templates/base.html @@ -11,14 +11,14 @@ - + - + @@ -35,8 +35,8 @@ "@context": "https://schema.org", "@type": "Organization", "name": "Jool International", - "url": "https://jool-int.com", - "logo": "https://jool-int.com{% static 'img/logo.png' %}", + "url": "https://jool-international.com", + "logo": "https://jool-international.com{% static 'img/logo.png' %}", "description": "Solutions AgriTech pour l'agriculture africaine : analyse satellitaire IA, cartographie drone et digitalisation des producteurs.", "address": { "@type": "PostalAddress", diff --git a/templates/core/about.html b/templates/core/about.html index a3658b1..1b482dd 100644 --- a/templates/core/about.html +++ b/templates/core/about.html @@ -17,12 +17,12 @@ "@context": "https://schema.org", "@type": "AboutPage", "name": "À propos de Jool International", - "url": "https://jool-int.com/a-propos/", + "url": "https://jool-international.com/a-propos/", "description": "Jool International est une entreprise AgriTech basée à Abidjan qui développe des solutions d'intelligence artificielle, de télédétection et de digitalisation pour l'agriculture africaine.", "publisher": { "@type": "Organization", "name": "Jool International", - "url": "https://jool-int.com", + "url": "https://jool-international.com", "address": { "@type": "PostalAddress", "addressLocality": "Abidjan", diff --git a/templates/core/home.html b/templates/core/home.html index c56f859..dbe5555 100644 --- a/templates/core/home.html +++ b/templates/core/home.html @@ -16,8 +16,8 @@ "@context": "https://schema.org", "@type": "Organization", "name": "Jool International", - "url": "https://jool-int.com", - "logo": "https://jool-int.com/static/img/logo.png", + "url": "https://jool-international.com", + "logo": "https://jool-international.com/static/img/logo.png", "description": "Solutions AgriTech pour l'agriculture africaine : analyse satellitaire IA, cartographie drone et digitalisation des producteurs.", "address": { "@type": "PostalAddress", diff --git a/templates/core/products/joolid.html b/templates/core/products/joolid.html index 41faae5..19910d6 100644 --- a/templates/core/products/joolid.html +++ b/templates/core/products/joolid.html @@ -19,13 +19,13 @@ "name": "Jool ID", "applicationCategory": "AgricultureApplication", "operatingSystem": "Web", - "url": "https://jool-int.com/joolid/", + "url": "https://jool-international.com/joolid/", "description": "Plateforme de digitalisation des producteurs agricoles : profils vérifiés, parcelles géolocalisées, traçabilité des intrants et pilotage de programme à grande échelle.", "offers": { "@type": "Offer", "priceCurrency": "XOF" }, "provider": { "@type": "Organization", "name": "Jool International", - "url": "https://jool-int.com" + "url": "https://jool-international.com" } } diff --git a/templates/core/products/kiriq.html b/templates/core/products/kiriq.html index cff1f10..8668d71 100644 --- a/templates/core/products/kiriq.html +++ b/templates/core/products/kiriq.html @@ -19,13 +19,13 @@ "name": "KIRIQ AI", "applicationCategory": "AgricultureApplication", "operatingSystem": "Web", - "url": "https://jool-int.com/kiriq/", + "url": "https://jool-international.com/kiriq/", "description": "Solution d'analyse satellitaire et d'intelligence artificielle pour le diagnostic agricole : détection de maladies, suivi NDVI, stress hydrique et aide à la décision.", "offers": { "@type": "Offer", "priceCurrency": "XOF" }, "provider": { "@type": "Organization", "name": "Jool International", - "url": "https://jool-int.com" + "url": "https://jool-international.com" } } diff --git a/templates/core/products/monitor.html b/templates/core/products/monitor.html index 38a438a..365bf90 100644 --- a/templates/core/products/monitor.html +++ b/templates/core/products/monitor.html @@ -19,13 +19,13 @@ "name": "Jool Monitor", "applicationCategory": "AgricultureApplication", "operatingSystem": "Web", - "url": "https://jool-int.com/monitor/", + "url": "https://jool-international.com/monitor/", "description": "Solution de cartographie drone pour l'agriculture : orthomosaïques, comptage intelligent, modèles 3D et suivi visuel continu des exploitations agricoles.", "offers": { "@type": "Offer", "priceCurrency": "XOF" }, "provider": { "@type": "Organization", "name": "Jool International", - "url": "https://jool-int.com" + "url": "https://jool-international.com" } } diff --git a/templates/robots.txt b/templates/robots.txt index 2677f92..c39076d 100644 --- a/templates/robots.txt +++ b/templates/robots.txt @@ -4,4 +4,4 @@ Allow: / Disallow: /admin/ Disallow: /media/careers/cvs/ -Sitemap: https://jool-int.com/sitemap.xml +Sitemap: https://jool-international.com/sitemap.xml diff --git a/templates/sitemap.xml b/templates/sitemap.xml index 28b5a51..ee38273 100644 --- a/templates/sitemap.xml +++ b/templates/sitemap.xml @@ -2,31 +2,31 @@ - https://jool-int.com/ + https://jool-international.com/ weekly 1.0 - https://jool-int.com/a-propos/ + https://jool-international.com/a-propos/ monthly 0.8 - https://jool-int.com/kiriq/ + https://jool-international.com/kiriq/ monthly 0.9 - https://jool-int.com/monitor/ + https://jool-international.com/monitor/ monthly 0.9 - https://jool-int.com/joolid/ + https://jool-international.com/joolid/ monthly 0.9