Pourquoi Deployer Laravel sur GCP ?
L'importance d'un bon déploiement pour un projet Laravel est cruciale. En effet, il permet de rendre l'application accessible à vos utilisateurs et de garantir sa disponibilité 24h/24, 7j/7. Depuis Google Cloud Platform (GCP), vous disposez d'une plateforme puissante et scalable pour héberger vos applications Laravel.
Un cas d'utilisation concret serait un site de commerce électronique ou une application de gestion de projet nécessitant des performances élevées et une disponibilité maximale. GCP offre les ressources nécessaires pour gérer ces chargeuses demandes, tout en offrant une grande facilité d'utilisation et des coûts compétitifs.
Prerequis
Pour suivre ce tutoriel, vous aurez besoin de :
- Un compte Google Cloud Platform (GCP)
- Laravel 8 ou plus récent installé sur votre machine locale
- Composer pour gérer les dépendances PHP
- Git pour le contrôle de version
Les outils à installer sont :
- Google Cloud SDK v300.0.0 ou plus récent
- Composer v2.1 ou plus récent
- Git
Concepts fondamentaux
1. Création d'un projet sur GCP
Pour démarrer, vous devez créer un nouveau projet sur GCP.
gcloud projects create mon-projet-laravel --set-as-default
2. Configuration de votre compte Google Cloud
Assurez-vous que le compte utilisé est configuré pour les services nécessaires.
gcloud auth login
gcloud config set project mon-projet-laravel
3. Création d'une instance Compute Engine
Vous aurez besoin d'une machine virtuelle pour héberger votre application Laravel.
gcloud compute instances create laravel-instance --zone=us-central1-a --machine-type=n1-standard-1 --scopes=https://www.googleapis.com/auth/cloud-platform
4. Installation de PHP et Composer sur l'instance
Connectez-vous à votre instance Compute Engine et installez les dépendances nécessaires.
gcloud compute ssh laravel-instance
## Mise à jour des paquets
sudo apt-get update && sudo apt-get upgrade -y
## Installation de PHP 8.1 et Composer
sudo apt-get install -y php8.1 php8.1-fpm php8.1-mysql php8.1-xml php8.1-zip unzip git curl
## Téléchargement et installation de Composer
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
## Configuration de PHP-FPM
sudo cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/www.conf.bak
sudo sed -i 's/user = www-data/user = laravel/' /etc/php/8.1/fpm/pool.d/www.conf
sudo sed -i 's/group = www-data/group = laravel/' /etc/php/8.1/fpm/pool.d/www.conf
## Installation des dépendances du projet Laravel
composer create-project --prefer-dist laravel/laravel my-laravel-app "v8.*"
Mise en pratique : projet fil rouge
Nous allons créer un simple gestionnaire de tâches avec Laravel. Voici les étapes pour mettre en place ce projet.
1. Initialisation du projet
Créez un nouveau projet Laravel et configurez la base de données.
composer create-project --prefer-dist laravel/laravel task-manager "v8.*"
cd task-manager
## Configuration de la base de données dans .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=my_database
DB_USERNAME=root
DB_PASSWORD=password
2. Création d'une table pour les tâches
php artisan make:migration create_tasks_table --create=tasks
Dans le fichier database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php :
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTasksTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('description')->nullable();
$table->boolean('completed')->default(false);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('tasks');
}
}
Exécutez la migration :
php artisan migrate
3. Création d'un modèle et une contrôleur
php artisan make:model Task -mcr
Dans app/Models/Task.php :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
use HasFactory;
protected $fillable = ['title', 'description', 'completed'];
}
Dans app/Http/Controllers/TaskController.php :
<?php
namespace App\Http\Controllers;
use App\Models\Task;
use Illuminate\Http\Request;
class TaskController extends Controller
{
public function index()
{
$tasks = Task::all();
return view('tasks.index', compact('tasks'));
}
public function create()
{
return view('tasks.create');
}
public function store(Request $request)
{
$task = new Task;
$task->title = $request->title;
$task->description = $request->description;
$task->save();
return redirect()->route('tasks.index');
}
public function show(Task $task)
{
return view('tasks.show', compact('task'));
}
public function edit(Task $task)
{
return view('tasks.edit', compact('task'));
}
public function update(Request $request, Task $task)
{
$task->title = $request->title;
$task->description = $request->description;
$task->completed = $request->completed;
$task->save();
return redirect()->route('tasks.index');
}
public function destroy(Task $task)
{
$task->delete();
return redirect()->route('tasks.index');
}
}
4. Création des vues
Créez les vues dans resources/views/tasks/ :
index.blade.phpcreate.blade.phpshow.blade.phpedit.blade.php
Chaque vue doit être structurée pour afficher et modifier les tâches.
5. Configuration des routes
Ajoutez les routes dans routes/web.php :
<?php
use Illuminate\Support\Facades\Route;
Route::get('/tasks', [TaskController::class, 'index'])->name('tasks.index');
Route::get('/tasks/create', [TaskController::class, 'create'])->name('tasks.create');
Route::post('/tasks', [TaskController::class, 'store'])->name('tasks.store');
Route::get('/tasks/{task}', [TaskController::class, 'show'])->name('tasks.show');
Route::get('/tasks/{task}/edit', [TaskController::class, 'edit'])->name('tasks.edit');
Route::put('/tasks/{task}', [TaskController::class, 'update'])->name('tasks.update');
Route::delete('/tasks/{task}', [TaskController::class, 'destroy'])->name('tasks.destroy');
6. Déploiement sur GCP
Connectez-vous à votre instance Compute Engine et déployez l'application.
gcloud compute scp --recurse task-manager laravel-instance:~/
sudo cp -r ~/task-manager/* /var/www/html/
sudo chown -R www-data:www-data /var/www/html/
Créez un fichier nginx.conf pour Nginx :
sudo nano /etc/nginx/sites-available/default
Ajoutez le contenu suivant :
server {
listen 80;
server_name your_domain_or_ip;
root /var/www/html/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Redémarrez Nginx :
sudo systemctl restart nginx
Erreurs frequentes et debugging
1. Erreur : Class 'App\Http\Controllers\TaskController' not found
Ce problème peut se produire si le contrôleur n'est pas correctement importé.
Code incorrect :
class TaskController extends Controller
{
// ...
}
Code correct :
namespace App\Http\Controllers;
use App\Models\Task;
use Illuminate\Http\Request;
class TaskController extends Controller
{
// ...
}
2. Erreur : Migrations not found
Ce problème peut se produire si les migrations ne sont pas détectées.
Code incorrect :
php artisan migrate
Code correct :
php artisan migrate --path=database/migrations/
3. Erreur : Whoops, looks like something went wrong
Ce problème peut se produire si la configuration Nginx est incorrecte.
Code incorrect :
server {
listen 80;
server_name your_domain_or_ip;
root /var/www/html/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Code correct :
server {
listen 80;
server_name your_domain_or_ip;
root /var/www/html/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Pour aller plus loin
1. Utilisation de Kubernetes pour une formation sur le déploiement automatisé
2. Intégration d'un système de monitoring et de gestion des erreurs
3. Sécurité et configuration de la sécurité
Best Practices Security for Laravel
Un défi pratique serait de créer une application API RESTful pour un blog en utilisant Laravel, qui comprend des fonctionnalités telles que la création, la lecture, la mise à jour et la suppression d'articles.