From b9693780b9eab3f7e3362cdc1e2a512120af0492 Mon Sep 17 00:00:00 2001 From: Ben Allfree Date: Thu, 28 Dec 2023 04:35:00 -0800 Subject: [PATCH] Dev mode --- .../[instanceId]/settings/+page.svelte | 3 ++ .../[instanceId]/settings/DevMode.svelte | 47 +++++++++++++++++++ .../lander/content/docs/usage/dev-mode.md | 9 ++++ src/cli/mothership.ts | 1 + .../1703766144_updated_instances.js | 27 +++++++++++ .../pb_hooks/src/instances-update.pb.js | 5 +- src/services/InstanceService/index.ts | 1 + src/services/PocketBaseService/index.ts | 9 +++- src/shared/schema/Instance.ts | 1 + src/shared/schema/Rest/UpdateInstance.ts | 3 +- 10 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 frontends/dashboard/src/routes/app/instances/[instanceId]/settings/DevMode.svelte create mode 100644 frontends/lander/content/docs/usage/dev-mode.md create mode 100644 src/mothership-app/migrations/1703766144_updated_instances.js diff --git a/frontends/dashboard/src/routes/app/instances/[instanceId]/settings/+page.svelte b/frontends/dashboard/src/routes/app/instances/[instanceId]/settings/+page.svelte index 04623c01..466036db 100644 --- a/frontends/dashboard/src/routes/app/instances/[instanceId]/settings/+page.svelte +++ b/frontends/dashboard/src/routes/app/instances/[instanceId]/settings/+page.svelte @@ -4,6 +4,7 @@ import AdminSync from './AdminSync.svelte' import DangerZoneTitle from './DangerZoneTitle.svelte' import DeleteInstance from './DeleteInstance.svelte' + import DevMode from './DevMode.svelte' import Maintenance from './Maintenance.svelte' import RenameInstance from './RenameInstance.svelte' import VersionChange from './VersionChange/VersionChange.svelte' @@ -29,5 +30,7 @@ + + diff --git a/frontends/dashboard/src/routes/app/instances/[instanceId]/settings/DevMode.svelte b/frontends/dashboard/src/routes/app/instances/[instanceId]/settings/DevMode.svelte new file mode 100644 index 00000000..d57ffd0f --- /dev/null +++ b/frontends/dashboard/src/routes/app/instances/[instanceId]/settings/DevMode.svelte @@ -0,0 +1,47 @@ + + + + Dev Mode + +

+ Starting with PocketBase v0.20.1, your instance will show debugging output + in the instance logs. Performance is degraded while Dev Mode is active. +

