Merge branch 'v0/main' of github.com:benallfree/pockethost into v0/main

This commit is contained in:
Ben Allfree 2024-07-30 13:59:01 +00:00
commit 96ab243d1c
12 changed files with 157 additions and 35 deletions

View File

@ -110,5 +110,10 @@
"tsx": "^3.14.0",
"type-fest": "^4.6.0",
"typescript": "^5.2.2"
},
"pnpm": {
"patchedDependencies": {
"eventsource@2.0.2": "patches/eventsource@2.0.2.patch"
}
}
}

View File

@ -20,7 +20,6 @@
},
"dependencies": {
"@dotenvx/dotenvx": "^0.44.1",
"pockethost": "workspace:../pockethost",
"@pockethost/plugin-console-logger": "workspace:../plugin-console-logger",
"@s-libs/micro-dash": "^16.1.0",
"@types/node-os-utils": "^1.3.4",
@ -28,6 +27,7 @@
"ajv": "^8.12.0",
"boolean": "^3.2.0",
"bottleneck": "^2.19.5",
"chalk": "^5.3.0",
"commander": "^11.1.0",
"cors": "^2.8.5",
"decompress": "^4.2.1",
@ -35,6 +35,7 @@
"devcert": "^1.2.2",
"dockerode": "^3.3.5",
"env-paths": "^3.0.0",
"env-var": "^7.5.0",
"event-source-polyfill": "^1.0.31",
"eventsource": "^2.0.2",
"exit-hook": "^4.0.0",
@ -44,15 +45,18 @@
"ftp-srv": "github:pockethost/ftp-srv#0fc708bae0d5d7a55ce948767f082d6fcfb2af59",
"get-port": "^6.1.2",
"glob": "^10.3.10",
"gobot": "1.0.0-alpha.40",
"gobot": "1.0.0-alpha.41",
"gobot-pocketbase": "0.22.8-alpha.22",
"http-proxy": "^1.18.1",
"http-proxy-middleware": "^2.0.6",
"ip-cidr": "^3.1.0",
"json-stringify-safe": "^5.0.1",
"knex": "^2.5.1",
"memorystream": "^0.3.1",
"nanoid": "^5.0.2",
"node-fetch": "^3.3.2",
"node-os-utils": "^1.3.7",
"pocketbase": "^0.21.3",
"rimraf": "^5.0.5",
"semver": "^7.5.4",
"sqlite3": "^5.1.6",
@ -62,14 +66,9 @@
"url-pattern": "^1.0.3",
"vhost": "^3.0.2",
"winston": "^3.11.0",
"winston-syslog": "^2.7.0",
"chalk": "^5.3.0",
"json-stringify-safe": "^5.0.1",
"nanoid": "^5.0.2",
"pocketbase": "^0.21.3"
"winston-syslog": "^2.7.0"
},
"devDependencies": {
"@types/json-stringify-safe": "^5.0.2",
"@types/cors": "^2.8.17",
"@types/d3-scale": "^4.0.6",
"@types/d3-scale-chromatic": "^3.0.1",
@ -82,6 +81,7 @@
"@types/inquirer": "^9.0.7",
"@types/js-cookie": "^3.0.5",
"@types/js-yaml": "^4.0.9",
"@types/json-stringify-safe": "^5.0.2",
"@types/memorystream": "^0.3.3",
"@types/ncp": "^2.0.8",
"@types/node": "^20.8.10",

View File

@ -1,5 +1,5 @@
import copyfiles from 'copyfiles'
import { GobotOptions, gobot } from 'gobot'
import { GobotOptions } from 'gobot'
import { rimraf } from 'rimraf'
import {
DEBUG,
@ -14,6 +14,7 @@ import {
mkContainerHomePath,
} from '../../../../../core'
import { PortService } from '../../../../services'
import { GobotService } from '../../../../services/GobotService'
export type MothershipConfig = { isolate: boolean }
@ -85,6 +86,7 @@ export async function mothership(cfg: MothershipConfig) {
}
dbg(`args`, args)
dbg(`options`, options)
const { gobot } = GobotService()
const bot = await gobot(`pocketbase`, options)
bot.run(args, { env })
}

View File

@ -11,6 +11,7 @@ import {
SETTINGS,
loadPlugins,
} from '../../core'
import { GobotService } from '../services/GobotService'
import { EdgeCommand } from './commands/EdgeCommand'
import { FirewallCommand } from './commands/FirewallCommand'
import { HealthCommand } from './commands/HealthCommand'
@ -26,6 +27,7 @@ export type GlobalOptions = {
DefaultSettingsService(SETTINGS)
LoggerService({ level: DEBUG() ? LogLevelName.Debug : LogLevelName.Info })
GobotService({})
//@ts-ignore
global.EventSource = EventSource

View File

@ -1,6 +1,7 @@
import { forEach } from '@s-libs/micro-dash'
import devcert from 'devcert'
import envPaths from 'env-paths'
import * as env from 'env-var'
import { mkdirSync, realpathSync, writeFileSync } from 'fs'
import { dirname, join } from 'path'
import { fileURLToPath } from 'url'
@ -26,27 +27,44 @@ const __dirname = dirname(fileURLToPath(import.meta.url))
const realScriptPath = realpathSync(process.argv[1]!)
export const _PH_HOME = process.env.PH_HOME || envPaths(`pockethost`).data
export const _PH_HOME = env
.get('PH_HOME')
.default(envPaths(`pockethost`).data)
.asString()
export const _SSL_HOME = join(_PH_HOME, `ssl`)
export const _IS_DEV = process.env.NODE_ENV === 'development'
export const _PH_PROJECT_ROOT = join(__dirname, '..')
export const _APEX_DOMAIN = process.env.APEX_DOMAIN || 'pockethost.lvh.me'
export const _HTTP_PROTOCOL = process.env.HTTP_PROTOCOL || `https:`
export const _APP_NAME = process.env.APP_NAME || 'app'
export const _MOTHERSHIP_NAME =
process.env.MOTHERSHIP_NAME || 'pockethost-central'
export const _APEX_DOMAIN = env
.get('APEX_DOMAIN')
.default('pockethost.lvh.me')
.asString()
export const _HTTP_PROTOCOL = env
.get('HTTP_PROTOCOL')
.default('https:')
.asString()
export const _APP_NAME = env.get('APP_NAME').default('app').asString()
export const _MOTHERSHIP_NAME = env
.get('MOTHERSHIP_NAME')
.default('pockethost-central')
.asString()
export const _MOTHERSHIP_APP_ROOT = (...paths: string[]) =>
join(
process.env.PH_MOTHERSHIP_APP_ROOT || join(__dirname, 'mothership-app'),
env
.get('PH_MOTHERSHIP_APP_ROOT')
.default(join(__dirname, 'mothership-app'))
.asString(),
...paths,
)
export const _INSTANCE_APP_ROOT = (...paths: string[]) =>
join(
process.env.PH_INSTANCE_APP_ROOT || join(__dirname, 'instance-app'),
env
.get('PH_INSTANCE_APP_ROOT')
.default(join(__dirname, 'instance-app'))
.asString(),
...paths,
)
@ -131,6 +149,8 @@ export const SETTINGS = {
DISCORD_HEALTH_CHANNEL_URL: mkString(''),
DOCKER_CONTAINER_HOST: mkString(`host.docker.internal`),
PH_GOBOT_ROOT: mkPath(join(_PH_HOME, 'gobot'), { create: true }),
}
export type Settings = ReturnType<typeof DefaultSettingsService>
@ -260,6 +280,9 @@ export const DISCORD_HEALTH_CHANNEL_URL = () =>
export const DOCKER_CONTAINER_HOST = () => settings().DOCKER_CONTAINER_HOST
export const PH_GOBOT_ROOT = (...paths: string[]) =>
join(settings().PH_GOBOT_ROOT, ...paths)
/** Helpers */
export const MOTHERSHIP_DATA_ROOT = (...paths: string[]) =>

View File

@ -1,23 +1,23 @@
import { ioc } from '.'
import { DEBUG } from '.'
import { discordAlert } from './discordAlert'
import { gracefulExit } from './exit'
;['unhandledRejection', 'uncaughtException'].forEach((type) => {
process.on(type, (e) => {
console.error(e)
console.error(`Unhandled:`, e)
try {
discordAlert(e)
} catch (e) {
console.error(e)
console.error(`Failed to alert Discord:`, e)
}
const debug = (() => {
try {
return ioc.service('settings').DEBUG
return DEBUG()
} catch {
return true
}
})()
if (debug) {
console.error(e.stack)
console.error(`Unhandled debug trace:`, e.stack)
gracefulExit()
}
})

View File

@ -2,10 +2,12 @@ import fetch, { Response } from 'node-fetch'
import { LoggerService } from '../common'
export const TRYFETCH_RETRY_MS = 50
export const TRYFETCH_TIMEOUT_MS = 500
export type TryFetchConfig = {
preflight: () => Promise<boolean>
retryMs: number
timeoutMs: number
}
/**
@ -25,9 +27,10 @@ export const tryFetch = async (
url: string,
config?: Partial<TryFetchConfig>,
) => {
const { preflight, retryMs }: TryFetchConfig = {
const { preflight, retryMs, timeoutMs }: TryFetchConfig = {
preflight: async () => true,
retryMs: TRYFETCH_RETRY_MS,
timeoutMs: TRYFETCH_TIMEOUT_MS,
...config,
}
const logger = LoggerService().create(`tryFetch`).breadcrumb(url)
@ -53,7 +56,7 @@ export const tryFetch = async (
}
try {
dbg(`Fetch: START`)
const res = await fetch(url, { signal: AbortSignal.timeout(500) })
const res = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) })
dbg(`Fetch: SUCCESS`)
resolve(res)
} catch (e) {

View File

@ -0,0 +1,10 @@
import { GobotOptions, gobot } from 'gobot'
import { mkSingleton } from '../common'
import { PH_GOBOT_ROOT } from '../constants'
export const GobotService = mkSingleton(() => {
return {
gobot: (name: string, options?: Partial<GobotOptions>) =>
gobot(name, { ...options, cachePath: PH_GOBOT_ROOT(`cache`, name) }),
}
})

View File

@ -1,7 +1,6 @@
import { map } from '@s-libs/micro-dash'
import Docker, { Container, ContainerCreateOptions } from 'dockerode'
import { existsSync } from 'fs'
import { gobot } from 'gobot'
import MemoryStream from 'memorystream'
import { gte } from 'semver'
import { EventEmitter } from 'stream'
@ -21,6 +20,7 @@ import {
mkSingleton,
tryFetch,
} from '../../../core'
import { GobotService } from '../GobotService'
import { PortService } from '../PortService'
export type Env = { [_: string]: string }
@ -47,7 +47,7 @@ export type PocketbaseProcess = {
exitCode: Promise<number>
}
const INSTANCE_IMAGE_NAME = `pockethost-instance`
const INSTANCE_IMAGE_NAME = `benallfree/pockethost-instance`
export const createPocketbaseService = async (
config: PocketbaseServiceConfig,
@ -55,6 +55,7 @@ export const createPocketbaseService = async (
const _serviceLogger = LoggerService().create('PocketbaseService')
const { dbg, error, warn, abort } = _serviceLogger
const { gobot } = GobotService()
const bot = await gobot(`pocketbase`, { os: 'linux' })
const maxVersion = (await bot.versions())[0]
if (!maxVersion) {

View File

@ -0,0 +1,22 @@
diff --git a/lib/eventsource.js b/lib/eventsource.js
index bd401a106c16ca1f5aa6a965db51d9a38f10a1c6..a271b2d391df5a62ccf5d4e69e81afe1fa36c704 100644
--- a/lib/eventsource.js
+++ b/lib/eventsource.js
@@ -87,7 +87,7 @@ function EventSource (url, eventSourceInitDict) {
var reconnectUrl = null
function connect () {
- var options = parse(url)
+ var options = new URL(url)
var isSecure = options.protocol === 'https:'
options.headers = { 'Cache-Control': 'no-cache', 'Accept': 'text/event-stream' }
if (lastEventId) options.headers['Last-Event-ID'] = lastEventId
@@ -113,7 +113,7 @@ function EventSource (url, eventSourceInitDict) {
// and include the original url in path and Host headers
var useProxy = eventSourceInitDict && eventSourceInitDict.proxy
if (useProxy) {
- var proxy = parse(eventSourceInitDict.proxy)
+ var proxy = new URL(eventSourceInitDict.proxy)
isSecure = proxy.protocol === 'https:'
options.protocol = isSecure ? 'https:' : 'http:'

71
pnpm-lock.yaml generated
View File

@ -4,6 +4,11 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
patchedDependencies:
eventsource@2.0.2:
hash: tygaxpd33h24mrpcadqkqji6vy
path: patches/eventsource@2.0.2.patch
importers:
.:
@ -384,12 +389,15 @@ importers:
env-paths:
specifier: ^3.0.0
version: 3.0.0
env-var:
specifier: ^7.5.0
version: 7.5.0
event-source-polyfill:
specifier: ^1.0.31
version: 1.0.31
eventsource:
specifier: ^2.0.2
version: 2.0.2
version: 2.0.2(patch_hash=tygaxpd33h24mrpcadqkqji6vy)
exit-hook:
specifier: ^4.0.0
version: 4.0.0
@ -412,8 +420,8 @@ importers:
specifier: ^10.3.10
version: 10.3.10
gobot:
specifier: 1.0.0-alpha.40
version: 1.0.0-alpha.40
specifier: 1.0.0-alpha.41
version: 1.0.0-alpha.41
gobot-pocketbase:
specifier: 0.22.8-alpha.22
version: 0.22.8-alpha.22
@ -447,9 +455,6 @@ importers:
pocketbase:
specifier: ^0.21.3
version: 0.21.3
pockethost:
specifier: workspace:../pockethost
version: 'link:'
rimraf:
specifier: ^5.0.5
version: 5.0.5
@ -1774,10 +1779,12 @@ packages:
are-we-there-yet@2.0.0:
resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
engines: {node: '>=10'}
deprecated: This package is no longer supported.
are-we-there-yet@3.0.1:
resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
deprecated: This package is no longer supported.
arg@5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
@ -2770,6 +2777,10 @@ packages:
resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
env-var@7.5.0:
resolution: {integrity: sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA==}
engines: {node: '>=10'}
eol@0.9.1:
resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==}
@ -3186,10 +3197,12 @@ packages:
gauge@3.0.2:
resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
engines: {node: '>=10'}
deprecated: This package is no longer supported.
gauge@4.0.4:
resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
deprecated: This package is no longer supported.
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
@ -3279,6 +3292,7 @@ packages:
glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Glob versions prior to v9 are no longer supported
global-directory@4.0.1:
resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
@ -3326,6 +3340,10 @@ packages:
resolution: {integrity: sha512-bV+QO3VZamsnKLH5Pqt0tFZ2CD90JT2QjQIs6tvMP1H2w8QJApbRPVkpJ4O56nXGgyj6f0udelDrsd4tm1F6CQ==}
hasBin: true
gobot@1.0.0-alpha.41:
resolution: {integrity: sha512-AXXCqWZHt3pcHnTtb+74M95mI12jMNuy7wzZyQcnwQY6mRUzrUJlzUlrlFcqfc7vklet2Dm9CECs17VPdK0BjA==}
hasBin: true
gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
@ -3548,6 +3566,7 @@ packages:
inflight@1.0.6:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
@ -4582,10 +4601,12 @@ packages:
npmlog@5.0.1:
resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
deprecated: This package is no longer supported.
npmlog@6.0.2:
resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
deprecated: This package is no longer supported.
nunjucks@3.2.4:
resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==}
@ -5265,6 +5286,7 @@ packages:
rimraf@2.7.1:
resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
rimraf@3.0.2:
@ -8461,7 +8483,7 @@ snapshots:
decompress-tar: 4.1.1
decompress-tarbz2: 4.1.1
decompress-targz: 4.1.1
decompress-unzip: https://codeload.github.com/pockethost/decompress-unzip/tar.gz/6ef397b9a2df11d39c7b26ce779e123833844751
decompress-unzip: 4.0.1
graceful-fs: 4.2.11
make-dir: 1.3.0
pify: 2.3.0
@ -8703,6 +8725,8 @@ snapshots:
env-paths@3.0.0: {}
env-var@7.5.0: {}
eol@0.9.1: {}
err-code@2.0.3:
@ -8882,7 +8906,7 @@ snapshots:
eventemitter3@4.0.7: {}
eventsource@2.0.2: {}
eventsource@2.0.2(patch_hash=tygaxpd33h24mrpcadqkqji6vy): {}
execa@0.7.0:
dependencies:
@ -9415,7 +9439,7 @@ snapshots:
gobot-pocketbase@0.22.8-alpha.22:
dependencies:
gobot: 1.0.0-alpha.40
gobot: 1.0.0-alpha.41
gobot@1.0.0-alpha.40:
dependencies:
@ -9446,6 +9470,35 @@ snapshots:
tmp: 0.2.3
unbzip2-stream: 1.4.3
gobot@1.0.0-alpha.41:
dependencies:
'@s-libs/micro-dash': 17.1.0
bottleneck: 2.19.5
commander: 12.1.0
decompress: 4.2.1
decompress-bzip2: 4.0.0
decompress-gz: 0.0.1
decompress-tar: 4.1.1
decompress-tarbz2: 4.1.1
decompress-targz: 4.1.1
decompress-unzip: 4.0.1
env-paths: 3.0.0
fast-safe-stringify: 2.1.1
file-type: 19.0.0
find-up: 7.0.0
glob: 10.3.10
is-stream: 4.0.1
json-stringify-safe: 5.0.1
lzma-native: 8.0.6
markdown-table: 3.0.3
node-fetch: 3.3.2
rimraf: 5.0.5
semver: 7.6.2
table: 6.8.2
tar-stream: 1.6.2
tmp: 0.2.3
unbzip2-stream: 1.4.3
gopd@1.0.1:
dependencies:
get-intrinsic: 1.2.2

View File

@ -37,3 +37,4 @@ git clone git@github.com:pockethost/pockethost.git
cd pockethost
nvm install
npm i -g pnpm pm2
pnpm i