mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-12 04:18:54 +00:00
refactor(server): better selfhost deployment (#9036)
This commit is contained in:
@@ -3,61 +3,47 @@ import { generateKeyPairSync } from 'node:crypto';
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
|
||||
import { parse } from 'dotenv';
|
||||
|
||||
const SELF_HOST_CONFIG_DIR = '/root/.affine/config';
|
||||
/**
|
||||
* @type {Array<{ from: string; to?: string, modifier?: (content: string): string }>}
|
||||
*/
|
||||
const configFiles = [
|
||||
{ from: './.env.example', to: '.env' },
|
||||
{ from: './dist/config/affine.js', modifier: configCleaner },
|
||||
{ from: './dist/config/affine.env.js', modifier: configCleaner },
|
||||
];
|
||||
|
||||
function configCleaner(content) {
|
||||
function generateConfigFile() {
|
||||
const content = fs.readFileSync('./dist/config/affine.js', 'utf-8');
|
||||
return content.replace(
|
||||
/(^\/\/#.*$)|(^\/\/\s+TODO.*$)|("use\sstrict";?)|(^.*eslint-disable.*$)/gm,
|
||||
''
|
||||
);
|
||||
}
|
||||
|
||||
function generatePrivateKey() {
|
||||
const key = generateKeyPairSync('ec', {
|
||||
namedCurve: 'prime256v1',
|
||||
}).privateKey.export({
|
||||
type: 'sec1',
|
||||
format: 'pem',
|
||||
});
|
||||
|
||||
if (key instanceof Buffer) {
|
||||
return key.toString('utf-8');
|
||||
}
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @type {Array<{ to: string; generator: () => string }>}
|
||||
*/
|
||||
const configFiles = [
|
||||
{ to: 'affine.js', generator: generateConfigFile },
|
||||
{ to: 'private.key', generator: generatePrivateKey },
|
||||
];
|
||||
|
||||
function prepare() {
|
||||
fs.mkdirSync(SELF_HOST_CONFIG_DIR, { recursive: true });
|
||||
|
||||
for (const { from, to, modifier } of configFiles) {
|
||||
const targetFileName = to ?? path.parse(from).base;
|
||||
const targetFilePath = path.join(SELF_HOST_CONFIG_DIR, targetFileName);
|
||||
for (const { to, generator } of configFiles) {
|
||||
const targetFilePath = path.join(SELF_HOST_CONFIG_DIR, to);
|
||||
if (!fs.existsSync(targetFilePath)) {
|
||||
console.log(`creating config file [${targetFilePath}].`);
|
||||
if (modifier) {
|
||||
const content = fs.readFileSync(from, 'utf-8');
|
||||
fs.writeFileSync(targetFilePath, modifier(content), 'utf-8');
|
||||
} else {
|
||||
fs.cpSync(from, targetFilePath, {
|
||||
force: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// make the default .env
|
||||
if (to === '.env') {
|
||||
const dotenvFile = fs.readFileSync(targetFilePath, 'utf-8');
|
||||
const envs = parse(dotenvFile);
|
||||
// generate a new private key
|
||||
if (!envs.AFFINE_PRIVATE_KEY) {
|
||||
const privateKey = generateKeyPairSync('ec', {
|
||||
namedCurve: 'prime256v1',
|
||||
}).privateKey.export({
|
||||
type: 'sec1',
|
||||
format: 'pem',
|
||||
});
|
||||
|
||||
fs.writeFileSync(
|
||||
targetFilePath,
|
||||
`AFFINE_PRIVATE_KEY=${privateKey}\n` + dotenvFile
|
||||
);
|
||||
}
|
||||
fs.writeFileSync(targetFilePath, generator(), 'utf-8');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user