Développement/déploiement web (apache, php, postgresql) avec nixops
Voir aussi : vidéo peertube - vidéo youtube - dépôt git
Problématique
Un site web “classique” nécessite souvent un serveur web + php et une base de données.
Problèmes : mise en place non-triviale pour le développeur, mise en place à refaire pour déployer le site final, travail sur plusieurs sites web…
Solutions : docker, nixops…
Exemple de site web
- script SQL pour initialiser la base de données + page php du site web :
data/
├── private
│ └── music.sql
└── public
└── index.php
Déploiement simple avec nixops
- packager le site (mymusic.nix) :
{ pkgs ? import <nixpkgs> {} } :
with pkgs;
{
stdenv.mkDerivation name = "mymusic";
src = ./.;
installPhase = ''
mkdir -p $out
cp -r data/* $out
'';
}
- packager le déploiement avec apache + php + postgresql + virtualbox (nixops.nix) :
{
network.description = "mymusic";
webserver = { config, pkgs, ... }:
let
_mymusic = import ./mymusic.nix { inherit pkgs; };
in
{
networking.firewall.allowedTCPPorts = [ 80 ];
services.httpd = {
enable = true;
adminAddr = "toto@example.com";
documentRoot = "${_mymusic}/public";
extraModules = [
{ name = "php7"; path = "${pkgs.php}/modules/libphp7.so"; }
];
};
services.postgresql = {
enable = true;
package = pkgs.postgresql;
initialScript = "${_mymusic}/private/music.sql";
enableTCPIP = true;
authentication = "local all all trust";
};
deployment = {
targetEnv = "virtualbox";
virtualbox = {
memorySize = 512;
vcpu = 1;
headless = true;
};
};
};
}
- déployer le site dans une machine virtuelle :
$ nixops create -d mymusicvm nixops.nix
$ nixops deploy -d mymusicvm
tester le site dans un navigateur (192.168.56.101)
inconvénient pour un développeur : après une modif, il faut redéployer et ça prend un peu de temps (environ 10 s)
Déploiement avec montage distant
idée : mettre le site web dans un dossier
/data/public
sur la VM puis monter et modifier ce dossier depuis la machine du développeur.modifier le package de déploiement (nixops.nix) :
...
services.httpd = {
...
documentRoot = "/data/public";
...
};
...
- se connecter sur la VM et créer le dossier, puis redéployer :
$ nixops ssh webserver
# mkdir -p /data/public
# chmod 777 /data/public
# exit
$ nixops deploy -d mymusicvm
- monter le dossier en local et développer dans ce dossier (les modifications sont alors visibles immédiatement dans le navigateur) :
$ mkdir mnt
$ nixops mount webserver:/data/public mnt
$ cp data/public/* mnt/
...
$ sudo umount mnt