feat: implement initial values and saving to db logic
This commit is contained in:
parent
abd7a1ca2e
commit
3f223a9dbf
|
@ -7,6 +7,7 @@ services:
|
|||
SECRET: "wowfcgMHqZHwOIMLadWrKu3liyqPOOILpDLSDvuxq3YGhJmiZXJCVpnF96l11WfR"
|
||||
ADMIN_ACCOUNT: "admin"
|
||||
ADMIN_PASSWORD: "admin"
|
||||
# OVERWRITE_SETTINGS: 'false'
|
||||
# ROUTE_PREFIX: /api
|
||||
# RATE_LIMIT_WINDOW: 2
|
||||
# RATE_LIMIT_MAX: 5
|
||||
|
|
|
@ -26,6 +26,7 @@ services:
|
|||
- "5001"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
OVERWRITE_SETTINGS: "false"
|
||||
CHUNK_SIZE: 90
|
||||
ROUTE_PREFIX: /api
|
||||
RATE_LIMIT_WINDOW: 2
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
"api": "node src/api/structures/Server",
|
||||
"update": "git pull && npm install && npm run migrate && npm run build && npm run restart",
|
||||
"restart": "pm2 restart lolisafe",
|
||||
"overwrite-config": "cross-env OVERWRITE_SETTINGS=true",
|
||||
"test:vue": "jest --testPathPattern=src/site",
|
||||
"test:api": "jest --testPathPattern=src/tests/api",
|
||||
"test:e2e": "jest --testPathPattern=src/tests/e2e",
|
||||
|
|
|
@ -1,7 +1,27 @@
|
|||
exports.up = async knex => {
|
||||
await knex.schema.createTable('settings', table => {
|
||||
table.string('key').unique();
|
||||
table.json('value').notNullable();
|
||||
table.string('routePrefix');
|
||||
table.integer('rateLimitWindow');
|
||||
table.integer('rateLimitMax');
|
||||
table.string('secret');
|
||||
table.string('serviceName');
|
||||
table.string('domain');
|
||||
table.integer('chunkSize');
|
||||
table.integer('maxSize');
|
||||
table.boolean('generateZips');
|
||||
table.integer('generatedFilenameLength');
|
||||
table.integer('generatedAlbumLength');
|
||||
table.integer('maxLinksPerAlbum');
|
||||
table.string('uploadFolder');
|
||||
table.json('blockedExtensions');
|
||||
table.boolean('publicMode');
|
||||
table.boolean('userAccounts');
|
||||
table.string('adminAccount');
|
||||
table.string('adminPassword');
|
||||
table.string('metaThemeColor');
|
||||
table.string('metaDescription');
|
||||
table.string('metaKeywords');
|
||||
table.string('metaTwitterHandle');
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -1,9 +1,22 @@
|
|||
/* eslint-disable no-console */
|
||||
const bcrypt = require('bcrypt');
|
||||
const moment = require('moment');
|
||||
const Util = require('../../utils/Util');
|
||||
|
||||
exports.seed = async db => {
|
||||
const now = moment.utc().toDate();
|
||||
|
||||
// Save environment variables to the database
|
||||
try {
|
||||
const settings = await db.table('settings').first();
|
||||
if (!settings) {
|
||||
await Util.writeConfigToDb(Util.getEnvironmentDefaults(), false);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
// Create admin user if it doesnt exist
|
||||
const user = await db.table('users').where({ username: process.env.ADMIN_ACCOUNT }).first();
|
||||
if (user) return;
|
||||
try {
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
require('dotenv').config();
|
||||
|
||||
const Util = require('../utils/Util');
|
||||
|
||||
const start = async () => {
|
||||
try {
|
||||
await Util.writeConfigToDb(Util.getEnvironmentDefaults());
|
||||
console.log('Configuration overwriten, you can now start chibisafe');
|
||||
process.exit(0);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
};
|
||||
|
||||
start();
|
|
@ -23,7 +23,7 @@ const db = Knex({
|
|||
some things like different data types for booleans need to be considered like in
|
||||
the implementation below where sqlite returns 1 and 0 instead of true and false.
|
||||
*/
|
||||
const booleanFields = ['enabled', 'enableDownload', 'isAdmin', 'nsfw'];
|
||||
const booleanFields = ['enabled', 'enableDownload', 'isAdmin', 'nsfw', 'generateZips', 'publicMode', 'userAccounts'];
|
||||
|
||||
const processResponse = row => {
|
||||
Object.keys(row).forEach(key => {
|
||||
|
|
|
@ -40,6 +40,45 @@ class Util {
|
|||
this._config = null;
|
||||
}
|
||||
|
||||
static getEnvironmentDefaults() {
|
||||
return {
|
||||
routePrefix: process.env.ROUTE_PREFIX || '/api',
|
||||
rateLimitWindow: process.env.RATE_LIMIT_WINDOW || 2,
|
||||
rateLimitMax: process.env.RATE_LIMIT_MAX || 5,
|
||||
secret: process.env.SECRET || randomstring.generate(64),
|
||||
serviceName: process.env.SERVICE_NAME || 'change-me',
|
||||
domain: process.env.DOMAIN || `http://localhost:${process.env.SERVER_PORT}`,
|
||||
chunkSize: process.env.CHUNK_SIZE || 90,
|
||||
maxSize: process.env.MAX_SIZE || 5000,
|
||||
generateZips: process.env.GENERATE_ZIPS == undefined ? true : false,
|
||||
generatedFilenameLength: process.env.GENERATED_FILENAME_LENGTH || 12,
|
||||
generatedAlbumLength: process.env.GENERATED_ALBUM_LENGTH || 6,
|
||||
maxLinksPerAlbum: process.env.MAX_LINKS_PER_ALBUM || 5,
|
||||
uploadFolder: process.env.UPLOAD_FOLDER || 'uploads',
|
||||
blockedExtensions: process.env.BLOCKED_EXTENSIONS || ['.jar', '.exe', '.msi', '.com', '.bat', '.cmd', '.scr', '.ps1', '.sh'],
|
||||
publicMode: process.env.PUBLIC_MODE == undefined ? true : false,
|
||||
userAccounts: process.env.USER_ACCOUNTS == undefined ? true : false,
|
||||
adminAccount: process.env.ADMIN_ACCOUNT || 'admin',
|
||||
adminPassword: process.env.ADMIN_PASSWORD || 'admin',
|
||||
metaThemeColor: process.env.META_THEME_COLOR || '#20222b',
|
||||
metaDescription: process.env.META_DESCRIPTION || 'Blazing fast file uploader and bunker written in node! 🚀',
|
||||
metaKeywords: process.env.META_KEYWORDS || 'chibisafe,lolisafe,upload,uploader,file,vue,images,ssr,file uploader,free',
|
||||
metaTwitterHandle: process.env.META_TWITTER_HANDLE || '@your-handle'
|
||||
};
|
||||
}
|
||||
|
||||
static async writeConfigToDb(config, overwrite = true) {
|
||||
try {
|
||||
if (overwrite) {
|
||||
await db.table('settings').first().update(config);
|
||||
} else {
|
||||
await db.table('settings').insert(config);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
}
|
||||
|
||||
static uuid() {
|
||||
return uuidv4();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue