Spotex CMS
PHP e-commerce CMS vanilla deployato su Aruba shared hosting (PHP 8.0, MySQL).
Stack
| Layer | Tecnologia |
|---|---|
| Backend | PHP 8.2, vanilla (no framework) |
| Database | MySQL 8.0 |
| Dipendenze | Composer — stripe/stripe-php, paypal/paypal-server-sdk |
| Admin UI | Tailwind CSS CDN + Lucide Icons |
| Frontend | Tailwind CSS CDN |
| Dev environment | Docker (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:
- Build dell'immagine PHP+Apache (
Dockerfile) - Avvio MySQL 8.0 — importa
storage/Sql1781576_1.sqlautomaticamente se il volume è vuoto - Avvio phpMyAdmin
- 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
| Servizio | URL | Note |
|---|---|---|
| CMS pubblico | http://localhost:8080 | |
| Admin panel | http://localhost:8080/admin | |
| phpMyAdmin | http://localhost:8081 | utente: root, password: MYSQL_ROOT_PASSWORD |
| MySQL diretto | 127.0.0.1:3306 | da 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']:
| Ambiente | Rilevamento | Variabili usate |
|---|---|---|
| Docker locale | DB_HOST = db (impostato da compose.yml) | DB_HOST, DB_USER, DB_PASS |
| MAMP locale | HTTP_HOST = spotex.local:8888 | DB_HOST_LOCAL, DB_USER_LOCAL, DB_PASS_LOCAL |
| Produzione Aruba | qualsiasi altro host | DB_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)
- Upload dei file PHP via FTP (escludi
vendor/,storage/,.env,compose.yml,Dockerfile) - Sul server, crea
.envcon le credenziali Aruba:DB_HOST=89.46.111.209 DB_USER=Sql1781576 DB_PASS=<password> DB_NAME=Sql1781576_1 - Esegui
composer install --no-dev --optimize-autoloadervia SSH o carica il vendor - Importa il dump SQL tramite phpMyAdmin o SSH MySQL
L'
.htaccessin root gestisce il routing. Su Aruba assicurati cheAllowOverride Allsia attivo (di default lo è).