Tauri System administrator documentation Documentation administrateur système

Laravel & Symfony

This tutorial puts a Laravel or Symfony project online on a Tauri hosting account. You prepare the project on your own computer with Composer, send it as a single zip file over FTPS, then unpack it and run the framework's console over SSH. The site is then served over HTTPS on the account's domain, with its data in Tauri's built-in SQL database. Ce tutoriel met en ligne un projet Laravel ou Symfony sur un compte d'hébergement Tauri. Vous préparez le projet sur votre propre ordinateur avec Composer, l'envoyez en un seul fichier zip par FTPS, puis le décompressez et lancez la console du framework par SSH. Le site est alors servi en HTTPS sur le domaine du compte, ses données dans la base SQL intégrée de Tauri.

1. Before you startAvant de commencer

WhatQuoiDetailDétail
A hosting account with its domainUn compte d'hébergement et son domaineCreated by the operator (Hosting). One account serves one site: for a Laravel site and a Symfony site, ask for two accounts.Créé par l'opérateur (Hébergement). Un compte sert un site : pour un site Laravel et un site Symfony, demandez deux comptes.
Enough disk quotaAssez de quota disqueThe default 50 MB is too small. A fresh Laravel 13 project takes about 75 MB (9,000 files), a Symfony 7.4 project with Doctrine about 25 MB; the zip you upload counts too until you delete it. Ask for at least 150 MB (operator: useradm quota <compte> 150000).Les 50 Mo par défaut ne suffisent pas. Un projet Laravel 13 neuf occupe environ 75 Mo (9 000 fichiers), un projet Symfony 7.4 avec Doctrine environ 25 Mo ; le zip envoyé compte aussi tant que vous ne l'avez pas effacé. Demandez au moins 150 Mo (opérateur : useradm quota <compte> 150000).
The right versionsLes bonnes versionsTauri runs PHP 8.3. Laravel 12 and 13 work. For Symfony, take 7.4 (LTS): Symfony 8 requires PHP 8.4.Tauri exécute PHP 8.3. Laravel 12 et 13 conviennent. Pour Symfony, prenez la 7.4 (LTS) : Symfony 8 exige PHP 8.4.
On your computerSur votre ordinateurPHP, Composer, a zip tool, an FTPS client (FileZilla) and an SSH client (OpenSSH or PuTTY). Composer does not run on Tauri: the vendor/ folder is built on your side and uploaded with the rest.PHP, Composer, un outil zip, un client FTPS (FileZilla) et un client SSH (OpenSSH ou PuTTY). Composer ne tourne pas sur Tauri : le dossier vendor/ est construit chez vous et envoyé avec le reste.

If your computer has a newer PHP than 8.3, tell Composer to resolve the dependencies for the server's PHP, in composer.json, then run composer update: Si votre ordinateur a un PHP plus récent que 8.3, demandez à Composer de résoudre les dépendances pour le PHP du serveur, dans composer.json, puis lancez composer update :

"config": {
    "platform": { "php": "8.3.26" }
}

2. Three things that differ from a usual hostTrois différences avec un hébergeur habituel

3. Laravel

On your computerSur votre ordinateur

composer create-project laravel/laravel monsite  # or your existing project# ou votre projet existant
cd monsite
mv public www                                    # the public folder becomes www/# le dossier public devient www/
rm database/database.sqlite                      # SQLite file of the skeleton: not used# fichier SQLite du squelette : inutile

In www/index.php, tell Laravel where its public folder is, just before the last line: Dans www/index.php, indiquez à Laravel où est son dossier public, juste avant la dernière ligne :

$app->usePublicPath(__DIR__);

$app->handleRequest(Request::capture());

In .env: Dans .env :

APP_ENV=production
APP_DEBUG=false
APP_URL=https://www.example.com

DB_CONNECTION=sqlite
DB_DATABASE=database/donnees

Keep the APP_KEY line (create-project generates it; otherwise run php artisan key:generate on your computer). DB_DATABASE is relative to the project root. Sessions, cache and queue may stay on database (their tables are created by the migrations). Then zip the contents of the project folder (not the folder itself), including the hidden files .env and www/.htaccess — it is .htaccess that gives Laravel its clean URLs. On Windows, select everything inside the project folder, then “Compress to ZIP file”. Gardez la ligne APP_KEY (create-project la génère ; sinon lancez php artisan key:generate sur votre ordinateur). DB_DATABASE est relatif à la racine du projet. Sessions, cache et file d'attente peuvent rester sur database (leurs tables sont créées par les migrations). Zippez ensuite le contenu du dossier du projet (pas le dossier lui-même), fichiers cachés .env et www/.htaccess compris — c'est .htaccess qui donne à Laravel ses URL propres. Sous Windows, sélectionnez tout le contenu du dossier du projet, puis « Compresser dans un fichier ZIP ».

zip -r ../monsite.zip . -x ".git/*" "node_modules/*"  # Linux / macOS

On TauriSur Tauri

Send monsite.zip by FTPS to the root of the account (not into www/), then open an SSH session as the account — ssh <compte>@<your domain>, settings in SSH/FTP. You land in the project root; type: Envoyez monsite.zip par FTPS à la racine du compte (pas dans www/), puis ouvrez une session SSH sous le compte — ssh <compte>@<votre domaine>, réglages dans SSH/FTP. Vous arrivez à la racine du projet ; tapez :