+ + + + +
diff --git a/frontends/lander/content/docs/usage/dev-mode.md b/frontends/lander/content/docs/usage/dev-mode.md new file mode 100644 index 00000000..d0df79ac --- /dev/null +++ b/frontends/lander/content/docs/usage/dev-mode.md @@ -0,0 +1,9 @@ +--- +title: Dev Mode +category: usage +description: Dev Mode shows PocketBase debugging output to the instance logs +--- + +Begining with PocketBase 0.20.1, you may supply a `--dev` flag to make PocketBase output debugging information to the console. + +PocketHost supports this through the Dev Mode switch. When running in Dev Mode, your instance logs will show all debugging output. diff --git a/src/cli/mothership.ts b/src/cli/mothership.ts index 18ed322f..62869f11 100644 --- a/src/cli/mothership.ts +++ b/src/cli/mothership.ts @@ -58,6 +58,7 @@ global.EventSource = EventSource name: MOTHERSHIP_NAME(), slug: MOTHERSHIP_NAME(), port: MOTHERSHIP_PORT(), + dev: DEBUG(), env: { DATA_ROOT: mkContainerHomePath(`data`), }, diff --git a/src/mothership-app/migrations/1703766144_updated_instances.js b/src/mothership-app/migrations/1703766144_updated_instances.js new file mode 100644 index 00000000..c0ea48f6 --- /dev/null +++ b/src/mothership-app/migrations/1703766144_updated_instances.js @@ -0,0 +1,27 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("etae8tuiaxl6xfv") + + // add + collection.schema.addField(new SchemaField({ + "system": false, + "id": "a5qqq8fs", + "name": "dev", + "type": "bool", + "required": false, + "presentable": false, + "unique": false, + "options": {} + })) + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("etae8tuiaxl6xfv") + + // remove + collection.schema.removeField("a5qqq8fs") + + return dao.saveCollection(collection) +}) diff --git a/src/mothership-app/pb_hooks/src/instances-update.pb.js b/src/mothership-app/pb_hooks/src/instances-update.pb.js index 08fcfb66..7e97e5c4 100644 --- a/src/mothership-app/pb_hooks/src/instances-update.pb.js +++ b/src/mothership-app/pb_hooks/src/instances-update.pb.js @@ -23,6 +23,7 @@ routerAdd( version: null, secrets: null, syncAdmin: null, + dev: null, }, }) @@ -34,7 +35,7 @@ routerAdd( const id = c.pathParam('id') const { - fields: { subdomain, maintenance, version, secrets, syncAdmin }, + fields: { subdomain, maintenance, version, secrets, syncAdmin, dev }, } = data console.log( @@ -46,6 +47,7 @@ routerAdd( version, secrets, syncAdmin, + dev, }), ) @@ -78,6 +80,7 @@ routerAdd( maintenance, secrets, syncAdmin, + dev, }) const form = new RecordUpsertForm($app, record) diff --git a/src/services/InstanceService/index.ts b/src/services/InstanceService/index.ts index 3268423d..88c9127a 100644 --- a/src/services/InstanceService/index.ts +++ b/src/services/InstanceService/index.ts @@ -278,6 +278,7 @@ export const instanceService = mkSingleton( name: instance.subdomain, slug: instance.id, port: newPort, + dev: instance.dev, extraBinds: flatten([ globSync(join(INSTANCE_APP_MIGRATIONS_DIR(), '*.js')).map( (file) => diff --git a/src/services/PocketBaseService/index.ts b/src/services/PocketBaseService/index.ts index d876dc3f..42e4cc8f 100644 --- a/src/services/PocketBaseService/index.ts +++ b/src/services/PocketBaseService/index.ts @@ -16,6 +16,7 @@ import { map } from '@s-libs/micro-dash' import Docker, { Container, ContainerCreateOptions } from 'dockerode' import { existsSync } from 'fs' import MemoryStream from 'memorystream' +import { gte } from 'semver' import { AsyncReturnType } from 'type-fest' import { PocketbaseReleaseVersionService } from '../PocketbaseReleaseVersionService' import { buildImage } from './buildImage' @@ -30,6 +31,7 @@ export type SpawnConfig = { env?: Env stdout?: MemoryStream stderr?: MemoryStream + dev?: boolean } export type PocketbaseServiceApi = AsyncReturnType< typeof createPocketbaseService @@ -78,9 +80,11 @@ export const createPocketbaseService = async ( env: {}, stderr: new MemoryStream(), stdout: new MemoryStream(), + dev: false, ...cfg, } - const { version, name, slug, port, extraBinds, env, stderr, stdout } = _cfg + const { version, name, slug, port, extraBinds, env, stderr, stdout, dev } = + _cfg logger.breadcrumb(name).breadcrumb(slug) const iLogger = InstanceLogger(slug, 'exec') @@ -123,6 +127,9 @@ export const createPocketbaseService = async ( const Cmd = (() => { return [`./pocketbase`, `serve`, `--http`, `0.0.0.0:8090`] })() + if (dev && gte(realVersion.version, `0.20.1`)) { + Cmd.push(`--dev`) + } const createOptions: ContainerCreateOptions = { Image: INSTANCE_IMAGE_NAME, diff --git a/src/shared/schema/Instance.ts b/src/shared/schema/Instance.ts index 91aa5cef..1a3c2d84 100644 --- a/src/shared/schema/Instance.ts +++ b/src/shared/schema/Instance.ts @@ -29,6 +29,7 @@ export type InstanceFields = BaseFields & { maintenance: boolean syncAdmin: boolean cname: string + dev: boolean } export type WithUser = { diff --git a/src/shared/schema/Rest/UpdateInstance.ts b/src/shared/schema/Rest/UpdateInstance.ts index 7c6fa0ce..d7ca6ff6 100644 --- a/src/shared/schema/Rest/UpdateInstance.ts +++ b/src/shared/schema/Rest/UpdateInstance.ts @@ -7,7 +7,7 @@ export type UpdateInstancePayload = { fields: Partial< Pick< InstanceFields, - 'maintenance' | 'secrets' | 'subdomain' | 'syncAdmin' | 'version' + 'maintenance' | 'secrets' | 'subdomain' | 'syncAdmin' | 'version' | 'dev' > > } @@ -44,6 +44,7 @@ export const UpdateInstancePayloadSchema: JSONSchemaType }, required: [], }, + dev: { type: 'boolean', nullable: true }, }, }, },