Nouveau : Datasets open source gratuits disponibles !Decouvrir →
🐘
Intermediaire 20 min Laravel

Deployer Laravel sur Fly.io

Pourquoi Deployer Laravel sur Fly.io ?

Contexte réel :
En tant que développeur senior Laravel avec 10 ans d'expérience, vous avez certainement déjà eu besoin de déployer vos applications Laravel sur diverses plateformes pour des raisons telles que la scalabilité, la disponibilité et les coûts. Fly.io est une solution moderne qui permet aux développeurs de déployer leurs applications web en quelques minutes avec un coût minimal.

Un cas d'usage concret :
Imaginez que vous développez un service de gestion de tâches pour des équipes. Vous avez besoin d'une plateforme qui peut gérer une charge utilisateur élevée et s'échelle facilement. Fly.io est parfait pour ce scénario, car il offre une architecture déclarative et auto-scalable.

Prerequis

  • Connaissances nécessaires :

    • PHP (version recommandée : >=7.4)
    • Composer
    • Git
    • Connaissance de Laravel (version recommandée : >=8.x)
  • Outils à installer :

Concepts fondamentaux

1. Comprendre Fly.io

Fly.io est une plateforme cloud qui permet aux développeurs d'automatiser le déploiement et la mise à l'échelle de leurs applications web. Il utilise un modèle déclaratif, ce qui signifie que vous définissez comment votre application doit être exécutée, et Fly.io s'en occupe.

2. Concepts clés

  • Droplet : Un Droplet est une instance virtuelle exécutable sur les serveurs de Fly.io.
  • App : Un App est un ensemble de Droplets qui fonctionnent ensemble pour fournir un service.
  • Releases : Les Releases sont des versions spécifiques de votre application déployées sur Fly.io.

3. Structure du déploiement

Fly.io utilise une structure basée sur les fichiers de configuration YAML pour définir comment votre application doit être déployée. Voici un exemple simple :

## fly.toml
app = "my-laravel-app"
kill_signal = "SIGINT"
kill_timeout = 5000
processes = [
    { type = "web", command = "php artisan serve --port=8080" },
]

4. Déploiement local avec Docker

Avant de déployer sur Fly.io, il est utile de tester votre application localement dans un environnement Docker.

## Dockerfile
FROM php:7.4-fpm

WORKDIR /var/www/html

COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader

COPY . .

CMD ["php", "artisan", "serve"]
bash
## docker-compose.yml
version: '3'

services:
  web:
    build: .
    ports:
      - "8080:8080"
    volumes:
      - .:/var/www/html

5. Déploiement sur Fly.io

Après avoir configuré votre application localement, vous pouvez la déployer sur Fly.io en suivant ces étapes :

## Initialiser un nouveau projet Fly.io
flyctl init

## Se connecter à votre compte Fly.io
flyctl auth login

## Déployer l'application
flyctl deploy

Mise en pratique : Projet fil rouge

Pour illustrer le déploiement de Laravel sur Fly.io, nous allons créer un gestionnaire de tâches simple.

1. Création du projet Laravel

composer create-project --prefer-dist laravel/laravel todo-app "8.*"
cd todo-app

2. Configuration de la base de données

Modifiez le fichier .env pour configurer votre base de données.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tododb
DB_USERNAME=root
DB_PASSWORD=

3. Création d'une migration

Créez une migration pour la table des tâches.

php artisan make:migration create_tasks_table --create=tasks

Editez le fichier de migration :

// database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php
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. Migration et création de la table

Exécutez les migrations :

php artisan migrate

5. Création d'un modèle et d'une controller

Créez un modèle et une controller pour gérer les tâches.

php artisan make:model Task
php artisan make:controller TaskController --resource

Editez le fichier TaskController.php :

// app/Http/Controllers/TaskController.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 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');
    }
}

6. Configuration des routes

Ajoutez les routes dans routes/web.php :

// routes/web.php
Route::resource('tasks', TaskController::class);

7. Création des vues

Créez les vues dans le dossier resources/views/tasks/.

  • index.blade.php
  • create.blade.php
  • edit.blade.php

Exemple de index.blade.php :

<!-- resources/views/tasks/index.blade.php -->
@extends('layouts.app')

