Adds a complete Nix flake for NixOS integration: Package: - Pure reproducible builds using bun2nix (no network during build) - Bundles restic, rclone, shoutrrr, and other runtime dependencies - Supports x86_64-linux, aarch64-linux, x86_64-darwin, aarch64-darwin - Version read from package.json to avoid drift NixOS Module: - Systemd service with security hardening - FUSE support for remote mounts (NFS, SMB, WebDAV) - Configurable options: port, dataDir, user/group, timezone, etc. - protectHome option for backing up home directories - CAP_DAC_READ_SEARCH capability when protectHome=false - PORT env var properly passed to server Development: - devShell with bun, node, biome, typescript, and runtime tools - bun2nix CLI for regenerating bun.nix after dependency changes Also includes: - Overlay exposing zerobyte and shoutrrr packages - NixOS VM integration tests - Experimental darwin module (requires TCC permissions for home dirs) - Configurable MIGRATIONS_PATH and PORT for Nix store compatibility Note: package.json includes additional peer dependencies (@standard-community/*, @standard-schema/spec, openapi-types, quansync, react-is) required by bun2nix for pure builds - bun requires all transitive peer deps to be satisfied.
32 lines
928 B
TypeScript
32 lines
928 B
TypeScript
import { type } from "arktype";
|
|
import "dotenv/config";
|
|
|
|
const envSchema = type({
|
|
NODE_ENV: type.enumerated("development", "production", "test").default("production"),
|
|
PORT: 'string.integer.parse = "4096"',
|
|
SERVER_IP: 'string = "localhost"',
|
|
SERVER_IDLE_TIMEOUT: 'string.integer.parse = "60"',
|
|
RESTIC_HOSTNAME: "string = 'zerobyte'",
|
|
MIGRATIONS_PATH: "string?",
|
|
}).pipe((s) => ({
|
|
__prod__: s.NODE_ENV === "production",
|
|
environment: s.NODE_ENV,
|
|
port: s.PORT,
|
|
serverIp: s.SERVER_IP,
|
|
serverIdleTimeout: s.SERVER_IDLE_TIMEOUT,
|
|
resticHostname: s.RESTIC_HOSTNAME,
|
|
migrationsPath: s.MIGRATIONS_PATH,
|
|
}));
|
|
|
|
const parseConfig = (env: unknown) => {
|
|
const result = envSchema(env);
|
|
|
|
if (result instanceof type.errors) {
|
|
console.error(`Environment variable validation failed: ${result.toString()}`);
|
|
throw new Error("Invalid environment variables");
|
|
}
|
|
|
|
return result;
|
|
};
|
|
|
|
export const config = parseConfig(process.env);
|