Skip to content

Latest commit

 

History

History
241 lines (159 loc) · 8.3 KB

capify_laravel_for_swisscenter.md

File metadata and controls

241 lines (159 loc) · 8.3 KB

Déployement de projet Laravel

Objectif: Déployer un projet Laravel chez swisscenter

Auteur: Pascal Hurni [email protected]

Modifications:

  • mai 2018
  • décembre 2017

Marche à suivre

Dans tous les points suivants, lorsque vous lisez swisscenter_username comme étant une chaine de caractère, substituez votre vrai nom d'utilisateur chez swisscenter, il en va de même pour projectname mettez le vrai nom de votre projet.

ATTENTION: Il ne faut pas faire la substitution sur les termes commençant par des : (deux-points), comme :swisscenter_username

Prérequis

A faire une seule fois sur la/les machines de développement.

  1. Installer ruby

Attention: sur OSX Mojave (et plus vraisemblalement) il faut downgrader la gem rbnacl à la version 4.0.2

  1. Installer capistrano

gem install capistrano capistrano-laravel

  1. Enregistrer explicitement les routes de gestion de ressource

Pour que les routes de gestion de resources fonctionnent correctement sur Swisscenter, il est nécessaire de faire appel à la méthode register.
Exemple: Route::resource('things', ThingController::class)->register();

Configurer capistrano pour le projet laravel

  1. Dans le répertoire du projet laravel: cap install

  2. Modifier les fichiers fraichement créés

    1. Modifier Capfile en ajoutant après le commentaire # Include tasks from other gems included in your Gemfile:

      require "capistrano/laravel"
    2. Remplacer config/deploy/production.rb par le contenu suivant en adaptant les informations:

      set :swisscenter_username, "swisscenter_username"
      set :swisscenter_servername, "projectname.mycpnv.ch"
      
      set :repo_url, "[email protected]:CPNV-ES/projectname.git"
      
      require_relative 'laravel_swisscenter'
    3. Créer le fichier config/deploy/laravel_swisscenter.rb avec ce contenu (similaire pour tous les projets):

      set :application, fetch(:swisscenter_servername)
      
      set :deploy_to, "/home/#{fetch(:swisscenter_username)}/#{fetch(:application)}"
      
      set :use_sudo, false
      set :laravel_set_acl_paths, false
      set :laravel_upload_dotenv_file_on_deploy, false
      set :composer_install_flags, '--no-dev --prefer-dist --no-interaction --optimize-autoloader'
      
      SSHKit.config.command_map[:composer] = "php -d allow_url_fopen=true #{shared_path.join('composer')}"
      
      server fetch(:swisscenter_servername), user: fetch(:swisscenter_username), roles: %w{app db web}, ssh_options: {
        keys: ["./config/#{fetch(:swisscenter_username)}_rsa"],
        forward_agent: false,
        auth_methods: %w(publickey)
      }
      
      before 'composer:run', 'set_php_version'
      after  'composer:run', 'copy_dotenv'
      after  'composer:run', 'laravel:migrate'
      
      # Determine the PHP version chosen in the swisscenter control panel
      task :set_php_version do
        on roles(:all) do
          execute "ls /home/#{fetch(:swisscenter_username)}/.data/#{fetch(:swisscenter_servername)}_php* 2>/dev/null | sed -E 's/.+(php[[:digit:]]+)$/\\1/' >/tmp/.php-cli-version; cp /tmp/.php-cli-version ~/.php-cli-version"
        end
      end
      
      # Copy .env in the current release
      task :copy_dotenv do
        on roles(:all) do
          execute :cp, "#{shared_path}/.env #{release_path}/.env" 
        end
      end
      
      # Until the `capistrano/laravel` gem is updated, manually remove the `laravel:optimize` task which exists no more from Laravel >=5.5
      Rake::Task['laravel:optimize'].clear_actions rescue nil
  3. Si vous avez une application Laravel >= 5.4, il faut l'adapter pour la version de mysql chez swisscenter

    Modifiez le fichier app/Providers/AppServiceProvider.php pour qu'il ressemble à ceci:
    (Les changements sont montrés par le commentaire <== Mandatory for production use)

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    use Illuminate\Support\Facades\Schema;  // <== Mandatory for production use
    
    class AppServiceProvider extends ServiceProvider
    {
        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot()
        {
            Schema::defaultStringLength(191);  // <== Mandatory for production use
        }
        
        /**
         * Register any application services.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    }
  4. Créer une paire de clés SSH pour le lien machine de dév -> swisscenter

    Depuis le répertoire du projet, lancez cette commande en substituant swisscenter_username par le nom du compte sur swisscenter:

    ssh-keygen -t rsa -b 4096 -C "[email protected]" -f config/swisscenter_username_rsa -N '' -m PEM

    ATTENTION: Ces clés ne doivent pas être publiées, il faut donc éviter de les mettre dans votre repository. Pour ceci ajoutez la ligne suivante dans votre .gitignore:

    /config/*_rsa*
    

    Vous pouvez par contre les partager entre les membres du projet.

Config du serveur chez swisscenter

  1. Depuis la console chez swisscenter:

    Définir la clé SSH pour l'accès distant.

    Cliquez sur l'icône SSH puis copiez le contenu du fichier config/swisscenter_username_rsa.pub dans le champs Clé publique SSH. N'oubliez pas d'activer l'accès en cliquant sur Actif dans le champs Statut de l'accès SSH.

  2. Connectez-vous en SSH chez swisscenter:

    ssh -i config/myproject_rsa [email protected]
    1. Créer la paire de clés pour la communication entre le serveur swisscenter et github.

      Exécutez la commande suivante:

      ssh-keygen -t rsa -b 4096 -C "deploy@github" -f ~/.ssh/id_rsa -N ''
    2. Installer composer

      cd projectname.mycpnv.ch
      mkdir shared
      cd shared
      wget -O composer https://getcomposer.org/composer.phar
      chmod +x composer
    3. Définir le fichier .env pour la production

      Le plus simple est de copier-coller le contenu de votre .env de développement et de l'adapter avec les credentials de swisscenter, notamment pour la connexion à la base de donnée.

      Editez le fichier .env qui DOIT se trouver dans votre répertoire shared:

      cd projectname.mycpnv.ch/shared
      nano .env

      Sauvez le avec CTRL-X

Config sur github

  1. Dans votre repository, cliquez sur Settings

  2. Dans le menu de gauche, cliquez sur Deploy keys

  3. Cliquez sur le bouton Add deploy key

  4. Choisissez un titre (ex: projectname sur swisscenter), puis dans le champs Key mettez le contenu du fichier ~/.ssh/id_rsa.pub du serveur swisscenter.

Premier déploiement

Il faut effectuer un premier déploiement afin de pouvoir faire un dernier réglage chez swisscenter.

  1. Déployez en tappant la commande suivante depuis votre répertoire de projet sur la machine de développement:

    cap production deploy
    
  2. Depuis la console chez swisscenter:

    Ajuster le répertoire de base du serveur web.

    Cliquez sur l'icône Configuration Apache, dans le champs Répertoire de base du domaine choisissez /current/public.

C'est prêt

A chaque fois que vous voulez déployer:

  1. Faites cap production deploy depuis votre répertoire de projet sur la machine de développement):

  2. Depuis la console chez swisscenter, redéfinissez le répertoire de base du serveur web /current/public. Cela est illogique car current est un lien, mais si vous ne le faites pas, votre site continuera à être servi à partir de la release précédente !

Pour revenir à la version précédente:

cap production deploy:rollback

Pour lister toutes les tâches de capistrano:

cap -T

ENJOY!