@section('content')
    <h1>Tâches</h1>
    <a href="route('tasks.create')" class="btn btn-primary">Nouvelle Tâche</a>
    <table class="table">
        <thead>
            <tr>
                <th>Titre</th>
                <th>Description</th>
                <th>Statut</th>
                <th>Action</th>
            </tr>
        </thead>
        <tbody>
            @foreach ($tasks as $task)
                <tr>
                    <td>$task->title</td>
                    <td>$task->description</td>
                    <td>$task->completed ? 'Terminée' : 'Non Terminée'</td>
                    <td>
                        <a href="route('tasks.edit', $task)" class="btn btn-warning">Éditer</a>
                        <form action="route('tasks.destroy', $task)" method="POST" style="display:inline;">
                            @csrf
                            @method('DELETE')
                            <button type="submit" class="btn btn-danger">Supprimer</button>
                        </form>
                    </td>
                </tr>
            @endforeach
        </tbody>
    </table>
@endsection

8. Configuration de Fly.io

Créez un fichier fly.toml à la racine du projet avec le contenu suivant :

## fly.toml
app = "todo-app"
kill_signal = "SIGINT"
kill_timeout = 5000
processes = [
    { type = "web", command = "php artisan serve --port=8080" },
]

9. Initialisation et déploiement

## Initialiser un nouveau projet Fly.io
flyctl init

## Se connecter à votre compte Fly.io
flyctl auth login

## Déployer l'application
flyctl deploy

Erreurs fréquentes et debugging

1. Erreur : Error: listen EADDRINUSE: address already in use :::8080

Code incorrect :

// app/Http/Controllers/TaskController.php
public function index()
{
    $tasks = Task::all();
    return view('tasks.index', compact('tasks'));
}

Code correct :

// app/Http/Controllers/TaskController.php
public function index()
{
    $tasks = Task::all();
    return view('tasks.index')->with('tasks', $tasks);
}

2. Erreur : Error: Cannot find module 'laravel-mix'

Code incorrect :

## package.json
{
    "dependencies": {
        "laravel-mix": "^6.0"
    }
}

Code correct :

// package.json
{
    "devDependencies": {
        "laravel-mix": "^6.0"
    }
}

3. Erreur : SQLSTATE[HY000] [2002] Connection refused

Code incorrect :

// .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tododb
DB_USERNAME=root
DB_PASSWORD=

Code correct :

// .env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=tododb
DB_USERNAME=root
DB_PASSWORD=

Pour aller plus loin

1. Utilisation de Fly.io CLI pour gérer les applications

Fly.io offre une CLI qui permet de gérer facilement vos applications. Vous pouvez déployer, mettre à jour et même écheloner vos applications en quelques commandes.

## Liste des apps
flyctl list

## Mettre à jour l'application
flyctl deploy --image your-new-image

## Écheler les Droplets
flyctl scale count=3

2. Utilisation de Fly.io pour exécuter des tâches background

Fly.io permet d'exécuter des tâches background en utilisant des Workers. Cela peut être utilisé pour tâches comme l'envoi de notifications, la génération de fichiers, etc.

// worker.js
import { Worker } from 'node:worker_threads';
const worker = new Worker('./myWorker.js');
worker.on('message', (message) => console.log(message));

3. Utilisation de Fly.io pour des applications monolithiques et microservices

Fly.io permet de déployer des applications monolithiques comme Laravel, mais aussi des architectures microservices grâce à ses capacités auto-scalables.

## Déploiement d'un service microservice
flyctl launch --name my-microservice --dockerfile ./Dockerfile.microservice

Défi pratique

Déployez une application Laravel simple sur Fly.io et configurez-la pour utiliser un base de données externe. Assurez-vous que votre application est bien mise à l'échelle et peut gérer une charge utilisateur élevée.

Bonne chance avec ce tutoriel ! N'hésitez pas à poser des questions si vous avez des difficultés ou besoin d'aide supplémentaire.

Besoin d'aide sur Laravel ?

Besoin d'aide sur un projet technique ? Decrivez-le pour des conseils personnalises.

Recevoir des conseils

Questions frequentes

Quelle est la première étape pour déployer Laravel sur Fly.io ?
La première étape consiste à créer un compte sur Fly.io et à installer le CLI de Fly.io sur votre machine locale.
Comment configurer l'environnement de production pour Laravel sur Fly.io ?
Vous devez configurer les variables d'environnement nécessaires dans le fichier .env, notamment la base de données et les paramètres de sécurité. Ensuite, vous pouvez utiliser Artisan pour installer les dépendances et compiler les assets.
Quel est le processus pour mettre à jour un projet Laravel sur Fly.io ?
Pour mettre à jour un projet Laravel sur Fly.io, vous devez d'abord effectuer vos modifications locales. Ensuite, utilisez Git pour commiter et pousser les changements vers la branche de déploiement sur Fly.io. Fly.io prendra automatiquement en charge le déploiement des nouvelles modifications.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.