@extends('layouts.adminlte') @php $appName = \App\Models\AppSetting::getAppName() ?? 'Glastree'; @endphp @section('title', 'Guida - ' . $appName) @section('page_title', 'Guida alla Configurazione') @section('breadcrumbs')
WebDAV è un protocollo che permette di accedere a file su server remoti. Nextcloud lo utilizza per la sincronizzazione dei file.
Vai in Impostazioni → Repository e crea un nuovo repository di tipo WebDAV.
https://tuodominio.it/remote.php/dav/files/utente/
https://server.webdav.it//Documenti/). Lascia / per usare la root.Basic per la maggior parte dei server (Nextcloud, ownCloud).Se il tuo nome utente contiene il carattere @ (es. mario.rossi@azienda.com), segui queste regole:
https://server.it/remote.php/dav/files/mario.rossi%40azienda.com/
@ diventa %40)@ vera.%40) e l'autenticazione (che usa la @ reale).
Dopo aver salvato, usa il pulsante Test nella tabella dei repository per verificare che la connessione funzioni.
Apri la sezione Documenti, clicca sul pulsante del repository nella toolbar per sfogliare i file remoti, poi clicca Salva tra i documenti su un file per importarlo come documento locale.
Integrazione con Google Drive per sfogliare e importare file direttamente dal tuo spazio Google Drive.
{{ url('/auth/google-drive/callback') }}https://drive.google.com/drive/folders/ID_QUI)Se vedi l'errore "Google Drive API non abilitata" nel test connessione, significa che l'API Drive non è stata attivata nel tuo progetto Google Cloud.
Vai su https://console.developers.google.com/apis/api/drive.googleapis.com/overview
Seleziona il progetto corretto dall'header in alto, clicca "Enable" e attendi qualche minuto prima di riprovare.
Stessa procedura di WebDAV: apri Documenti, clicca sul repository Drive, sfoglia i file e usa Salva tra i documenti.
I file creati con Google Workspace (Documenti Google, Fogli Google, Presentazioni Google, Disegni Google) non possono essere scaricati direttamente perché non hanno un formato binario nativo.
Il sistema li converte automaticamente in formato Office Open XML durante l'import:
| File Google | Formato convertito |
|---|---|
| Documento Google | .docx (Word) |
| Foglio Google | .xlsx (Excel) |
| Presentazione Google | .pptx (PowerPoint) |
| Disegno Google | .png (Immagine) |
| Altri (Moduli, Script) | .pdf (PDF) |
Integrazione con Google Calendar per sincronizzare gli eventi tra l'app e il tuo calendario Google. Supporta import, export e sincronizzazione bidirezionale.
https://developers.google.com/oauthplaygroundA differenza di Google Drive, per Google Calendar il refresh token va ottenuto manualmente tramite il Google OAuth Playground:
https://www.googleapis.com/auth/calendarprimary per il calendario principale, oppure inserisci l'ID di un calendario specifico (lo trovi in Google Calendar → Impostazioni calendario → ID calendario)Dopo aver salvato, usa il pulsante Test nella tabella delle connessioni per verificare che l'autorizzazione funzioni correttamente.
Dopo aver configurato la connessione, puoi sincronizzare gli eventi manualmente cliccando Sync. La sincronizzazione automatica viene eseguita in base all'intervallo impostato (richiede il cron di Laravel configurato).
I tag permettono di classificare e raggruppare trasversalmente elementi di tipo diverso: individui, gruppi, eventi, documenti e mailing list. A differenza delle tipologie (specifiche per ogni entità), i tag sono condivisi tra tutte le entità.
Vai in Impostazioni → Tag per creare, modificare, riordinare ed eliminare i tag. Ogni tag ha:
#dc3545 per rosso)I tag si assegnano nelle pagine di creazione e modifica di ciascuna entità — individui, gruppi, eventi, documenti, mailing list — tramite il selettore a pillole colorate. Clicca su un tag per selezionarlo (il badge diventa opaco), clicca di nuovo per deselezionarlo. Usa la barra di ricerca per filtrare i tag per nome.
Puoi assegnare o rimuovere tag a più elementi contemporaneamente:
In ogni pagina elenco (Individui, Gruppi, Eventi, Documenti, Mailing List) trovi una barra con tutti i tag. Clicca su un tag per filtrare la tabella mostrando solo gli elementi con quel tag. Clicca Cancella filtri per rimuovere il filtro.
La sezione Ricerca per Tag (sidebar → Ricerca per Tag) permette di trovare elementi di qualsiasi tipo in base ai tag:
I risultati sono raggruppati per tipo con info-box colorati e tabelle dettagliate.
Le tipologie classificano i documenti (avatar, galleria, documento, statuto, altro).
Si gestiscono in Impostazioni → Tipologie Documenti. Puoi aggiungere, rinominare, riordinare ed eliminare tipologie (tranne quelle con documenti associati).
Classificano gli individui (es. socio, volontario, dipendente). Si gestiscono in Impostazioni → Tipologie.
Classificano gli eventi (es. riunione, assemblea, formazione). Si gestiscono in Impostazioni → Tipologie Eventi.
Definiscono il ruolo o la carica di un individuo (es. presidente, segretario, tesoriere). Si gestiscono in Impostazioni → Ruoli.
Ogni documento può avere diversi livelli di visibilità:
I tag affiancano le tipologie con un sistema trasversale di classificazione applicabile a individui, gruppi, eventi, documenti e mailing list. A differenza delle tipologie (specifiche per ogni entità), i tag sono condivisi tra tutte le entità e permettono ricerche incrociate.
Vedi la sezione Tag e Ricerca per Tag (nel menu laterale) per la gestione e l'assegnazione.
Vai in Impostazioni → Email per configurare la posta elettronica.
Usato per ricevere e leggere le email direttamente nell'app.
| Provider | Host | Porta | Crittografia |
|---|---|---|---|
| Gmail | imap.gmail.com | 993 | SSL |
| Outlook/Office 365 | outlook.office365.com | 993 | SSL |
| Libero | imapmail.libero.it | 993 | SSL |
| Aruba | imap.aruba.it | 993 | SSL |
Usato per inviare email dall'app. Supporta account multipli (mittenti).
| Provider | Host | Porta | Crittografia |
|---|---|---|---|
| Gmail | smtp.gmail.com | 587 | TLS |
| Outlook/Office 365 | smtp.office365.com | 587 | TLS |
| Libero | smtp.libero.it | 465 | SSL |
| Aruba | smtp.aruba.it | 465 | SSL |
Le Mailing List permettono di inviare email a gruppi predefiniti di destinatari.
Dopo aver configurato i server, usa il pulsante Test Connessione per verificare che IMAP e SMTP funzionino correttamente.
Il sistema di backup crea un archivio ZIP contenente tutto il necessario per ripristinare l'applicazione su un nuovo server. Include database, file caricati e configurazione.
| Componente | Incluso | Dettagli |
|---|---|---|
| Database (MySQL) | Sempre | Struttura, dati, stored procedure, eventi, trigger |
| File caricati | Opzionale | Documenti, avatar, gallerie |
| Configurazione .env | Opzionale | APP_KEY, credenziali DB, SMTP, token OAuth |
| Metadati | Sempre | Versione app, PHP, Laravel |
php artisan backup:run
Il file viene creato in storage/app/backups/
Puoi abilitare il backup automatico dalla pagina Admin → Backup:
* * * * * cd {{ base_path() }} && php artisan schedule:run >> /dev/null 2>&1
Segui questa procedura per migrare l'applicazione su un nuovo server LAMP (Linux, Apache, MySQL, PHP).
L'APP_KEY cripta i dati sensibili (password email SMTP, token OAuth Google Drive, ecc.).
sudo apt update && sudo apt upgrade -y
sudo apt install -y apache2 mariadb-server php8.4 php8.4-cli \
php8.4-mysql php8.4-xml php8.4-mbstring php8.4-curl \
php8.4-zip php8.4-bcmath php8.4-gd php8.4-intl \
composer git unzip
sudo a2enmod rewrite
/var/www/glastree.
cd /var/www
# Opzione A — Git clone
git clone <URL_REPOSITORY> glastree
# Opzione B — ZIP (se non hai git)
# unzip /percorso/del/glastree.zip -d glastree
cd glastree
composer install --no-dev --optimize-autoloader
npm ci && npm run build
Copia il file backup.zip sul nuovo server e estrailo:
mkdir -p /tmp/restore
unzip backup.zip -d /tmp/restore/
ls -la /tmp/restore/
# Dovresti vedere: database.sql .env files/ manifest.json
sudo mysql -u root <<EOF
CREATE DATABASE glastree CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'glastree'@'localhost' IDENTIFIED BY 'ScegliPasswordFortep4ss!';
GRANT ALL ON glastree.* TO 'glastree'@'localhost';
FLUSH PRIVILEGES;
EOF
mysql -u glastree -p glastree < /tmp/restore/database.sql
cp /tmp/restore/.env .env
# Modifica se necessario:
# APP_URL=https://nuovo-dominio.it
# DB_HOST=localhost
# DB_DATABASE=glastree
# DB_USERNAME=glastree
# DB_PASSWORD=ScegliPasswordFortep4ss!
# DECIDI SULL'APP_KEY (leggi avviso sopra!)
# php artisan key:generate ← SOLO se non hai il .env originale
cp -r /tmp/restore/files/* storage/app/documenti/
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 755 storage bootstrap/cache
php artisan storage:link
php artisan optimize:clear
php artisan config:cache
php artisan route:cache
php artisan view:cache
sudo tee /etc/apache2/sites-available/glastree.conf <<APACHE
<VirtualHost *:80>
ServerName glastree.esempio.it
DocumentRoot /var/www/glastree/public
<Directory /var/www/glastree/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/glastree_error.log
CustomLog \${APACHE_LOG_DIR}/glastree_access.log combined
</VirtualHost>
APACHE
sudo a2dissite 000-default.conf
sudo a2ensite glastree.conf
sudo systemctl reload apache2
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d glastree.esempio.it
sudo crontab -u www-data -e
# Inserisci:
* * * * * cd /var/www/glastree && php artisan schedule:run >> /dev/null 2>&1
Per installazione e ripristino usa i comandi Artisan da terminale. Vedi la sezione Installazione per la guida completa.
Puoi creare un'immagine Docker pronta all'uso che include l'applicazione e i dati di base (tipologie documenti, tipologie eventi, ruoli). Scegli la configurazione in base alle tue esigenze:
git clone <URL> glastree oppure, se non hai git, estrarre il file ZIP ricevuto con unzip glastree.zip -d glastree e posizionarti nella cartella glastree prima di procedere.
Database embedded, nessun servizio aggiuntivo. Ideale per demo, test, sviluppo locale o ambienti con poca concorrenza.
Database separato in un container MySQL. Configurazione standard, ideale per produzione, staging e ambienti con piu utenti.
Crea un file Dockerfile nella root del progetto:
FROM php:8.4-apache
# Abilita mod_rewrite
RUN docker-php-ext-enable opcache \
&& a2enmod rewrite
# Installa estensioni PHP (sia SQLite che MySQL)
RUN docker-php-ext-install pdo_mysql pdo_sqlite bcmath gd zip
# Installa Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# Configura DocumentRoot per Laravel
ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf \
&& sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
# Copia l'applicazione
COPY . /var/www/html/
# Installa dipendenze e compila asset
RUN composer install --no-dev --optimize-autoloader \
&& mkdir -p storage/app/public \
&& mkdir -p storage/framework/cache/data \
&& mkdir -p storage/framework/sessions \
&& mkdir -p storage/framework/views \
&& mkdir -p storage/logs \
&& mkdir -p bootstrap/cache \
&& chown -R www-data:www-data storage bootstrap/cache
# Entrypoint per inizializzazione
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["apache2-foreground"]
Crea docker-entrypoint.sh. Lo script rileva automaticamente la configurazione in base alle variabili d'ambiente:
#!/bin/bash
set -e
# Se .env non esiste, lo genera dalle variabili d'ambiente
if [ ! -f .env ]; then
cp .env.example .env
if [ "$DB_CONNECTION" = "mysql" ]; then
# Configura MySQL
sed -i "s/DB_CONNECTION=mysql/DB_CONNECTION=mysql/" .env
sed -i "s/DB_HOST=.*/DB_HOST=${DB_HOST:-mysql}/" .env
sed -i "s/DB_PORT=.*/DB_PORT=${DB_PORT:-3306}/" .env
sed -i "s/DB_DATABASE=.*/DB_DATABASE=${DB_DATABASE:-glastree}/" .env
sed -i "s/DB_USERNAME=.*/DB_USERNAME=${DB_USERNAME:-glastree}/" .env
sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=${DB_PASSWORD:-secret}/" .env
# Attende che MySQL sia pronto
echo "Attendo MySQL..."
until php -r "new PDO('mysql:host=${DB_HOST:-mysql};dbname=${DB_DATABASE:-glastree}', '${DB_USERNAME:-glastree}', '${DB_PASSWORD:-secret}');" 2>/dev/null; do
sleep 2
done
echo "MySQL pronto."
else
# Configura SQLite
sed -i 's/DB_CONNECTION=mysql/DB_CONNECTION=sqlite/' .env
sed -i 's/DB_HOST=.*//' .env
sed -i 's/DB_PORT=.*//' .env
sed -i 's/DB_DATABASE=.*/DB_DATABASE=\/var\/www\/html\/database\/database.sqlite/' .env
sed -i 's/DB_USERNAME=.*//' .env
sed -i 's/DB_PASSWORD=.*//' .env
touch database/database.sqlite
chmod 664 database/database.sqlite
fi
# Genera APP_KEY
php artisan key:generate --force
fi
# Esegui migration e seed se il database e vuoto
if [ ! -f .db_initialized ]; then
php artisan migrate --force
php artisan db:seed --force
touch .db_initialized
fi
# Configura storage link
php artisan storage:link --force 2>/dev/null || true
exec "$@"
chmod +x docker-entrypoint.sh
Per includere tipologie documenti, tipologie eventi e ruoli, crea un seeder dedicato:
php artisan make:seeder DockerBaseDataSeeder
Contenuto di database/seeders/DockerBaseDataSeeder.php:
<?php
declare(strict_types=1);
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class DockerBaseDataSeeder extends Seeder
{
public function run(): void
{
// Tipologie Documenti
$tipologieDoc = ['documento', 'avatar', 'galleria', 'statuto', 'programma', 'locandina', 'altro'];
foreach ($tipologieDoc as $ord => $nome) {
DB::table('tipologie_documenti')->updateOrInsert(
['nome' => $nome],
['descrizione' => ucfirst($nome), 'ordine' => $ord + 1, 'attiva' => true]
);
}
// Tipologie Eventi
$tipologieEventi = [
['nome' => 'catechesi', 'descrizione' => 'Catechesi'],
['nome' => 'liturgia', 'descrizione' => 'Liturgia'],
['nome' => 'animazione', 'descrizione' => 'Animazione'],
['nome' => 'formazione', 'descrizione' => 'Formazione'],
['nome' => 'incontro', 'descrizione' => 'Incontro'],
['nome' => 'riunione', 'descrizione' => 'Riunione'],
['nome' => 'festa', 'descrizione' => 'Festa'],
['nome' => 'altro', 'descrizione' => 'Altro'],
];
foreach ($tipologieEventi as $ord => $t) {
DB::table('tipologie_eventi')->updateOrInsert(
['nome' => $t['nome']],
['descrizione' => $t['descrizione'], 'ordine' => $ord + 1, 'attiva' => true]
);
}
// Ruoli
$ruoli = ['presidente', 'vicepresidente', 'segretario', 'tesoriere', 'consigliere', 'volontario', 'socio', 'altro'];
foreach ($ruoli as $ord => $nome) {
DB::table('ruoli')->updateOrInsert(
['nome' => $nome],
['descrizione' => ucfirst($nome), 'ordine' => $ord + 1, 'attiva' => true]
);
}
}
}
Registralo in database/seeders/DatabaseSeeder.php:
$this->call([
// ... altri seeder ...
DockerBaseDataSeeder::class,
]);
services:
glastree:
build: .
ports:
- "8080:80"
volumes:
- glastree_storage:/var/www/html/storage
- glastree_db:/var/www/html/database
environment:
- APP_ENV=production
- APP_DEBUG=false
- APP_URL=http://localhost:8080
- DB_CONNECTION=sqlite
volumes:
glastree_storage:
glastree_db:
services:
glastree:
build: .
ports:
- "8080:80"
volumes:
- glastree_storage:/var/www/html/storage
depends_on:
mysql:
condition: service_healthy
environment:
- APP_ENV=production
- APP_DEBUG=false
- APP_URL=http://localhost:8080
- DB_CONNECTION=mysql
- DB_HOST=mysql
- DB_PORT=3306
- DB_DATABASE=glastree
- DB_USERNAME=glastree
- DB_PASSWORD=secret
mysql:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
environment:
- MYSQL_DATABASE=glastree
- MYSQL_USER=glastree
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=root_secret
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 3s
retries: 10
volumes:
glastree_storage:
mysql_data:
Assicurati di essere nella cartella del progetto (ottenuta via git clone o estraendo il ZIP), poi:
# Costruisci l'immagine (comune)
docker build -t glastree:latest .
# Avvia con SQLite
docker compose -f docker-compose.yml up -d
# Oppure avvia con MySQL
# docker compose -f docker-compose.mysql.yml up -d
# Apri nel browser
open http://localhost:8080
Al primo avvio, l'entrypoint esegue automaticamente migration e seed. Troverai gia popolati:
Dovrai creare il primo utente amministratore via CLI:
docker exec -it glastree php artisan tinker --execute="
\$u = new \App\Models\User;
\$u->name = 'Amministratore';
\$u->email = 'admin@esempio.it';
\$u->password = bcrypt('password-forte');
\$u->is_admin = true;
\$u->permissions = ['individui' => 2, 'gruppi' => 2, 'eventi' => 2, 'documenti' => 2, 'mailing' => 2, 'viste' => 2, 'report' => 2, 'settings' => 2];
\$u->save();
echo 'Utente creato con successo!';
"
MYSQL_PASSWORD e MYSQL_ROOT_PASSWORDdocker-compose.yml per SQLite, docker-compose.mysql.yml per MySQL) e scegliere con -fL'installazione avviene tramite l'interattivo install.php che guida passo-passo. Supporta due modalita:
Installa l'applicazione da zero su un nuovo server: crea il database, esegue le migration, popola i dati di base e crea l'amministratore.
Ripristina un'installazione esistente da un file ZIP di backup: importa il database, ripristina i documenti e la configurazione.
| Componente | Versione Minima | Note |
|---|---|---|
| Web Server | Apache 2.4+ | Con mod_rewrite abilitato |
| PHP | 8.2+ (consigliato 8.4) | Estensioni: pdo_mysql, mbstring, xml, curl, zip, gd, fileinfo |
| MySQL / MariaDB | MySQL 8.0+ / MariaDB 10.5+ | Supporto utf8mb4 |
| Composer | 2.x | Per gestione dipendenze PHP |
| Node.js / npm | Node 20+ / npm 10+ | Per compilazione asset frontend (opzionale se precompilati) |
sudo apt update && sudo apt upgrade -y
sudo apt install -y apache2 mariadb-server php8.4 php8.4-cli \
php8.4-mysql php8.4-xml php8.4-mbstring php8.4-curl \
php8.4-zip php8.4-bcmath php8.4-gd php8.4-intl \
composer git unzip
sudo a2enmod rewrite
sudo systemctl restart apache2
/var/www/glastree.
cd /var/www
# Opzione A — Git clone
git clone <URL_REPOSITORY> glastree
# Opzione B — ZIP (se non hai git)
# unzip /percorso/del/glastree.zip -d glastree
cd glastree
Lancerai l'installer interattivo che ti guidera attraverso tutte le fasi:
php install.php
L'installer ti chiedera:
L'installer esegue automaticamente:
.env e APP_KEYcomposer install e registrazione pacchettiSe scegli la modalita Docker, l'installer builda l'immagine, avvia i container e crea l'admin all'interno del container.
Se scegli Restore, l'installer ti chiedera il percorso del file ZIP di backup, ripristinera il database, i file e la configurazione.
sudo tee /etc/apache2/sites-available/glastree.conf <<APACHE
<VirtualHost *:80>
ServerName glastree.esempio.it
DocumentRoot /var/www/glastree/public
<Directory /var/www/glastree/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/glastree_error.log
CustomLog \${APACHE_LOG_DIR}/glastree_access.log combined
</VirtualHost>
APACHE
sudo a2dissite 000-default.conf
sudo a2ensite glastree.conf
sudo systemctl reload apache2
Importante: Il restore da backup richiede che tu abbia un file ZIP generato dalla pagina Admin → Backup del server originale. Estrai manualmente il contenuto seguendo la struttura del progetto.
I comandi php artisan migrate --seed eseguono:
APP_KEY per la crittografia (gia eseguito al passo 5)storage → public/storageIl backup ZIP generato dalla pagina Admin → Backup contiene un dump SQL e i file dei documenti. Per ripristinare:
mysql -u root -p glastree < backup/database.sql)storage/app/ per ripristinare i documenti.env dal backup (modifica le credenziali DB per il nuovo server)php artisan key:generate se la APP_KEY del backup non è utilizzabilesudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d glastree.esempio.it
sudo crontab -u www-data -e
# Inserisci:
* * * * * cd /var/www/glastree && php artisan schedule:run >> /dev/null 2>&1
Probabilmente mancano permessi sulle cartelle storage o bootstrap/cache:
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
APP_KEY non generata. Nella cartella dell'app:
php artisan key:generate
Se le rotte restituiscono 404, verifica che Apache abbia AllowOverride:
sudo a2enmod rewrite
# Nel VirtualHost: AllowOverride All
sudo systemctl reload apache2