将 Scala 部署到 NixOps
Deploying Scala to NixOps
我正在尝试使用 NixOps 在 NixOS 下的 Scala 中部署带有 Play 2 网络服务的 VirtualBox。
我有这台机器:
{
backoffice = {
deployment.targetEnv = "virtualbox";
deployment.virtualbox.memorySize = 1024; # MB
};
}
在此逻辑网络上:
{
network.description = "Test";
backoffice =
{ config, pkgs, ... }:
let
callPackage = pkgs.lib.callPackageWith (pkgs);
Back = callPackage ../pkgs/Backoffice.nix {};
in {
environment.systemPackages = [
pkgs.jdk
Back
];
systemd.services.backoffice = {
description = "Backoffice";
# Start the service after the network is available
after = [ "network.target" ];
script = "${Back}/webapps/bin/play-back";
serviceConfig = {
Restart = "always";
};
};
networking.hostName = "backoffice";
networking.firewall.allowedTCPPorts = [ 80 ];
system.stateVersion = "15.09";
};
}
其中 Backoffice.nix 是这个推导:
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "Backoffice";
src = ../../back;
buildInputs = [ sbt ];
buildPhase = let
sbtBootDir = "./.sbt/boot/";
sbtIvyHome = "/var/tmp/`whoami`/.ivy";
sbtOpts = "-XX:PermSize=190m -Dsbt.boot.directory=${sbtBootDir} -Dsbt.ivy.home=${sbtIvyHome}";
in ''
mkdir -p ${sbtBootDir}
mkdir -p ${sbtIvyHome}
sbt ${sbtOpts} stage
'';
installPhase = ''
mkdir -p $out/webapps
cp -ra ./target/universal/stage/* $out
'';
}
VM 启动并部署正常。但是当我 ssh 进入它时,我在里面找不到我的 Backoffice 派生。
如果我在本地
nix-build Backoffice.nix
...它构建没有问题,我可以在我的开发机器上的 /nix/store 中找到推导。
在 VM 中,有一个 /nix/store/shaXXX-backoffice.service,所以它可以工作。但由于不存在后台派生,因此它什么也不做。
谁能告诉我哪里做错了?
找到了! systemd.services.backoffice 需要什么:
path = [ "${pkgs.jdk.home}" "${pkgs.gawk}" ];
Play Framework 脚本正在使用两者来启动自身。
我正在尝试使用 NixOps 在 NixOS 下的 Scala 中部署带有 Play 2 网络服务的 VirtualBox。
我有这台机器:
{
backoffice = {
deployment.targetEnv = "virtualbox";
deployment.virtualbox.memorySize = 1024; # MB
};
}
在此逻辑网络上:
{
network.description = "Test";
backoffice =
{ config, pkgs, ... }:
let
callPackage = pkgs.lib.callPackageWith (pkgs);
Back = callPackage ../pkgs/Backoffice.nix {};
in {
environment.systemPackages = [
pkgs.jdk
Back
];
systemd.services.backoffice = {
description = "Backoffice";
# Start the service after the network is available
after = [ "network.target" ];
script = "${Back}/webapps/bin/play-back";
serviceConfig = {
Restart = "always";
};
};
networking.hostName = "backoffice";
networking.firewall.allowedTCPPorts = [ 80 ];
system.stateVersion = "15.09";
};
}
其中 Backoffice.nix 是这个推导:
with import <nixpkgs> {};
stdenv.mkDerivation {
name = "Backoffice";
src = ../../back;
buildInputs = [ sbt ];
buildPhase = let
sbtBootDir = "./.sbt/boot/";
sbtIvyHome = "/var/tmp/`whoami`/.ivy";
sbtOpts = "-XX:PermSize=190m -Dsbt.boot.directory=${sbtBootDir} -Dsbt.ivy.home=${sbtIvyHome}";
in ''
mkdir -p ${sbtBootDir}
mkdir -p ${sbtIvyHome}
sbt ${sbtOpts} stage
'';
installPhase = ''
mkdir -p $out/webapps
cp -ra ./target/universal/stage/* $out
'';
}
VM 启动并部署正常。但是当我 ssh 进入它时,我在里面找不到我的 Backoffice 派生。
如果我在本地
nix-build Backoffice.nix
...它构建没有问题,我可以在我的开发机器上的 /nix/store 中找到推导。
在 VM 中,有一个 /nix/store/shaXXX-backoffice.service,所以它可以工作。但由于不存在后台派生,因此它什么也不做。
谁能告诉我哪里做错了?
找到了! systemd.services.backoffice 需要什么:
path = [ "${pkgs.jdk.home}" "${pkgs.gawk}" ];
Play Framework 脚本正在使用两者来启动自身。