unzip -o -q monsite.zip      # several minutes: 9,000 files# plusieurs minutes : 9 000 fichiers
rm monsite.zip               # give the space back# rendre la place
mkdir database/donnees       # Laravel wants the database folder to exist# Laravel veut que le dossier de la base existe
php artisan migrate --force  # create the tables# créer les tables
php artisan optimize         # cache configuration and routes# mettre en cache configuration et routes
exit                         # end the session# fermer la session

Open https://<your domain>/: the Laravel welcome page appears. Once the configuration is cached, a change to .env only counts after a new php artisan optimize. Ouvrez https://<votre domaine>/ : la page d'accueil de Laravel s'affiche. Une fois la configuration en cache, une modification de .env ne compte qu'après un nouveau php artisan optimize.

4. Symfony

On your computerSur votre ordinateur

composer create-project symfony/skeleton:"7.4.*" monsite  # 7.4 LTS, not 8# 7.4 LTS, pas la 8
cd monsite
composer require symfony/orm-pack                         # Doctrine, if you need a database# Doctrine, s'il vous faut une base
mv public www                                             # the public folder becomes www/# le dossier public devient www/

Also declare that folder in composer.json, so that the recipes of the packages you add later write into www/: Déclarez aussi ce dossier dans composer.json, pour que les recettes des paquets ajoutés plus tard écrivent dans www/ :

"extra": {
    "public-dir": "www",
    ...
}

The Symfony skeleton has no .htaccess: create www/.htaccess with these three lines, which send every URL that is not a file to index.php: Le squelette Symfony n'a pas de .htaccess : créez www/.htaccess avec ces trois lignes, qui envoient vers index.php toute URL qui n'est pas un fichier :

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

In .env (or .env.local), with a secret of your own — php -r "echo bin2hex(random_bytes(16));" makes one. Doctrine creates the database folder var/donnees by itself. Dans .env (ou .env.local), avec un secret à vous — php -r "echo bin2hex(random_bytes(16));" en fabrique un. Doctrine crée seul le dossier de la base var/donnees.

APP_ENV=prod
APP_SECRET=<32 hexadecimal characters>
DATABASE_URL="sqlite:///%kernel.project_dir%/var/donnees"

Empty var/cache/, then zip the contents of the project as for Laravel. Videz var/cache/, puis zippez le contenu du projet comme pour Laravel.

On TauriSur Tauri

unzip -o -q monsite.zip
rm monsite.zip
php bin/console doctrine:schema:update --force  # or doctrine:migrations:migrate -n# ou doctrine:migrations:migrate -n
php bin/console cache:clear                     # prepare the prod cache# préparer le cache de prod
exit

Then open, for example, https://<your domain>/ or one of your routes. Ouvrez ensuite par exemple https://<votre domaine>/ ou l'une de vos routes.

5. Updating the siteMettre le site à jour

Zip only what changed (for instance app/ and routes/, or src/ and templates/), send it, and unpack it with unzip -o, which overwrites. Then run the migrations again and rebuild the caches: php artisan optimize for Laravel, php bin/console cache:clear for Symfony. After a composer update on your side, send vendor/ again. Zippez seulement ce qui a changé (par exemple app/ et routes/, ou src/ et templates/), envoyez, et décompressez avec unzip -o, qui écrase. Relancez ensuite les migrations et refaites les caches : php artisan optimize pour Laravel, php bin/console cache:clear pour Symfony. Après un composer update chez vous, renvoyez vendor/.

6. If something goes wrongEn cas de problème

SymptomSymptômeWhat to doQue faire
Error 500Erreur 500Read the framework's log over FTPS: storage/logs/laravel.log or var/log/prod.log. To see the error in the page, set APP_DEBUG=true for a moment (Laravel: then php artisan optimize) — never on a public site.Lisez le journal du framework par FTPS : storage/logs/laravel.log ou var/log/prod.log. Pour voir l'erreur dans la page, mettez un instant APP_DEBUG=true (Laravel : puis php artisan optimize) — jamais sur un site public.
Upload refused with 552Envoi refusé avec 552The quota is full: delete the old zip, or ask the operator for more.Le quota est plein : effacez l'ancien zip, ou demandez-en plus à l'opérateur.
could not find driver, Connection refusedA MySQL, PostgreSQL or Redis setting is left somewhere (.env, config/): only SQLite is available.Il reste un réglage MySQL, PostgreSQL ou Redis quelque part (.env, config/) : seul SQLite est disponible.
Only the home page worksSeule la page d'accueil répondwww/.htaccess is missing (hidden files are easy to leave out of a zip).www/.htaccess manque (les fichiers cachés s'oublient facilement dans un zip).
Limits to keep in mindLimites à garder en tête

A page is stopped after 60 s and a request body is limited to 2 MB (PHP & apps). An account has no resident process and no scheduled task of its own: set QUEUE_CONNECTION=sync for Laravel, and run heavy work from the SSH console. The extensions are those of PHP & apps — notably no intl (except Normalizer), sodium or gmp. Une page est arrêtée au bout de 60 s et un corps de requête est limité à 2 Mo (PHP & applis). Un compte n'a ni processus résident ni tâche planifiée à lui : mettez QUEUE_CONNECTION=sync pour Laravel, et lancez les traitements lourds depuis la console SSH. Les extensions sont celles de PHP & applis — notamment pas d'intl (hors Normalizer), de sodium ni de gmp.