chore(ops): harden deployment and runtime setup

This commit is contained in:
Schubert Ferenc 2026-07-03 22:59:08 +02:00
parent 1d7e7c41c9
commit c35bd5877e
30 changed files with 534 additions and 61 deletions

View file

@ -1,27 +1,25 @@
import { mkdir, readFile, writeFile } from "fs/promises";
import path from "path";
import { dataDirectory } from "@/lib/runtime/config";
import type { ContactInquiry, InquiryStatus, RepairInquiry, SiteSettings, SmtpSettings } from "./types";
const dataDir = path.join(process.cwd(), "data");
async function ensureDataDir() {
await mkdir(dataDir, { recursive: true });
await mkdir(dataDirectory, { recursive: true });
}
async function readJson<T>(fileName: string, fallback: T): Promise<T> {
await ensureDataDir();
try {
const file = await readFile(path.join(dataDir, fileName), "utf8");
const file = await readFile(path.join(dataDirectory, fileName), "utf8");
return JSON.parse(file) as T;
} catch {
await writeJson(fileName, fallback);
return fallback;
}
}
async function writeJson<T>(fileName: string, value: T) {
await ensureDataDir();
await writeFile(path.join(dataDir, fileName), `${JSON.stringify(value, null, 2)}\n`, "utf8");
await writeFile(path.join(dataDirectory, fileName), `${JSON.stringify(value, null, 2)}\n`, "utf8");
}
function id(prefix: string) {

39
lib/runtime/config.ts Normal file
View file

@ -0,0 +1,39 @@
import { existsSync } from "fs";
import { access, mkdir, writeFile, rm } from "fs/promises";
import path from "path";
import { appVersion } from "./version";
export const dataDirectory = path.join(process.cwd(), "data");
export const uploadDirectory = path.join(process.cwd(), "public", "uploads", "images");
export function adminConfigurationStatus() {
return process.env.ADMIN_EMAIL && process.env.ADMIN_PASSWORD && process.env.ADMIN_SESSION_SECRET ? "configured" : "missing";
}
export function isDockerEnvironment() {
return process.env.DOCKER_ENV === "true" || process.env.CONTAINER === "true" || existsSync("/.dockerenv");
}
export async function ensureRuntimeDirectories() {
await mkdir(dataDirectory, { recursive: true });
await mkdir(uploadDirectory, { recursive: true });
}
export async function checkStorage() {
await ensureRuntimeDirectories();
const probe = path.join(dataDirectory, `.storage-check-${Date.now()}`);
await writeFile(probe, "ok", "utf8");
await rm(probe, { force: true });
await access(uploadDirectory);
return "ok";
}
export function olympusStatus() {
return process.env.OLYMPUS_INTAKE_API_URL && process.env.OLYMPUS_INTAKE_API_TOKEN ? "configured" : "not_configured";
}
export function smtpStatus() {
return "prepared";
}
export { appVersion };

1
lib/runtime/version.ts Normal file
View file

@ -0,0 +1 @@
export const appVersion = "0.2.2";