diff --git a/.env.dev.example b/.env.dev.example new file mode 100644 index 0000000..0eec782 --- /dev/null +++ b/.env.dev.example @@ -0,0 +1,20 @@ +# Copier ce fichier en .env.dev et remplir les valeurs + +SECRET_KEY=change-this-to-a-long-random-string-50-chars-minimum + +# Base de données +POSTGRES_DB=jool_db_dev +POSTGRES_USER=jool_user +POSTGRES_PASSWORD=change-this-password +DATABASE_URL=postgresql://jool_user:change-this-password@db:5432/jool_db_dev + +# Django +DJANGO_SETTINGS_MODULE=config.settings.prod +ALLOWED_HOSTS=dev.jool-international.com +SECURE_SSL_REDIRECT=true + +# Email (optionnel pour le dev) +EMAIL_HOST=smtp.dreamhost.com +EMAIL_PORT=465 +EMAIL_HOST_USER= +EMAIL_HOST_PASSWORD= diff --git a/deploy-dev.sh b/deploy-dev.sh new file mode 100755 index 0000000..e2b6483 --- /dev/null +++ b/deploy-dev.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# Déploiement dev.jool-international.com +# Usage : bash deploy-dev.sh +set -e + +DOMAIN="dev.jool-international.com" +EMAIL="info@jool-int.com" +COMPOSE="docker compose -f docker-compose.dev.yml" + +# ── 1. Vérifier .env.dev ───────────────────────────────── +if [ ! -f .env.dev ]; then + echo "❌ .env.dev introuvable." + echo " Copie .env.dev.example en .env.dev et remplis les valeurs." + exit 1 +fi + +echo "✅ .env.dev trouvé" + +# ── 2. Démarrer avec nginx HTTP only ───────────────────── +echo "🚀 Démarrage des conteneurs (HTTP only)..." +$COMPOSE up -d --build + +# Attendre que nginx soit prêt +sleep 5 + +# ── 3. Obtenir le certificat SSL ───────────────────────── +echo "🔒 Obtention du certificat SSL pour $DOMAIN..." +$COMPOSE run --rm certbot certonly \ + --webroot \ + --webroot-path=/var/www/certbot \ + -d "$DOMAIN" \ + --email "$EMAIL" \ + --agree-tos \ + --no-eff-email + +# ── 4. Passer à la config HTTPS ────────────────────────── +echo "🔄 Activation de la config HTTPS..." +sed -i 's|nginx.dev-init.conf|nginx.dev.conf|g' docker-compose.dev.yml + +# Redémarrer nginx avec la config HTTPS +$COMPOSE up -d nginx + +echo "" +echo "✅ Déploiement terminé !" +echo " Site disponible sur https://$DOMAIN" diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..e480aa4 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,61 @@ +services: + + # ── Base de données PostgreSQL ────────────────────────── + db: + image: postgres:16-alpine + restart: always + volumes: + - postgres_data_dev:/var/lib/postgresql/data + env_file: .env.dev + healthcheck: + test: ["CMD-SHELL", "pg_isready"] + interval: 10s + timeout: 5s + retries: 5 + + # ── Application Django (Gunicorn) ─────────────────────── + web: + build: . + restart: always + env_file: .env.dev + volumes: + - static_volume_dev:/app/staticfiles + - media_volume_dev:/app/media + depends_on: + db: + condition: service_healthy + command: > + sh -c "python manage.py migrate --noinput && + gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 2 + --timeout 60 --access-logfile - --error-logfile -" + + # ── Nginx (reverse proxy + static files) ─────────────── + nginx: + image: nginx:alpine + restart: always + ports: + - "80:80" + - "443:443" + volumes: + - ./nginx/nginx.dev-init.conf:/etc/nginx/conf.d/default.conf:ro + - static_volume_dev:/app/staticfiles:ro + - media_volume_dev:/app/media:ro + - certbot_www_dev:/var/www/certbot:ro + - certbot_certs_dev:/etc/letsencrypt:ro + depends_on: + - web + + # ── Certbot (SSL Let's Encrypt) ───────────────────────── + certbot: + image: certbot/certbot + volumes: + - certbot_www_dev:/var/www/certbot + - certbot_certs_dev:/etc/letsencrypt + entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'" + +volumes: + postgres_data_dev: + static_volume_dev: + media_volume_dev: + certbot_www_dev: + certbot_certs_dev: diff --git a/docker-compose.yml b/docker-compose.yml index 510832c..b4dcd60 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,12 +7,8 @@ services: volumes: - postgres_data:/var/lib/postgresql/data env_file: .env.prod - environment: - POSTGRES_DB: ${POSTGRES_DB} - POSTGRES_USER: ${POSTGRES_USER} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + test: ["CMD-SHELL", "pg_isready"] interval: 10s timeout: 5s retries: 5 diff --git a/export_pages.py b/export_pages.py deleted file mode 100644 index 7c8fc5f..0000000 --- a/export_pages.py +++ /dev/null @@ -1,142 +0,0 @@ -""" -Exporte chaque page Django en HTML autonome (CSS + JS inline). -Usage : python3 export_pages.py -""" -import os, re, base64, mimetypes -from pathlib import Path -import requests -from bs4 import BeautifulSoup -from urllib.parse import urljoin, urlparse - -BASE_URL = 'http://127.0.0.1:8000' -OUT_DIR = Path(__file__).parent / 'figma_export' -OUT_DIR.mkdir(exist_ok=True) - -PAGES = [ - ('home', '/'), - ('a-propos', '/a-propos/'), - ('kiriq', '/produits/kiriq/'), - ('monitor', '/produits/monitor/'), - ('joolid', '/produits/joolid/'), - ('carrieres','/carrieres/'), -] - -session = requests.Session() - -def fetch(url): - r = session.get(urljoin(BASE_URL, url), timeout=10) - r.raise_for_status() - return r - -def to_data_uri(url_or_path): - """Convertit une URL de ressource en data URI base64.""" - try: - r = fetch(url_or_path) - mime = r.headers.get('Content-Type', 'application/octet-stream').split(';')[0] - b64 = base64.b64encode(r.content).decode() - return f"data:{mime};base64,{b64}" - except Exception as e: - print(f" ⚠️ Impossible de charger {url_or_path}: {e}") - return url_or_path - -def inline_css(soup, base_url): - """Remplace les par des