define-alpine-the-sequel/services/forgejo/secrets.ts

45 lines
1.3 KiB
TypeScript

import { execFile } from "../../helpers/better-api.js";
import { generateSecretsFile, loadSecretsFile } from "../../helpers/secrets.js";
import { buildForgejo } from "./build.js";
export interface ForgejoSecrets {
SECRET_KEY: string;
INTERNAL_TOKEN: string;
LFS_JWT_SECRET: string;
OAUTH_JWT_SECRET: string;
EMAIL_PASSWORD: string;
}
export const loadForgejoSecretsFile =
loadSecretsFile<ForgejoSecrets>("forgejo");
export const generateForgejoSecretsFile = generateSecretsFile(
"forgejo",
generateForgejoSecrets
);
export async function generateForgejoSecrets(): Promise<ForgejoSecrets> {
const bin = await buildForgejo();
console.info(
"Reemplaza la contraseña de mail en secrets/forgejo.json, ¡porfa!"
);
return {
...Object.fromEntries(
await Promise.all([
...["SECRET_KEY", "INTERNAL_TOKEN", "LFS_JWT_SECRET"].map(
async (kind) => [kind, await genSecret(bin, kind as any)]
),
genSecret(bin, "JWT_SECRET").then((s) => ["OAUTH_JWT_SECRET", s]),
])
),
EMAIL_PASSWORD: "REEMPLAZAR POR CONTRASEÑA",
};
}
async function genSecret(
bin: string,
kind: "INTERNAL_TOKEN" | "JWT_SECRET" | "LFS_JWT_SECRET" | "SECRET_KEY"
): Promise<string> {
// XXX: crosscompilation?
const { stdout } = await execFile(bin, ["generate", "secret", kind]);
return stdout;
}