surrender
Some checks failed
ci/woodpecker/push/job Pipeline failed

This commit is contained in:
polwex 2026-04-19 08:51:24 +07:00
parent 0790da4e32
commit 78cc1b95bb
3 changed files with 49 additions and 2 deletions

View file

@ -15,4 +15,4 @@ steps:
image: bash image: bash
commands: commands:
- '[ "${CI_COMMIT_BRANCH:-}" = "master" ] || { echo "skipping deploy on branch ${CI_COMMIT_BRANCH:-unknown}"; exit 0; }' - '[ "${CI_COMMIT_BRANCH:-}" = "master" ] || { echo "skipping deploy on branch ${CI_COMMIT_BRANCH:-unknown}"; exit 0; }'
- /usr/local/libexec/deploy-kotsukotsu - bash ./scripts/deploy-app.sh

View file

@ -2,6 +2,14 @@
let let
cfg = config.services.kotsukotsu; cfg = config.services.kotsukotsu;
launcher = pkgs.writeShellScript "kotsukotsu-launch" ''
exec ${cfg.currentPath}/bin/kotsukotsu
'';
ensureCurrent = pkgs.writeShellScript "kotsukotsu-ensure-current" ''
if [ ! -e ${cfg.currentPath} ]; then
ln -sfn ${cfg.package} ${cfg.currentPath}
fi
'';
in in
{ {
options.services.kotsukotsu = { options.services.kotsukotsu = {
@ -38,6 +46,12 @@ in
description = "Directory for the persistent SQLite database."; description = "Directory for the persistent SQLite database.";
}; };
currentPath = lib.mkOption {
type = lib.types.str;
default = "/var/lib/kotsukotsu/current";
description = "Stable symlink path that points at the active app package.";
};
user = lib.mkOption { user = lib.mkOption {
type = lib.types.str; type = lib.types.str;
default = "kotsukotsu"; default = "kotsukotsu";
@ -71,6 +85,10 @@ in
assertion = lib.hasPrefix "/" cfg.dataDir; assertion = lib.hasPrefix "/" cfg.dataDir;
message = "services.kotsukotsu.dataDir must be an absolute path."; message = "services.kotsukotsu.dataDir must be an absolute path.";
} }
{
assertion = lib.hasPrefix "/" cfg.currentPath;
message = "services.kotsukotsu.currentPath must be an absolute path.";
}
]; ];
users.groups = lib.mkIf (cfg.group == "kotsukotsu") { users.groups = lib.mkIf (cfg.group == "kotsukotsu") {
@ -104,7 +122,8 @@ in
}; };
serviceConfig = { serviceConfig = {
ExecStart = lib.getExe cfg.package; ExecStart = launcher;
ExecStartPre = ensureCurrent;
Group = cfg.group; Group = cfg.group;
Restart = "on-failure"; Restart = "on-failure";
User = cfg.user; User = cfg.user;

28
scripts/deploy-app.sh Normal file
View file

@ -0,0 +1,28 @@
#!/usr/bin/env bash
set -euo pipefail
target_host="${1:-root@sortug.com}"
service_name="${SERVICE_NAME:-kotsukotsu}"
current_path="${CURRENT_PATH:-/var/lib/kotsukotsu/current}"
health_url="${HEALTH_URL:-http://127.0.0.1:5174/healthz}"
store_path="$(nix build --accept-flake-config --print-out-paths .#default | tail -n 1)"
echo "Built ${store_path}"
echo "Copying package to ${target_host}"
nix copy --to "ssh://${target_host}" "${store_path}"
echo "Activating release on ${target_host}"
ssh "${target_host}" "
set -euo pipefail
ln -sfn '${store_path}' '${current_path}'
systemctl restart '${service_name}'
for _ in 1 2 3 4 5 6 7 8 9 10; do
if curl -fsS '${health_url}' >/dev/null; then
exit 0
fi
sleep 1
done
echo 'health check failed for ${service_name}' >&2
exit 1
"