Spotex-CMS

CMS commissionato dalla Spotex e realizzato da me

Visualizza repository su GitHub

README

Spotex CMS

PHP e-commerce CMS vanilla deployato su Aruba shared hosting (PHP 8.0, MySQL).


Stack

LayerTecnologia
BackendPHP 8.2, vanilla (no framework)
DatabaseMySQL 8.0
DipendenzeComposer — stripe/stripe-php, paypal/paypal-server-sdk
Admin UITailwind CSS CDN + Lucide Icons
FrontendTailwind CSS CDN
Dev environmentDocker (PHP+Apache, MySQL, phpMyAdmin)

Requisiti (sviluppo locale)

  • Docker Desktop ≥ 4.x
  • Nulla da installare sul Mac host — tutto gira dentro Docker

Setup iniziale

1. Copia e compila le variabili ambiente

cp .env.example .env

Valori minimi da compilare in .env per Docker locale:

DB_HOST=db # ← lascia "db" (nome servizio Docker) DB_PORT=3306 DB_USER=spotex DB_PASS=una_password_sicura DB_NAME=Sql1781576_1 MYSQL_ROOT_PASSWORD=root_password_sicura

Produzione (Aruba): sul server cambia DB_HOST=89.46.111.209,
DB_USER=Sql1781576, DB_PASS=<password_reale>.
Non committare mai .env.

2. Primo avvio (build + start)

docker compose up -d --build

Docker esegue in sequenza:

  1. Build dell'immagine PHP+Apache (Dockerfile)
  2. Avvio MySQL 8.0 — importa storage/Sql1781576_1.sql automaticamente se il volume è vuoto
  3. Avvio phpMyAdmin
  4. Avvio del container PHP+Apache appena MySQL è healthy

3. Installa le dipendenze PHP (solo al primo avvio)

docker compose exec app composer install

Il vendor viene installato dentro il container — non compare nella cartella host grazie al volume anonimo in compose.yml.


URL di sviluppo

ServizioURLNote
CMS pubblicohttp://localhost:8080
Admin panelhttp://localhost:8080/admin
phpMyAdminhttp://localhost:8081utente: root, password: MYSQL_ROOT_PASSWORD
MySQL diretto127.0.0.1:3306da DBeaver / TablePlus / MySQL Workbench

Comandi Docker frequenti

# Avvia i servizi in background docker compose up -d # Avvia con rebuild dell'immagine (dopo cambio Dockerfile) docker compose up -d --build # Segui i log in tempo reale docker compose logs -f app docker compose logs -f db # Entra nel container PHP docker compose exec app bash # Esegui composer docker compose exec app composer install docker compose exec app composer update # Esegui un file PHP da CLI docker compose exec app php /var/www/html/ver.php # Ferma i container (dati conservati) docker compose stop # Ferma e rimuove i container (volume DB conservato) docker compose down # Distrugge tutto incluso il volume DB — reimporta il dump al prossimo up docker compose down -v

Reimportare il database

Il dump viene importato automaticamente al primo docker compose up se il volume MySQL è vuoto.

Per reimportare manualmente (es. dopo down -v):

# Opzione 1: ricrea il volume docker compose down -v docker compose up -d # Opzione 2: importa nel container in esecuzione docker compose exec -T db mysql \ -u root -p"${MYSQL_ROOT_PASSWORD}" Sql1781576_1 \ < storage/Sql1781576_1.sql

Per esportare uno snapshot del DB locale:

docker compose exec db mysqldump \ -u root -p"${MYSQL_ROOT_PASSWORD}" Sql1781576_1 \ > storage/snapshot_$(date +%Y%m%d).sql

Struttura del progetto

Spotex-CMS/
├── index.php                ← router (entry point unico)
├── .htaccess                ← rewrite all → index.php
├── Dockerfile               ← PHP 8.2 + Apache + Composer
├── compose.yml              ← stack locale (app, db, phpmyadmin)
├── .env                     ← credenziali locali (gitignored)
├── .env.example             ← template credenziali
├── composer.json / .lock
│
├── config/
│   ├── database.php         ← definisce DB_* constants (usa getenv())
│   ├── conn.php             ← $conn mysqli + getDb() singleton
│   ├── DbConnection.php     ← PDO singleton (Database::get())
│   ├── env.php              ← parser .env → putenv()
│   └── shop.php             ← loadShopData()
│
├── routes/
│   └── web.php              ← mappa URI → file
│
├── pages/                   ← viste pubbliche (router-only, htaccess deny)
├── handlers/                ← handler POST pubblici
├── payments/
│   ├── paypal/              ← PayPal Server SDK (paypal/paypal-server-sdk)
│   └── stripe/              ← Stripe PHP SDK (stripe/stripe-php)
├── checkout/                ← flusso checkout
├── partials/                ← navbar.php, footer.php, cookie.php
├── public/                  ← style.css, app.css
│
├── admin/
│   ├── index.php            ← login admin
│   ├── pages/               ← viste pannello admin
│   ├── handlers/            ← handler form admin
│   ├── includes/            ← moduli PHP (auth, orders, products, …)
│   └── partials/            ← sidebar, head_content, script
│
└── storage/
    ├── Sql1781576_1.sql     ← dump DB (gitignored)
    └── *.log                ← log applicazione (gitignored)

Connessione DB

config/database.php rileva l'ambiente tramite $_SERVER['HTTP_HOST']:

AmbienteRilevamentoVariabili usate
Docker localeDB_HOST = db (impostato da compose.yml)DB_HOST, DB_USER, DB_PASS
MAMP localeHTTP_HOST = spotex.local:8888DB_HOST_LOCAL, DB_USER_LOCAL, DB_PASS_LOCAL
Produzione Arubaqualsiasi altro hostDB_HOST, DB_USER, DB_PASS

Sono disponibili due interfacce:

  • mysqli$conn = getDb() (legacy, usato dal codice esistente)
  • PDO$pdo = DbConnection::get() (per nuove funzionalità)

Deploy su produzione (Aruba)

  1. Upload dei file PHP via FTP (escludi vendor/, storage/, .env, compose.yml, Dockerfile)
  2. Sul server, crea .env con le credenziali Aruba:
    DB_HOST=89.46.111.209 DB_USER=Sql1781576 DB_PASS=<password> DB_NAME=Sql1781576_1
  3. Esegui composer install --no-dev --optimize-autoloader via SSH o carica il vendor
  4. Importa il dump SQL tramite phpMyAdmin o SSH MySQL

L'.htaccess in root gestisce il routing. Su Aruba assicurati che AllowOverride All sia attivo (di default lo è).