fix: pct create fails with malformed arguments (#423) (#427)

- Fix NS/MTU/MAC/VLAN/SD variables missing proper prefixes in base_settings()
  Variables were passed as raw values instead of formatted pct options
  (e.g., '192.168.1.1' instead of '-nameserver=192.168.1.1')

- Strip spaces from nameserver values to prevent 'too many arguments' error
  Multiple DNS servers must be comma-separated without spaces

- Auto-create database directory before Prisma initialization
  Fixes 'Cannot open database because directory does not exist' error
  for manual Git installations
This commit is contained in:
CanbiZ (MickLesk)
2026-01-07 20:50:51 +01:00
committed by GitHub
parent 849aabb575
commit 2ba213de49
3 changed files with 39 additions and 7 deletions

View File

@@ -517,11 +517,16 @@ base_settings() {
fi fi
fi fi
MTU=${var_mtu:-""} # Format optional network variables with proper prefixes for pct create
SD=${var_storage:-""} # Also strip any spaces from nameserver values (multiple IPs must be comma-separated without spaces)
NS=${var_ns:-""} local _ns_clean="${var_ns:-}"
MAC=${var_mac:-""} _ns_clean="${_ns_clean// /}" # Remove all spaces from nameserver value
VLAN=${var_vlan:-""}
[[ -n "${var_mtu:-}" ]] && MTU=",mtu=${var_mtu}" || MTU=""
[[ -n "${var_searchdomain:-}" ]] && SD="-searchdomain=${var_searchdomain}" || SD=""
[[ -n "$_ns_clean" ]] && NS="-nameserver=${_ns_clean}" || NS=""
[[ -n "${var_mac:-}" ]] && MAC=",hwaddr=${var_mac}" || MAC=""
[[ -n "${var_vlan:-}" ]] && VLAN=",tag=${var_vlan}" || VLAN=""
SSH=${var_ssh:-"no"} SSH=${var_ssh:-"no"}
SSH_AUTHORIZED_KEY=${var_ssh_authorized_key:-""} SSH_AUTHORIZED_KEY=${var_ssh_authorized_key:-""}
UDHCPC_FIX=${var_udhcpc_fix:-""} UDHCPC_FIX=${var_udhcpc_fix:-""}
@@ -2023,10 +2028,11 @@ Advanced:
var_apt_cacher="$_apt_cacher" var_apt_cacher="$_apt_cacher"
var_apt_cacher_ip="$_apt_cacher_ip" var_apt_cacher_ip="$_apt_cacher_ip"
# Format optional values # Format optional values (strip spaces from nameserver - multiple IPs must be comma-separated without spaces)
local _ns_clean="${_ns// /}"
[[ -n "$_mtu" ]] && MTU=",mtu=$_mtu" || MTU="" [[ -n "$_mtu" ]] && MTU=",mtu=$_mtu" || MTU=""
[[ -n "$_sd" ]] && SD="-searchdomain=$_sd" || SD="" [[ -n "$_sd" ]] && SD="-searchdomain=$_sd" || SD=""
[[ -n "$_ns" ]] && NS="-nameserver=$_ns" || NS="" [[ -n "$_ns_clean" ]] && NS="-nameserver=$_ns_clean" || NS=""
[[ -n "$_mac" ]] && MAC=",hwaddr=$_mac" || MAC="" [[ -n "$_mac" ]] && MAC=",hwaddr=$_mac" || MAC=""
[[ -n "$_vlan" ]] && VLAN=",tag=$_vlan" || VLAN="" [[ -n "$_vlan" ]] && VLAN=",tag=$_vlan" || VLAN=""

View File

@@ -1,9 +1,22 @@
import 'dotenv/config' import 'dotenv/config'
import { PrismaClient } from '../../prisma/generated/prisma/client.ts' import { PrismaClient } from '../../prisma/generated/prisma/client.ts'
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3' import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'
import { existsSync, mkdirSync } from 'fs'
import { dirname } from 'path'
const globalForPrisma = globalThis; const globalForPrisma = globalThis;
// Ensure database directory exists before initializing Prisma
// DATABASE_URL format: file:/path/to/database.db
const dbUrl = process.env.DATABASE_URL || 'file:./data/settings.db';
const dbPath = dbUrl.replace(/^file:/, '');
const dbDir = dirname(dbPath);
if (!existsSync(dbDir)) {
console.log(`Creating database directory: ${dbDir}`);
mkdirSync(dbDir, { recursive: true });
}
const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL }); const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL });
export const prisma = globalForPrisma.prisma ?? new PrismaClient({ adapter }); export const prisma = globalForPrisma.prisma ?? new PrismaClient({ adapter });

View File

@@ -1,9 +1,22 @@
import 'dotenv/config' import 'dotenv/config'
import { PrismaClient } from '../../prisma/generated/prisma/client' import { PrismaClient } from '../../prisma/generated/prisma/client'
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3' import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'
import { existsSync, mkdirSync } from 'fs'
import { dirname } from 'path'
const globalForPrisma = globalThis as { prisma?: PrismaClient }; const globalForPrisma = globalThis as { prisma?: PrismaClient };
// Ensure database directory exists before initializing Prisma
// DATABASE_URL format: file:/path/to/database.db
const dbUrl = process.env.DATABASE_URL || 'file:./data/settings.db';
const dbPath = dbUrl.replace(/^file:/, '');
const dbDir = dirname(dbPath);
if (!existsSync(dbDir)) {
console.log(`Creating database directory: ${dbDir}`);
mkdirSync(dbDir, { recursive: true });
}
const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL! }); const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL! });
export const prisma: PrismaClient = globalForPrisma.prisma ?? new PrismaClient({ export const prisma: PrismaClient = globalForPrisma.prisma ?? new PrismaClient({