86bdbe4c3d
* initial support for initial setup * improve setup * improve mobile view * move base admin route * admin panel mobile view * set initial host and port * add docs * properly setup everything, use for dev env * change userconfig and interface port on setup, note users afterwards
111 lines
3.0 KiB
TypeScript
111 lines
3.0 KiB
TypeScript
import { drizzle } from 'drizzle-orm/libsql';
|
|
import { migrate as drizzleMigrate } from 'drizzle-orm/libsql/migrator';
|
|
import { createClient } from '@libsql/client';
|
|
import debug from 'debug';
|
|
|
|
import * as schema from './schema';
|
|
import { ClientService } from './repositories/client/service';
|
|
import { GeneralService } from './repositories/general/service';
|
|
import { UserService } from './repositories/user/service';
|
|
import { UserConfigService } from './repositories/userConfig/service';
|
|
import { InterfaceService } from './repositories/interface/service';
|
|
import { HooksService } from './repositories/hooks/service';
|
|
import { OneTimeLinkService } from './repositories/oneTimeLink/service';
|
|
|
|
const DB_DEBUG = debug('Database');
|
|
|
|
const client = createClient({ url: 'file:/etc/wireguard/wg-easy.db' });
|
|
const db = drizzle({ client, schema });
|
|
|
|
export async function connect() {
|
|
await migrate();
|
|
const dbService = new DBService(db);
|
|
|
|
if (WG_INITIAL_ENV.ENABLED) {
|
|
await initialSetup(dbService);
|
|
}
|
|
|
|
return dbService;
|
|
}
|
|
|
|
class DBService {
|
|
clients: ClientService;
|
|
general: GeneralService;
|
|
users: UserService;
|
|
userConfigs: UserConfigService;
|
|
interfaces: InterfaceService;
|
|
hooks: HooksService;
|
|
oneTimeLinks: OneTimeLinkService;
|
|
|
|
constructor(db: DBType) {
|
|
this.clients = new ClientService(db);
|
|
this.general = new GeneralService(db);
|
|
this.users = new UserService(db);
|
|
this.userConfigs = new UserConfigService(db);
|
|
this.interfaces = new InterfaceService(db);
|
|
this.hooks = new HooksService(db);
|
|
this.oneTimeLinks = new OneTimeLinkService(db);
|
|
}
|
|
}
|
|
|
|
export type DBType = typeof db;
|
|
export type DBServiceType = DBService;
|
|
|
|
async function migrate() {
|
|
try {
|
|
DB_DEBUG('Migrating database...');
|
|
await drizzleMigrate(db, {
|
|
migrationsFolder: './server/database/migrations',
|
|
});
|
|
DB_DEBUG('Migration complete');
|
|
} catch (e) {
|
|
if (e instanceof Error) {
|
|
DB_DEBUG('Failed to migrate database:', e.message);
|
|
}
|
|
}
|
|
}
|
|
|
|
async function initialSetup(db: DBServiceType) {
|
|
const setup = await db.general.getSetupStep();
|
|
|
|
if (setup.done) {
|
|
DB_DEBUG('Setup already done. Skiping initial setup.');
|
|
return;
|
|
}
|
|
|
|
if (WG_INITIAL_ENV.IPV4_CIDR && WG_INITIAL_ENV.IPV6_CIDR) {
|
|
DB_DEBUG('Setting initial CIDR...');
|
|
await db.interfaces.updateCidr({
|
|
ipv4Cidr: WG_INITIAL_ENV.IPV4_CIDR,
|
|
ipv6Cidr: WG_INITIAL_ENV.IPV6_CIDR,
|
|
});
|
|
}
|
|
|
|
if (WG_INITIAL_ENV.DNS) {
|
|
DB_DEBUG('Setting initial DNS...');
|
|
const userConfig = await db.userConfigs.get();
|
|
await db.userConfigs.update({
|
|
...userConfig,
|
|
defaultDns: WG_INITIAL_ENV.DNS,
|
|
});
|
|
}
|
|
|
|
if (
|
|
WG_INITIAL_ENV.USERNAME &&
|
|
WG_INITIAL_ENV.PASSWORD &&
|
|
WG_INITIAL_ENV.HOST &&
|
|
WG_INITIAL_ENV.PORT
|
|
) {
|
|
DB_DEBUG('Creating initial user...');
|
|
await db.users.create(WG_INITIAL_ENV.USERNAME, WG_INITIAL_ENV.PASSWORD);
|
|
|
|
DB_DEBUG('Setting initial host and port...');
|
|
await db.userConfigs.updateHostPort(
|
|
WG_INITIAL_ENV.HOST,
|
|
WG_INITIAL_ENV.PORT
|
|
);
|
|
|
|
await db.general.setSetupStep(0);
|
|
}
|
|
}
|