From 634e4647da62ecefa8610f1591c487f928ee868a Mon Sep 17 00:00:00 2001 From: perco Date: Mon, 11 May 2026 12:07:04 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20setup=20Docker=20+=20MariaDB=20pour=20d?= =?UTF-8?q?=C3=A9ploiement=20self-hosted?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dockerfile (PHP 8.2 Apache + pdo_mysql) - docker-compose.yml (househub + mariadb + Traefik househub.nas.percolouco.com) - schema.sql (22 tables + donnΓ©es initiales) - includes/db.php adaptΓ© pour variables d'environnement - .env.example, .gitignore, README mis Γ  jour Co-Authored-By: Claude Sonnet 4.6 --- .env.example | 5 + .gitignore | 2 + Dockerfile | 13 +++ README.md | 25 +++++ docker-compose.yml | 52 ++++++++++ docker/apache.conf | 10 ++ includes/db.php | 40 ++------ schema.sql | 237 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 350 insertions(+), 34 deletions(-) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 docker/apache.conf create mode 100644 schema.sql diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..e389c6f --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +# Copier ce fichier en .env et adapter les valeurs +DB_NAME=househub +DB_USER=househub +DB_PASS=changeme +DB_ROOT_PASS=rootchangeme diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7775ee0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +househub_db_data +.env diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e83523c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM php:8.2-apache + +RUN apt-get update && apt-get install -y \ + libpng-dev libjpeg-dev libwebp-dev libzip-dev libonig-dev \ + && docker-php-ext-install pdo pdo_mysql mysqli mbstring zip \ + && a2enmod rewrite \ + && rm -rf /var/lib/apt/lists/* + +COPY . /var/www/html/ + +RUN chown -R www-data:www-data /var/www/html + +COPY docker/apache.conf /etc/apache2/sites-available/000-default.conf diff --git a/README.md b/README.md index 35f80a8..d5acf3b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,31 @@ πŸ¦™ HouseHub OS SystΓ¨me de gestion familiale sur-mesure : Budget, Calendrier, Voyages et Cadeaux. +## πŸš€ DΓ©ploiement (Docker) + +**PrΓ©requis** : Docker, Docker Compose, Traefik sur le rΓ©seau `proxy`. + +```bash +# 1. Cloner le repo +git clone http:///perco/HouseHub.git && cd HouseHub + +# 2. CrΓ©er le fichier d'environnement +cp .env.example .env +# Γ‰diter .env pour changer les mots de passe + +# 3. Lancer +docker compose up -d --build + +# 4. AccΓ©der Γ  l'app +# https://househub.nas.percolouco.com +``` + +La base de donnΓ©es est **initialisΓ©e automatiquement** depuis `schema.sql` au premier dΓ©marrage. + +Compte par dΓ©faut : `admin` / `password` β†’ **Γ  changer immΓ©diatement** dans la table `pf_users`. + +--- + πŸ“ PrΓ©sentation du projet HouseHub est une application web privΓ©e conΓ§ue pour centraliser l'organisation de la tribu. Elle repose sur une stack lΓ©gΓ¨re (PHP natif / Vanilla JS) pour garantir rapiditΓ© et portabilitΓ©, avec un support complet de l'internationalisation (FR/CA). diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..60e13b0 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,52 @@ +services: + + househub: + build: . + container_name: househub + restart: unless-stopped + depends_on: + househub-db: + condition: service_healthy + environment: + DB_HOST: househub-db + DB_NAME: ${DB_NAME:-househub} + DB_USER: ${DB_USER:-househub} + DB_PASS: ${DB_PASS:-changeme} + networks: + - househub_net + - proxy + labels: + - "traefik.enable=true" + - "traefik.http.routers.househub.rule=Host(`househub.nas.percolouco.com`)" + - "traefik.http.routers.househub.entrypoints=websecure" + - "traefik.http.routers.househub.tls=true" + - "traefik.http.routers.househub.tls.certresolver=letsencrypt" + - "traefik.http.services.househub.loadbalancer.server.port=80" + + househub-db: + image: mariadb:11 + container_name: househub-db + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS:-rootchangeme} + MYSQL_DATABASE: ${DB_NAME:-househub} + MYSQL_USER: ${DB_USER:-househub} + MYSQL_PASSWORD: ${DB_PASS:-changeme} + volumes: + - househub_db_data:/var/lib/mysql + - ./schema.sql:/docker-entrypoint-initdb.d/schema.sql:ro + networks: + - househub_net + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + househub_db_data: + +networks: + househub_net: + proxy: + external: true diff --git a/docker/apache.conf b/docker/apache.conf new file mode 100644 index 0000000..7a8440d --- /dev/null +++ b/docker/apache.conf @@ -0,0 +1,10 @@ + + DocumentRoot /var/www/html + + AllowOverride All + Require all granted + Options -Indexes + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + diff --git a/includes/db.php b/includes/db.php index beb8e3a..4dc0cbd 100644 --- a/includes/db.php +++ b/includes/db.php @@ -2,31 +2,13 @@ if (file_exists(__DIR__ . '/config.php')) { require_once __DIR__ . '/config.php'; } -// Activer erreurs -ini_set('display_errors', 1); -ini_set('display_startup_errors', 1); -error_reporting(E_ALL); - -// DΓ©tection de l'environnement -$isLocal = (strpos($_SERVER['HTTP_HOST'] ?? 'localhost', 'localhost') !== false || - strpos($_SERVER['HTTP_HOST'] ?? '', '127.0.0.1') !== false || - strpos($_SERVER['HTTP_HOST'] ?? '', '::1') !== false); - -if ($isLocal) { - // Configuration XAMPP local - $host = 'localhost'; - $db = 'percolo314'; // MΓͺme nom que sur OVH pour simplifier - $user = 'root'; - $pass = ''; // GΓ©nΓ©ralement vide sur XAMPP -} else { - // Configuration serveur OVH - $host = 'percolo314.mysql.db'; - $db = 'percolo314'; - $user = 'percolo314'; - $pass = 'Wxcvbn99'; -} +$host = getenv('DB_HOST') ?: 'househub-db'; +$db = getenv('DB_NAME') ?: 'househub'; +$user = getenv('DB_USER') ?: 'househub'; +$pass = getenv('DB_PASS') ?: 'changeme'; $charset = 'utf8mb4'; + $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $options = [ @@ -39,18 +21,8 @@ $options = [ try { $pdo = new PDO($dsn, $user, $pass, $options); - - // Forcer la collation $pdo->exec("SET collation_connection = utf8mb4_general_ci"); - $pdo->exec("SET collation_database = utf8mb4_general_ci"); - $pdo->exec("SET collation_server = utf8mb4_general_ci"); - - // Debug optionnel (Γ  commenter en production) - // $env = $isLocal ? 'LOCAL' : 'SERVEUR'; - // echo ""; - } catch (\PDOException $e) { - $environment = $isLocal ? 'local (XAMPP)' : 'serveur (OVH)'; - die("Erreur de connexion ($environment) : " . $e->getMessage()); + die("Erreur de connexion BDD : " . $e->getMessage()); } ?> \ No newline at end of file diff --git a/schema.sql b/schema.sql new file mode 100644 index 0000000..0bb5b8a --- /dev/null +++ b/schema.sql @@ -0,0 +1,237 @@ +-- HouseHub β€” SchΓ©ma MySQL +-- CrΓ©er la base : CREATE DATABASE househub CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ─── Utilisateurs ───────────────────────────────────────────────────────────── +CREATE TABLE IF NOT EXISTS pf_users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(100) NOT NULL UNIQUE, + password_hash VARCHAR(255) NOT NULL, + display_name VARCHAR(100) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ─── Personnes ──────────────────────────────────────────────────────────────── +CREATE TABLE IF NOT EXISTS pf_people ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ─── Calendrier familial ────────────────────────────────────────────────────── +CREATE TABLE IF NOT EXISTS pf_events ( + id INT AUTO_INCREMENT PRIMARY KEY, + event_date DATE NOT NULL, + event_type VARCHAR(50) NOT NULL, + person_id INT NOT NULL, + duration DECIMAL(4,2) DEFAULT 1.0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_leaves ( + id INT AUTO_INCREMENT PRIMARY KEY, + person_id INT NOT NULL, + leave_type VARCHAR(50) NOT NULL, + leave_date DATE NOT NULL, + duration DECIMAL(4,2) DEFAULT 1.0, + UNIQUE KEY uq_leave (person_id, leave_type, leave_date) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_leave_balances ( + id INT AUTO_INCREMENT PRIMARY KEY, + person_id INT NOT NULL, + leave_type VARCHAR(50) NOT NULL, + initial_balance DECIMAL(6,2) DEFAULT 0, + balance_year INT NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_leave_snapshots ( + id INT AUTO_INCREMENT PRIMARY KEY, + person_id INT NOT NULL, + leave_type VARCHAR(50) NOT NULL, + snapshot_date DATE NOT NULL, + remaining_balance DECIMAL(6,2) DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_person_leave_meta ( + id INT AUTO_INCREMENT PRIMARY KEY, + person_id INT NOT NULL UNIQUE, + anniversary_date DATE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_calendar_weeks ( + id INT AUTO_INCREMENT PRIMARY KEY, + year INT NOT NULL, + week_iso_year INT NOT NULL, + week_iso_number INT NOT NULL, + week_label VARCHAR(20), + month INT, + month_name VARCHAR(20), + week_start_date DATE, + mon_date DATE, tue_date DATE, wed_date DATE, + thu_date DATE, fri_date DATE, sat_date DATE, sun_date DATE, + UNIQUE KEY uq_week (year, week_iso_year, week_iso_number) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ─── Budget ─────────────────────────────────────────────────────────────────── +CREATE TABLE IF NOT EXISTS pf_budget_items ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + amount DECIMAL(10,2) DEFAULT 0, + category VARCHAR(100), + type VARCHAR(50), + payment_day INT DEFAULT NULL, + is_estimate TINYINT(1) DEFAULT 0, + reg_month VARCHAR(7) DEFAULT NULL, + mapping_keywords TEXT DEFAULT NULL, + holiday_id INT DEFAULT NULL, + is_checked TINYINT(1) DEFAULT 0, + sort_order INT DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_expenses ( + id INT AUTO_INCREMENT PRIMARY KEY, + date_exp DATE NOT NULL, + gestion_month VARCHAR(7) NOT NULL, + category VARCHAR(100), + label VARCHAR(255), + amount DECIMAL(10,2) DEFAULT 0, + import_ref VARCHAR(255) DEFAULT NULL, + budget_item_id INT DEFAULT NULL, + holiday_id INT DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_alloc_categories ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + target DECIMAL(10,2) DEFAULT 0, + holiday_id INT DEFAULT NULL, + sort_order INT DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_alloc_values ( + id INT AUTO_INCREMENT PRIMARY KEY, + month_date VARCHAR(7) NOT NULL, + cat_id INT NOT NULL, + amount_alex DECIMAL(10,2) DEFAULT 0, + amount_laia DECIMAL(10,2) DEFAULT 0, + UNIQUE KEY uq_alloc (month_date, cat_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_savings ( + id INT AUTO_INCREMENT PRIMARY KEY, + owner VARCHAR(50) NOT NULL, + month_date VARCHAR(7) NOT NULL, + category VARCHAR(100) NOT NULL, + amount DECIMAL(10,2) DEFAULT 0, + holiday_id INT DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_bank_snapshots ( + id INT AUTO_INCREMENT PRIMARY KEY, + snapshot_date DATE NOT NULL, + amount DECIMAL(12,2) DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_salary_config ( + id INT AUTO_INCREMENT PRIMARY KEY, + year INT NOT NULL, + person VARCHAR(50) NOT NULL, + salary DECIMAL(10,2) DEFAULT 0, + mensualite DECIMAL(10,2) DEFAULT 0, + frais_func DECIMAL(10,2) DEFAULT 0, + eco_perso DECIMAL(10,2) DEFAULT 0, + eco_family DECIMAL(10,2) DEFAULT 0, + UNIQUE KEY uq_salary (year, person) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_import_rules ( + id INT AUTO_INCREMENT PRIMARY KEY, + keyword VARCHAR(255) NOT NULL UNIQUE, + category VARCHAR(100) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_notes ( + id INT AUTO_INCREMENT PRIMARY KEY, + note_type VARCHAR(100) NOT NULL, + reference_id VARCHAR(100) NOT NULL, + content TEXT, + UNIQUE KEY uq_note (note_type, reference_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ─── Voyages / Holidays ─────────────────────────────────────────────────────── +CREATE TABLE IF NOT EXISTS pf_holidays ( + id INT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(255) NOT NULL, + period_hint VARCHAR(100) DEFAULT NULL, + start_date DATE DEFAULT NULL, + end_date DATE DEFAULT NULL, + status VARCHAR(50) DEFAULT 'draft', + budget_food DECIMAL(10,2) DEFAULT 0, + budget_extra DECIMAL(10,2) DEFAULT 0, + notes TEXT DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_holidays_items ( + id INT AUTO_INCREMENT PRIMARY KEY, + holiday_id INT NOT NULL, + category VARCHAR(100), + name VARCHAR(255), + amount DECIMAL(10,2) DEFAULT 0, + is_paid TINYINT(1) DEFAULT 0, + location_name VARCHAR(255) DEFAULT NULL, + lat DECIMAL(10,7) DEFAULT NULL, + lng DECIMAL(10,7) DEFAULT NULL, + sort_order INT DEFAULT 0, + notes TEXT DEFAULT NULL, + item_date DATE DEFAULT NULL, + item_time TIME DEFAULT NULL, + step_start_date DATE DEFAULT NULL, + step_end_date DATE DEFAULT NULL, + duration INT DEFAULT NULL, + is_return TINYINT(1) DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_holidays_ideas ( + id INT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(255) NOT NULL, + period_hint VARCHAR(100) DEFAULT NULL, + start_date DATE DEFAULT NULL, + end_date DATE DEFAULT NULL, + status VARCHAR(50) DEFAULT 'idea', + budget_food DECIMAL(10,2) DEFAULT 0, + budget_extra DECIMAL(10,2) DEFAULT 0, + notes TEXT DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS pf_geocode_cache ( + q_hash CHAR(64) PRIMARY KEY, + q VARCHAR(255), + lat DECIMAL(10,7), + lng DECIMAL(10,7), + display_name TEXT, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- ─── Cadeaux ────────────────────────────────────────────────────────────────── +CREATE TABLE IF NOT EXISTS pf_gifts ( + id INT AUTO_INCREMENT PRIMARY KEY, + year INT NOT NULL, + adult_name VARCHAR(100) NOT NULL, + payer_name VARCHAR(100), + child_name VARCHAR(100) NOT NULL, + occasion VARCHAR(50) NOT NULL, + gift_description TEXT NOT NULL, + product_link VARCHAR(500) DEFAULT NULL, + amount DECIMAL(8,2) DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +SET FOREIGN_KEY_CHECKS = 1; + +-- ─── DonnΓ©es initiales ──────────────────────────────────────────────────────── +-- Utilisateur admin (mot de passe : changeme β†’ Γ  modifier !) +INSERT IGNORE INTO pf_users (id, username, password_hash, display_name) +VALUES (1, 'admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Admin'); + +-- Personnes (IDs fixes correspondant aux constantes dans config.php) +INSERT IGNORE INTO pf_people (id, name) VALUES (2, 'Alex'); +INSERT IGNORE INTO pf_people (id, name) VALUES (3, 'Laia');