Ctrl K
ComunidadGuías…

nix/container.nix

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
{ config, pkgs, ... }:

let
  deno = config.languages.deno.package;
  server = pkgs.writeShellApplication {
    name = "tickets-server";
    runtimeInputs = [
      deno
      pkgs.coreutils
      pkgs.util-linux
    ];
    text = builtins.readFile ../scripts/container/start.sh;
  };

  appFiles = pkgs.runCommand "tickets-app" {
    APP_SOURCE = ../src;
    DENO_CONFIG = ../deno.json;
    DENO_LOCK = ../deno.lock;
    WORKSPACE_CONFIG = ../e2e-payments/deno.json;
  } (builtins.readFile ../scripts/container/app-files.sh);

  cacheFiles = pkgs.runCommand "tickets-deno-cache" {
    CACHE_SOURCE = ../.container-work/deno-cache;
  } (builtins.readFile ../scripts/container/cache-files.sh);
in
{
  scripts = {
    container-build.exec = builtins.readFile ../scripts/container/build.sh;
    container-load.exec = builtins.readFile ../scripts/container/load.sh;
    container-check.exec = builtins.readFile ../scripts/container/check.sh;
  };

  outputs.tickets-image = pkgs.dockerTools.streamLayeredImage {
    name = "ghcr.io/chobbledotcom/tickets";
    tag = "latest";
    contents = [
      appFiles
      server
      cacheFiles
    ];
    fakeRootCommands = builtins.readFile ../scripts/container/permissions.sh;

    config = {
      Env = [ "DENO_DIR=/deno-cache" ];
      Entrypoint = [
        "${pkgs.tini}/bin/tini"
        "--"
        "${server}/bin/tickets-server"
      ];
      WorkingDir = "/app";
      ExposedPorts."3000/tcp" = { };
      Volumes."/data" = { };

      # /health also answers before site setup.
      Healthcheck = {
        Test = [
          "CMD"
          "${deno}/bin/deno"
          "eval"
          "const r = await fetch('http://127.0.0.1:3000/health'); if (!r.ok) Deno.exit(1);"
        ];
        Interval = 30000000000;
        Retries = 3;
        StartPeriod = 10000000000;
        Timeout = 5000000000;
      };
    };
  };
}