Pourquoi Deployer Laravel sur DigitalOcean ?
Deployer Laravel sur DigitalOcean est une pratique courante pour les développeurs qui cherchent à déployer leurs applications web en production. Cette plateforme offre un environnement robuste et fiable, permettant de gérer facilement la mise à l'échelle de vos applications. Un cas concret serait le déploiement d'une application de gestion de projets pour une petite entreprise où la performance et la fiabilité sont essentielles.
Prerequis
Pour suivre ce tutoriel, vous aurez besoin des éléments suivants :
Connaissances :
- Familiarité avec Laravel
- Connaissance de l'infrastructure en nuage (Cloud)
- Basic understanding of Git
Outils à installer :
- Node.js (v14.x ou v16.x) pour les packages npm
- Composer pour les dépendances PHP
- Docker (facultatif, mais recommandé pour la gestion des environnements de développement)
- Git
- SSH client pour interagir avec votre serveur DigitalOcean
Concepts fondamentaux
1. Environnement Cloud
Le cloud est un modèle de calcul où les ressources informatiques (par exemple, le stockage, le réseau et le traitement) sont décentralisées et accessibles via Internet. Il offre plusieurs avantages :
- Élasticité : La capacité à augmenter ou diminuer le nombre de ressources en fonction de la demande.
- Fiabilité : Les données et les services sont hébergés sur des milliers d'ordinateurs, réduisant ainsi les risques de pannes.
- Coût-éfficacité : Il permet de payer uniquement ce qui est utilisé.
2. DigitalOcean
DigitalOcean est une entreprise spécialisée dans la fourniture de serveurs cloud et d'hébergement. Il offre des instances virtuelles (droplets), qui sont des environnements dédiés à votre application. Les avantages principaux sont :
- Facilité d'utilisation : Une interface graphique intuitive.
- Principe pay-as-you-go : Vous payez uniquement pour les ressources que vous utilisez.
- Diversité géographique : Des centres de données répartis dans le monde entier, permettant une meilleure disponibilité.
3. Configuration Web Server
Laravel utilise Nginx comme serveur web par défaut. Il est conçu pour être rapide et efficace. Vous aurez besoin de configurer Nginx pour servir votre application Laravel.
server {
listen 80;
server_name yourdomain.com;
root /path/to/your/laravel/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # Ajustez la version PHP selon votre configuration
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
4. Base de données
Laravel utilise MySQL ou PostgreSQL comme base de données par défaut. Vous aurez besoin d'installer et de configurer une base de données sur votre serveur.
## Installer MySQL
sudo apt update
sudo apt install mysql-server
## Configurer MySQL
sudo mysql_secure_installation
Mise en pratique : Projet fil rouge
Nous allons créer un simple gestionnaire de tâches. Voici les étapes pour le mettre en place :
1. Créer un nouveau projet Laravel
composer create-project --prefer-dist laravel/laravel task-manager
cd task-manager
2. Configurer la base de données
Modifiez le fichier .env pour configurer votre base de données MySQL.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=task_manager
DB_USERNAME=root
DB_PASSWORD=your_password
3. Créer une migration pour la table des tâches
php artisan make:migration create_tasks_table --create=tasks
Editez la migration 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
{
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();
});
}
public function down()
{
Schema::dropIfExists('tasks');
}
}
4. Migrer la base de données
php artisan migrate
5. Créer un modèle et une migration pour les tâches
php artisan make:model Task -m
Editez 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
{
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();
});
}
public function down()
{
Schema::dropIfExists('tasks');
}
}
6. Créer une migration pour les utilisateurs
php artisan make:model User -m
Editez database/migrations/xxxx_xx_xx_xxxxxx_create_users_table.php :
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
}
7. Migrer les tables
php artisan migrate
8. Créer un contrôleur pour les tâches
php artisan make:controller TaskController
Editez app/Http/Controllers/TaskController.php :
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Task;
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($id)
{
$task = Task::find($id);
return view('tasks.show', compact('task'));
}
public function edit($id)
{
$task = Task::find($id);
return view('tasks.edit', compact('task'));
}
public function update(Request $request, $id)
{
$task = Task::find($id);
$task->title = $request->title;
$task->description = $request->description;
$task->save();
return redirect()->route('tasks.index');
}
public function destroy($id)
{
$task = Task::find($id);
$task->delete();
return redirect()->route('tasks.index');
}
}
9. Créer les vues
Créez les fichiers de vue dans resources/views/tasks/ :
index.blade.phpcreate.blade.phpshow.blade.phpedit.blade.php
Exemple resources/views/tasks/index.blade.php :
@extends('layouts.app')
@section('content')
<div class="container">
<h1>Tâches</h1>
<a href="route('tasks.create')" class="btn btn-primary mb-3">Nouvelle Tâche</a>
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Titre</th>
<th>Description</th>
<th>Statut</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach ($tasks as $task)
<tr>
<td>$task->id</td>
<td>$task->title</td>
<td>$task->description</td>
<td>$task->completed ? 'Terminée' : 'En cours'</td>
<td>
<a href="route('tasks.edit', $task->id)" class="btn btn-primary">Éditer</a>
<form action="route('tasks.destroy', $task->id)" method="POST" style="display:inline">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger" onclick="return confirm('Voulez-vous supprimer cette tâche ?')">Supprimer</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endsection
10. Configurer les routes
Modifiez routes/web.php :
use App\Http\Controllers\TaskController;
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/{id}', [TaskController::class, 'show'])->name('tasks.show');
Route::get('/tasks/{id}/edit', [TaskController::class, 'edit'])->name('tasks.edit');
Route::put('/tasks/{id}', [TaskController::class, 'update'])->name('tasks.update');
Route::delete('/tasks/{id}', [TaskController::class, 'destroy'])->name('tasks.destroy');
11. Configurer le modèle et la migration pour les utilisateurs
Modifiez app/Models/User.php :
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use HasFactory, Notifiable;
protected $fillable = [
'name',
'email',
'password',
];
protected $hidden = [
'password',
'remember_token',
];
}
Modifiez database/migrations/xxxx_xx_xx_xxxxxx_create_users_table.php :
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
}
12. Configurer l'authentification
php artisan make:auth
Modifiez routes/web.php :
Auth::routes();
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
Erreurs frequentes et debugging
1. Erreur : "Class 'Task' not found"
Code incorrect :
use App\Models\Tasks;
Code correct :
use App\Models\Task;
2. Erreur : "SQLSTATE[42S02]: Base table or view not found: 1146 Table 'yourdatabase.tasks' doesn't exist"
Code incorrect :
php artisan migrate
Code correct :
Assurez-vous que la base de données est correctement configurée dans le fichier .env et que les migrations sont bien écrites.
3. Erreur : "Whoops, looks like something went wrong."
Code incorrect :
php artisan serve
Code correct :
Assurez-vous que Nginx est bien configuré pour servir votre application Laravel et que les permissions des fichiers sont correctes.
Pour aller plus loin
- Gestion des déploiements automatisés avec GitHub Actions ou GitLab CI/CD
- Utilisation de Docker pour la gestion des environnements de développement
- Intégration continue (CI) et livraison continue (CD)
Défi pratique
Déployez votre application Laravel sur DigitalOcean en suivant les étapes décrites dans ce tutoriel. Assurez-vous que tout fonctionne correctement, y compris l'authentification et les routes.