feat: prism launcher link
This commit is contained in:
@@ -48,6 +48,7 @@ let
|
|||||||
giteaRunnerService = "gitea-runner-${giteaRunnerEscapedInstance}";
|
giteaRunnerService = "gitea-runner-${giteaRunnerEscapedInstance}";
|
||||||
giteaRunnerTokenEnvService = "${giteaRunnerService}-token-env";
|
giteaRunnerTokenEnvService = "${giteaRunnerService}-token-env";
|
||||||
giteaRunnerTokenEnv = "/run/gitea-runner-${giteaRunnerInstance}/token.env";
|
giteaRunnerTokenEnv = "/run/gitea-runner-${giteaRunnerInstance}/token.env";
|
||||||
|
worldOfSosalRoot = "/var/www/store/world-of-sosal";
|
||||||
in {
|
in {
|
||||||
imports = [
|
imports = [
|
||||||
self.nixosModules.hectic
|
self.nixosModules.hectic
|
||||||
@@ -341,6 +342,8 @@ in {
|
|||||||
|
|
||||||
systemd.tmpfiles.rules = [
|
systemd.tmpfiles.rules = [
|
||||||
"d /var/www/store 0755 nginx nginx -"
|
"d /var/www/store 0755 nginx nginx -"
|
||||||
|
"d ${worldOfSosalRoot} 0750 root nginx -"
|
||||||
|
"d ${worldOfSosalRoot}/releases 0750 root nginx -"
|
||||||
];
|
];
|
||||||
|
|
||||||
systemd.services.${giteaRunnerTokenEnvService} = {
|
systemd.services.${giteaRunnerTokenEnvService} = {
|
||||||
@@ -385,6 +388,60 @@ in {
|
|||||||
autoindex on;
|
autoindex on;
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
locations."= /world-of-sosal/" = {
|
||||||
|
extraConfig = ''
|
||||||
|
alias ${./static/world-of-sosal/index.html};
|
||||||
|
default_type text/html;
|
||||||
|
add_header Cache-Control "no-cache" always;
|
||||||
|
limit_except GET {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
locations."= /world-of-sosal/latest.mrpack" = {
|
||||||
|
extraConfig = ''
|
||||||
|
root /var/www/store;
|
||||||
|
default_type application/zip;
|
||||||
|
add_header Content-Disposition "attachment" always;
|
||||||
|
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
|
||||||
|
try_files $uri =404;
|
||||||
|
if ($request_method != GET) { return 405; }
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
locations."= /world-of-sosal/SHA256SUMS" = {
|
||||||
|
extraConfig = ''
|
||||||
|
root /var/www/store;
|
||||||
|
default_type text/plain;
|
||||||
|
add_header Content-Disposition "attachment" always;
|
||||||
|
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
|
||||||
|
try_files $uri =404;
|
||||||
|
if ($request_method != GET) { return 405; }
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
locations."= /world-of-sosal/releases/" = {
|
||||||
|
extraConfig = ''
|
||||||
|
return 404;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
locations."~ ^/world-of-sosal/releases/[A-Za-z0-9][A-Za-z0-9._-]*\\.mrpack$" = {
|
||||||
|
extraConfig = ''
|
||||||
|
root /var/www/store;
|
||||||
|
default_type application/zip;
|
||||||
|
add_header Content-Disposition "attachment" always;
|
||||||
|
add_header Cache-Control "public, max-age=31536000, immutable" always;
|
||||||
|
try_files $uri =404;
|
||||||
|
if ($request_method != GET) { return 405; }
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
locations."/world-of-sosal/" = {
|
||||||
|
extraConfig = ''
|
||||||
|
autoindex off;
|
||||||
|
limit_except GET {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
return 404;
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
virtualHosts."lessons.${domain}" = {
|
virtualHosts."lessons.${domain}" = {
|
||||||
enableACME = true;
|
enableACME = true;
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>WorldOfSosal</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<h1>WorldOfSosal</h1>
|
||||||
|
<p><a href="https://store.hectic-lab.com/world-of-sosal/latest.mrpack">Download latest pack</a></p>
|
||||||
|
<p><a href="prismlauncher://import?url=https%3A%2F%2Fstore.hectic-lab.com%2Fworld-of-sosal%2Flatest.mrpack">Import latest pack in Prism Launcher</a></p>
|
||||||
|
<p><a href="https://store.hectic-lab.com/world-of-sosal/SHA256SUMS">SHA-256 checksums</a></p>
|
||||||
|
<p>Updates are manual. Packs imported from arbitrary URLs do not update automatically.</p>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# WorldOfSosal pack publishing
|
||||||
|
|
||||||
|
The public endpoint is `https://store.hectic-lab.com/world-of-sosal/`. Nix
|
||||||
|
deploys only its landing page and nginx configuration. Pack files, the checksum
|
||||||
|
manifest, and `latest.mrpack` stay under `/var/www/store/world-of-sosal` on the
|
||||||
|
host and never enter Git or the Nix store.
|
||||||
|
|
||||||
|
## Publish an uploaded pack
|
||||||
|
|
||||||
|
Run these commands on `hectic-lab` as root after the Storage Box pack has
|
||||||
|
already been uploaded to a local staging path. Pick a stable version name; do
|
||||||
|
not replace an existing versioned release.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
set -eu
|
||||||
|
source_pack=/path/to/already-uploaded/WorldOfSosal.mrpack
|
||||||
|
version=2026-09-16
|
||||||
|
root=/var/www/store/world-of-sosal
|
||||||
|
release_name="WorldOfSosal-${version}.mrpack"
|
||||||
|
release_path="$root/releases/$release_name"
|
||||||
|
|
||||||
|
printf '%s %s\n' \
|
||||||
|
f8c18acb9208e4592725632ae50dab4f9c308483b34fd43a6507c74fdbf8169f \
|
||||||
|
"$source_pack" | sha256sum --check --status
|
||||||
|
test ! -e "$release_path"
|
||||||
|
install -o root -g nginx -m 0640 "$source_pack" "$release_path.new"
|
||||||
|
mv -T "$release_path.new" "$release_path"
|
||||||
|
|
||||||
|
manifest="$root/.SHA256SUMS.$$"
|
||||||
|
(cd "$root/releases" && sha256sum -- *.mrpack) > "$manifest"
|
||||||
|
chown root:nginx "$manifest"
|
||||||
|
chmod 0640 "$manifest"
|
||||||
|
mv -Tf "$manifest" "$root/SHA256SUMS"
|
||||||
|
|
||||||
|
latest="$root/.latest.mrpack.$$"
|
||||||
|
ln -s "releases/$release_name" "$latest"
|
||||||
|
mv -Tf "$latest" "$root/latest.mrpack"
|
||||||
|
```
|
||||||
|
|
||||||
|
Versioned releases use a one-year immutable cache policy. `latest.mrpack` and
|
||||||
|
`SHA256SUMS` disable caching so an atomic replacement becomes visible quickly.
|
||||||
|
The manifest is available at
|
||||||
|
`https://store.hectic-lab.com/world-of-sosal/SHA256SUMS`.
|
||||||
|
|
||||||
|
Import the current pack in Prism Launcher with:
|
||||||
|
|
||||||
|
```text
|
||||||
|
prismlauncher://import?url=https%3A%2F%2Fstore.hectic-lab.com%2Fworld-of-sosal%2Flatest.mrpack
|
||||||
|
```
|
||||||
|
|
||||||
|
Direct URL imports do not auto-update. Repeat the publication and import steps
|
||||||
|
for each new pack version.
|
||||||
Reference in New Issue
Block a user