Skip to content

Serveur

Jordy Crescoli edited this page Oct 20, 2018 · 4 revisions

Serveur

Cette page sert à documenter le travail réalisé sur le container fourni (et ça peut s'avérer utile si jamais le container lâche).

poweruser@menufinder $ cp ~/www/app/index.php ~/www/index.php.bak # On sait jamais...

Déploiement quasi automatisé

Mettre en place sur le serveur un dépôt Git permettant de simplifier le déploiement de l'application à l'aide la hook Git post_receive.

Dépôt de déploiement

Créer un dépôt "nu" (bare) sur le container :

poweruser@menufinder $ git init --bare ~/menufinder.git
poweruser@menufinder $ touch ~/menufinder.git/hooks/post_receive
poweruser@menufinder $ chmod 775 ~/menufinder.git/hooks/post-receive

Puis copier le contenu de ce fichier dans ~/menufinder.git/hooks/post-receive

Dépôt comme nouvelle remote en local

user@host $ git remote add production ssh://poweruser@srvz-webapp.he-arc.ch:2256/home/poweruser/menufinder.git`

Ça y est ! 💪
Maintenant, pour déployer, il suffit de pusher sur le dépôt de déploiement :

user@host $ git push production master

Premier push

Il peut être nécessaire d'ajuster quelques "trucs" lors du premier push sur le dépôt de déploiement (DocumentRoot Nginx, .env, permissions, générer la clé d'application Laravel, etc). Voir ici.

  • DocumentRoot Nginx : /home/poweruser/www/app/public
  • Voir variables d'environnement pour la configuration du .env
  • Adresse du proxy à ajouter au champ X_FORWARDED_TRUSTED_PROXIES : 172.18.0.6 (cf. issue #14)

Solution de secours

Il est aussi possible de cloner le projet directement depuis le serveur, mais il faut dans ce cas ajouter une clé de déploiement sur le dépôt GitHub

Générer la paire de clés publique/privée avec :

poweruser@menufinder $ ssh-keygen -o

Puis copier la clé publique généré (par défaut ~/.ssh/id_rsa.pub) sur le dépôt GitHub (Settings -> Deploy keys). Ensuite cloner depuis le serveur :

poweruser@menufinder $ git clone git@github.com:HE-Arc/menu-finder.git

Installation PostGIS

PostGIS est une extension pour le serveur Postgres, or celui-ci tourne dans un autre container.
Un nouveau serveur Postgres doit donc être installé directement sur le container Laravel (à moins de demander de compiler PostGIS dans les instructions du Dockerfile comme ici.

Mise à jour OS du container

Bizarrement, le container semble tourner sur Ubuntu 17.04 (Zesty) qui est en end of life depuis janvier 2018 et donc les dépôts du container sont down. Par conséquent, il faut passer sur 18.04 (Bionic, qui est une version LTS en plus).

Remplacer les sources par celle de Bionic et mettre à jour les paquets

poweruser@menufinder $ find /etc/apt/ -type f -iname '*.list' -exec sudo sed -i.bak 's/zesty/bionic/g' {} \;
poweruser@menufinder $ sudo apt-get update
poweruser@menufinder $ # Se préparer psychologiquement à attendre...
poweruser@menufinder $ sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get autoremove -y
poweruser@menufinder $ lbs_release -a # Permet de vérifier que l'on est bien passé sur Bionic

Installation de Postgres et PostGIS

poweruser@menufinder $ echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" > /etc/apt/sources.list.d/pgdg.list 
poweruser@menufinder $ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
poweruser@menufinder $ sudo apt-get update
poweruser@menufinder $ sudo apt-get install postgresql postgresql-10-postgis-2.4

Configuration de Postgres

poweruser@menufinder $ sudo su postgres
postgres@menufinder  $ mkdir /var/lib/postgresql/10/data
postgres@menufinder  $ /usr/lib/postgresql/10/bin/initdb /var/lib/postgresql/10/data
postgres@mufinder    $ exit # ou CTRL + D
poweruser@menufinder $ 

Il faut ensuite créer un service runit pour pouvoir démarrer et gérer le serveur Postgres avec la commande sv.

poweruser@menufinder $ sudo mkdir /etc/runit/runsvdir/default/postgres/
poweruser@menufinder $ sudo touch /etc/runit/runsvdir/default/postgres/run
poweruser@menufinder $ sudo chmod 755 /etc/runit/runsvdir/default/postgres/run
poweruser@menufinder $ sudo apt-get install daemontools # Nécessaire pour la commande setuidgid utilisée ci-dessous

Puis copier le contenu ci-dessous dans /etc/runit/runsvdir/default/postgres/run :

#!/bin/bash
# Taken from http://smarden.org/runit/runscripts.html
exec setuidgid postgres /usr/lib/postgresql/10/bin/postmaster \
    -D /var/lib/postgresql/10/data 2>&1

Le serveur Postgres tourne maintenant comme un service et peut être géré comme Nginx.

Créer la même config (base de données, user et schémas) que celle fourni de base en se connectant au serveur avec la commande psql.

postgres=> CREATE USER menufinder WITH password 'foobar42'; -- Utiliser la valeur de $POSTGRESS_PASS à la place
postgres=> CREATE DATABASE menufinder WITH OWNER menufinder LC_COLLATE 'en_US.utf8' LC_CTYPE 'en_US.utf8';
postgres=> GRANT ALL PRIVILEGES ON DATABASE menufinder TO menufinder;
postgres=> ALTER USER menufinder WITH SUPERUSER; -- Une fois l'extension PostGIS configuré, à désactiver avec NOSUPERUSER
menufinder=> CREATE SCHEMA menufinder;
menufinder=> CREATE SCHEMA production;
menufinder=> CREATE SCHEMA test;
menufinder=> SET search_path TO production
menufinder=> CREATE EXTENSION postgis;

Petits trucs

Pour se connecter facilement en SSH au container, ajoutez ceci au fichier ~/.ssh/config :

host menufinder-webapp
    hostname srvz-webapp.he-arc.ch
    user poweruser
    port 2256

Puis se connecter avec :

user@host $ ssh menufinder-webapp

Variables d'environnement

poweruser@menufinder $ echo $GROUPNAME # DB name, DB user
poweruser@menufinder $ echo $POSTGRES_HOST
poweruser@menufinder $ echo $POSTGRES_PASS

Schémas PostgreSQL

Nom des schémas de la base de données:

  • menufinder
  • production
  • test

Client PostgreSQL

poweruser@menufinder $ psql -U $GROUPNAME # Connexion au serveur local
menufinder=> \l            -- équivalent SHOW DATABASES en MySQL
menufinder=> \dt           -- équivalent SHOW TABLES en MySQL
menufinder=> \c menufinder -- équivalent USE menufinder en MySQL
menufinder=> \dn           -- montre les schémas de la base de données (production, menufinder et test)
menufinder=> SET search_path TO production; -- Ou menufinder ou test
menufinder=> SELECT * FROM users;

Pour se connecter au serveur Postgres fourni de base :

poweruser@menufinder $ psql -U $GROUPNAME -h $POSTGRES_HOST $GROUPNAME