Guida completa alla configurazione, installazione e migrazione
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.Il sistema gestisce automaticamente la differenza tra l'URI (che richiede %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.
{{-- 2. Google Drive --}}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) |
Il nome del file viene automaticamente esteso con l'estensione corretta (es. "Relazione" → "Relazione.docx").
{{-- 3. Google Calendar --}}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 specificoDopo 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).
Il Refresh Token è permanente finché non viene revocato dall'utente. Se la connessione smette di funzionare, potrebbe essere necessario rigenerarlo ripetendo il Passo 2.
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 per la gestione e l'assegnazione.
{{-- 5. Email / SMTP --}}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 |
https://myaccount.google.com/apppasswords.
Le Mailing List permettono di inviare email a gruppi predefiniti di destinatari.
Se nella mailing list sono presenti individui che non hanno un indirizzo email nei contatti, il sistema mostra un avviso con l'elenco dei nominativi esclusi dall'invio. Verifica sempre la presenza di email valide prima di procedere con l'invio.
Dopo aver configurato i server, usa il pulsante Test Connessione per verificare che IMAP e SMTP funzionino correttamente.
{{-- 6. Installazione --}}L'installazione avviene tramite l'interattivo install.php che guida passo-passo. Supporta due modalità:
| Modalità | Descrizione |
|---|---|
| Fresh Install | Installa l'applicazione da zero su un nuovo server: crea il database, esegue le migration, popola i dati di base e crea l'amministratore. |
| Restore da Backup | 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
Puoi clonare il repository con git oppure estrarre il file ZIP ricevuto nella cartella /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
Lancia l'installer interattivo che guida attraverso tutte le fasi:
php install.php
L'installer chiede: modalità (Fresh Install Apache/Docker o Restore), nome sito, dati amministratore, URL pubblico, database (MySQL o SQLite).
Esegue automaticamente: .env + APP_KEY, composer, migration/seed, admin user, asset (se npm presente), permessi.
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
Configura SSL con Let's Encrypt dopo l'installazione.
php artisan tinker --execute=" \$u = new \App\Models\User; \$u->name = 'Admin'; \$u->email = 'admin@esempio.it'; \$u->password = bcrypt('password_sicura'); \$u->save(); "Restore da Backup:
# Importa il database # mysql -u root -p glastree < database.sql # Ripristina i file dei documenti # tar -xzf storage.tar.gz -C storage/ # Rigenera APP_KEY php artisan key:generate # Crea il collegamento storage php artisan storage:link
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
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
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 |
| Via Interfaccia Web | Via Comando |
|---|---|
|
php artisan backup:run Il file viene creato in |
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
Puoi clonare il repository con git oppure estrarre il file ZIP ricevuto nella cartella /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.
{{-- 8. Docker --}}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:
| Configurazione | Descrizione |
|---|---|
| SQLite (Leggero) | Database embedded, nessun servizio aggiuntivo. Ideale per demo, test, sviluppo locale o ambienti con poca concorrenza. |
| MySQL (Standard) | Database separato in un container MySQL. Configurazione standard, ideale per produzione, staging e ambienti con più utenti. |
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 è 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 già 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 -fI 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.