feature: env vars to auto-create root user during initial setup

This commit is contained in:
alex-sviridov 2025-09-28 22:17:12 +02:00
parent 03da194953
commit 0a49d13c67
3 changed files with 33 additions and 1 deletions

View File

@ -6,5 +6,8 @@ module.exports.config = {
MetadataPath: Path.resolve('metadata'),
FFmpegPath: '/usr/bin/ffmpeg',
FFProbePath: '/usr/bin/ffprobe',
SkipBinariesCheck: false
SkipBinariesCheck: false,
// Auto-create root user during initial setup
// InitUserName: 'admin',
// InitUserPassword: 'password'
}

View File

@ -31,6 +31,8 @@ if (isDev || options['prod-with-dev-env']) {
if (devEnv.AllowIframe) process.env.ALLOW_IFRAME = '1'
if (devEnv.BackupPath) process.env.BACKUP_PATH = devEnv.BackupPath
if (devEnv.ReactClientPath) process.env.REACT_CLIENT_PATH = devEnv.ReactClientPath
if (devEnv.InitUserName) process.env.INIT_USER_NAME = devEnv.InitUserName
if (devEnv.InitUserPassword) process.env.INIT_USER_PASSWORD = devEnv.InitUserPassword
process.env.SOURCE = 'local'
process.env.ROUTER_BASE_PATH = devEnv.RouterBasePath ?? '/audiobookshelf'
}

View File

@ -160,6 +160,9 @@ class Server {
// Create or set JWT secret in token manager
await this.auth.tokenManager.initTokenSecret()
// Auto-create root user if environment variables are set and no root user exists
await this.autoCreateRootUser()
await Logger.logManager.init()
await this.cleanUserData() // Remove invalid user item progress
@ -428,6 +431,30 @@ class Server {
SocketAuthority.initialize(this)
}
async autoCreateRootUser() {
if (!Database.hasRootUser && process.env.INIT_USER_NAME) {
const initUsername = process.env.INIT_USER_NAME
const initPassword = process.env.INIT_USER_PASSWORD || ''
Logger.info(`[Server] Auto-creating root user "${initUsername}" from environment variables`)
try {
const hashedPassword = initPassword ? await this.auth.localAuthStrategy.hashPassword(initPassword) : ''
if (!hashedPassword && initPassword) {
Logger.warn(`[Server] Failed to hash password for auto-created root user`)
} else if (!initPassword) {
Logger.warn(`[Server] Creating root user with no password`)
}
await Database.createRootUser(initUsername, hashedPassword, this.auth)
Logger.info(`[Server] Successfully auto-created root user "${initUsername}"`)
} catch (error) {
Logger.error(`[Server] Failed to auto-create root user:`, error)
}
}
}
async initializeServer(req, res) {
Logger.info(`[Server] Initializing new server`)
const newRoot = req.body.newRoot