vidéo peertube - vidéo youtube - dépôt git

Développement/déploiement web (apache, php, postgresql) avec nixops

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

data/
├── private
│   └── music.sql
└── public
    └── index.php

Déploiement simple avec nixops

{ pkgs ? import <nixpkgs> {} } :
with pkgs;
stdenv.mkDerivation {
  name = "mymusic";
  src = ./.;
  installPhase = ''
    mkdir -p $out
    cp -r data/* $out
  '';
}
{
  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;
      };
    };
  };
}
$ nixops create -d mymusicvm nixops.nix
$ nixops deploy -d mymusicvm 

Déploiement avec montage distant

...
    services.httpd = {
      ...
      documentRoot = "/data/public";
      ...
    };
...
$ nixops ssh webserver
# mkdir -p /data/public
# chmod 777 /data/public
# exit
$ nixops deploy -d mymusicvm 
$ mkdir mnt
$ nixops mount webserver:/data/public mnt
$ cp data/public/* mnt/
...
$ sudo umount mnt