Merge pull request #1329 from Budibase/single-stack-dev
Single stack dev
This commit is contained in:
commit
43a2e8ba10
|
@ -61,9 +61,6 @@ services:
|
|||
container_name: budi-redis-dev
|
||||
restart: always
|
||||
image: redis
|
||||
environment:
|
||||
- COUCHDB_PASSWORD=${COUCH_DB_PASSWORD}
|
||||
- COUCHDB_USER=${COUCH_DB_USER}
|
||||
ports:
|
||||
- "${REDIS_PORT}:6379"
|
||||
volumes:
|
||||
|
|
|
@ -98,9 +98,19 @@ services:
|
|||
depends_on:
|
||||
- couchdb-service
|
||||
command: ["sh","-c","sleep 10 && $${PUT_CALL}/_users && $${PUT_CALL}/_replicator; fg;"]
|
||||
|
||||
redis-service:
|
||||
restart: always
|
||||
image: redis
|
||||
ports:
|
||||
- "${REDIS_PORT}:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
|
||||
volumes:
|
||||
couchdb_data:
|
||||
driver: local
|
||||
minio_data:
|
||||
driver: local
|
||||
redis_data:
|
||||
driver: local
|
||||
|
|
|
@ -36,6 +36,11 @@ static_resources:
|
|||
cluster: worker-service
|
||||
prefix_rewrite: "/"
|
||||
|
||||
- match: { prefix: "/cache/" }
|
||||
route:
|
||||
cluster: redis-service
|
||||
prefix_rewrite: "/"
|
||||
|
||||
- match: { prefix: "/db/" }
|
||||
route:
|
||||
cluster: couchdb-service
|
||||
|
@ -107,3 +112,18 @@ static_resources:
|
|||
address: couchdb-service
|
||||
port_value: 5984
|
||||
|
||||
- name: redis-service
|
||||
connect_timeout: 0.25s
|
||||
type: strict_dns
|
||||
lb_policy: round_robin
|
||||
load_assignment:
|
||||
cluster_name: redis-service
|
||||
endpoints:
|
||||
- lb_endpoints:
|
||||
- endpoint:
|
||||
address:
|
||||
socket_address:
|
||||
address: redis-service
|
||||
port_value: 6379
|
||||
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
"video": true,
|
||||
"projectId": "bmbemn",
|
||||
"env": {
|
||||
"PORT": "4001"
|
||||
"PORT": "4001",
|
||||
"JWT_SECRET": "test"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,25 +1,26 @@
|
|||
// What this script does:
|
||||
// 1. Removes the old test folder if it exists (.budibase)
|
||||
// 2. Initialises using `.budibase`
|
||||
// 3. Runs the server using said folder
|
||||
|
||||
const { join, resolve } = require("path")
|
||||
const initialiseBudibase = require("../../server/src/utilities/initialiseBudibase")
|
||||
const cypressConfig = require("../cypress.json")
|
||||
const path = require("path")
|
||||
|
||||
const homedir = join(require("os").homedir(), ".budibase")
|
||||
const tmpdir = path.join(require("os").tmpdir(), ".budibase")
|
||||
|
||||
process.env.BUDIBASE_API_KEY = "6BE826CB-6B30-4AEC-8777-2E90464633DE"
|
||||
process.env.NODE_ENV = "cypress"
|
||||
process.env.ENABLE_ANALYTICS = "false"
|
||||
process.env.PORT = cypressConfig.env.PORT
|
||||
process.env.JWT_SECRET = cypressConfig.env.JWT_SECRET
|
||||
process.env.COUCH_URL = `leveldb://${tmpdir}/.data/`
|
||||
process.env.SELF_HOSTED = 1
|
||||
process.env.MINIO_URL = "http://localhost:10000/"
|
||||
process.env.MINIO_ACCESS_KEY = "budibase"
|
||||
process.env.MINIO_SECRET_KEY = "budibase"
|
||||
process.env.COUCH_DB_USER = "budibase"
|
||||
process.env.COUCH_DB_PASSWORD = "budibase"
|
||||
|
||||
// Stop info logs polluting test outputs
|
||||
process.env.LOG_LEVEL = "error"
|
||||
|
||||
async function run(dir) {
|
||||
process.env.BUDIBASE_DIR = resolve(dir)
|
||||
require("dotenv").config({ path: resolve(dir, ".env") })
|
||||
async function run() {
|
||||
// require("dotenv").config({ path: resolve(dir, ".env") })
|
||||
|
||||
// dont make this a variable or top level require
|
||||
// it will cause environment module to be loaded prematurely
|
||||
|
@ -27,12 +28,15 @@ async function run(dir) {
|
|||
server.on("close", () => console.log("Server Closed"))
|
||||
}
|
||||
|
||||
initialiseBudibase({ dir: homedir, clientId: "cypress-test" })
|
||||
.then(() => {
|
||||
delete require.cache[require.resolve("../../server/src/environment")]
|
||||
const xPlatHomeDir = homedir.startsWith("~")
|
||||
? join(homedir(), homedir.substring(1))
|
||||
: homedir
|
||||
run(xPlatHomeDir)
|
||||
})
|
||||
.catch(e => console.error(e))
|
||||
run()
|
||||
|
||||
// TODO: ensure that this still works
|
||||
// initialiseBudibase({ dir: homedir, clientId: "cypress-test" })
|
||||
// .then(() => {
|
||||
// delete require.cache[require.resolve("../../server/src/environment")]
|
||||
// const xPlatHomeDir = homedir.startsWith("~")
|
||||
// ? join(homedir(), homedir.substring(1))
|
||||
// : homedir
|
||||
// run(xPlatHomeDir)
|
||||
// })
|
||||
// .catch(e => console.error(e))
|
||||
|
|
|
@ -65,6 +65,7 @@
|
|||
"!src/db/tests/**/*",
|
||||
"!src/tests/**/*",
|
||||
"!src/automations/tests/**/*",
|
||||
"!src/utilities/fileProcessor.js",
|
||||
"!src/utilities/fileSystem/**/*"
|
||||
],
|
||||
"coverageReporters": [
|
||||
|
|
|
@ -16,17 +16,6 @@ const Commands = {
|
|||
Nuke: "nuke",
|
||||
}
|
||||
|
||||
const managementCommand = process.argv.slice(2)[0]
|
||||
|
||||
if (
|
||||
!managementCommand ||
|
||||
!Object.values(Commands).some(command => managementCommand === command)
|
||||
) {
|
||||
throw new Error(
|
||||
"You must supply either an 'up' or 'down' commmand to manage the budibase dev env."
|
||||
)
|
||||
}
|
||||
|
||||
async function init() {
|
||||
const envFilePath = path.join(process.cwd(), ".env")
|
||||
if (fs.existsSync(envFilePath)) {
|
||||
|
@ -54,31 +43,30 @@ async function init() {
|
|||
async function up() {
|
||||
console.log("Spinning up your budibase dev environment... 🔧✨")
|
||||
await init()
|
||||
try {
|
||||
await compose.upAll(CONFIG)
|
||||
} catch (err) {
|
||||
console.log("Something went wrong:", err.message)
|
||||
}
|
||||
await compose.upAll(CONFIG)
|
||||
}
|
||||
|
||||
async function down() {
|
||||
console.log("Spinning down your budibase dev environment... 🌇")
|
||||
try {
|
||||
await compose.stop(CONFIG)
|
||||
} catch (err) {
|
||||
console.log("Something went wrong:", err.message)
|
||||
}
|
||||
await compose.stop(CONFIG)
|
||||
}
|
||||
|
||||
async function nuke() {
|
||||
console.log(
|
||||
"Clearing down your budibase dev environment, including all containers and volumes... 💥"
|
||||
)
|
||||
try {
|
||||
await compose.down(CONFIG)
|
||||
} catch (err) {
|
||||
console.log("Something went wrong:", err.message)
|
||||
}
|
||||
await compose.down(CONFIG)
|
||||
}
|
||||
|
||||
const managementCommand = process.argv.slice(2)[0]
|
||||
|
||||
if (
|
||||
!managementCommand ||
|
||||
!Object.values(Commands).some(command => managementCommand === command)
|
||||
) {
|
||||
throw new Error(
|
||||
"You must supply either an 'up', 'down' or 'nuke' commmand to manage the budibase development environment."
|
||||
)
|
||||
}
|
||||
|
||||
let command
|
||||
|
@ -100,6 +88,9 @@ command()
|
|||
.then(() => {
|
||||
console.log("Done! 🎉")
|
||||
})
|
||||
.catch(() => {
|
||||
console.log("Error while managing budibase dev environment.")
|
||||
.catch(err => {
|
||||
console.error(
|
||||
"Something went wrong while managing budibase dev environment:",
|
||||
err.message
|
||||
)
|
||||
})
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
// const { join } = require("path")
|
||||
// const { homedir } = require("os")
|
||||
|
||||
// // const initialiseBudibase = require("../src/utilities/initialiseBudibase")
|
||||
// // const DIRECTORY = "~/.budibase"
|
||||
|
||||
// function run() {
|
||||
// let opts = {}
|
||||
// // let dir = DIRECTORY
|
||||
// opts.quiet = true
|
||||
// // opts.dir = dir.startsWith("~") ? join(homedir(), dir.substring(1)) : dir
|
||||
// return initialiseBudibase(opts)
|
||||
// }
|
||||
|
||||
// run().then(() => {
|
||||
// console.log("Init complete.")
|
||||
// })
|
|
@ -1,10 +1,10 @@
|
|||
const Router = require("@koa/router")
|
||||
const controller = require("../controllers/static")
|
||||
const { budibaseTempDir } = require("../../utilities/budibaseDir")
|
||||
const env = require("../../environment")
|
||||
const authorized = require("../../middleware/authorized")
|
||||
const { BUILDER } = require("../../utilities/security/permissions")
|
||||
const usage = require("../../middleware/usageQuota")
|
||||
const env = require("../../environment")
|
||||
|
||||
const router = Router()
|
||||
|
||||
|
|
|
@ -1,106 +1,112 @@
|
|||
const { app, BrowserWindow, shell, dialog } = require("electron")
|
||||
const { join } = require("./utilities/centralPath")
|
||||
const isDev = require("electron-is-dev")
|
||||
const { autoUpdater } = require("electron-updater")
|
||||
const unhandled = require("electron-unhandled")
|
||||
const { existsSync } = require("fs-extra")
|
||||
const initialiseBudibase = require("./utilities/initialiseBudibase")
|
||||
const { budibaseAppsDir } = require("./utilities/budibaseDir")
|
||||
const { openNewGitHubIssue, debugInfo } = require("electron-util")
|
||||
const eventEmitter = require("./events")
|
||||
// const { app, BrowserWindow, shell, dialog } = require("electron")
|
||||
// const { join } = require("./utilities/centralPath")
|
||||
// const isDev = require("electron-is-dev")
|
||||
// const { autoUpdater } = require("electron-updater")
|
||||
// const unhandled = require("electron-unhandled")
|
||||
// const { existsSync } = require("fs-extra")
|
||||
// const initialiseBudibase = require("./utilities/initialiseBudibase")
|
||||
// const { budibaseAppsDir } = require("./utilities/budibaseDir")
|
||||
// const { openNewGitHubIssue, debugInfo } = require("electron-util")
|
||||
// const eventEmitter = require("./events")
|
||||
|
||||
const budibaseDir = budibaseAppsDir()
|
||||
const envFile = join(budibaseDir, ".env")
|
||||
// const budibaseDir = budibaseAppsDir()
|
||||
// const envFile = join(budibaseDir, ".env")
|
||||
|
||||
async function startApp() {
|
||||
if (!existsSync(envFile)) {
|
||||
await initialiseBudibase({ dir: budibaseDir })
|
||||
}
|
||||
// evict environment from cache, so it reloads when next asked
|
||||
delete require.cache[require.resolve("./environment")]
|
||||
unhandled({
|
||||
showDialog: true,
|
||||
reportButton: error => {
|
||||
openNewGitHubIssue({
|
||||
title: error.message,
|
||||
user: "Budibase",
|
||||
labels: ["error-report"],
|
||||
repo: "budibase",
|
||||
body: `### Error that occurred when using the budibase builder:\n\`\`\`\n${
|
||||
error.stack
|
||||
}\n\`\`\`\n### Operating System Information:\n---\n\n${debugInfo()}`,
|
||||
})
|
||||
},
|
||||
})
|
||||
// async function startApp() {
|
||||
// if (!existsSync(envFile)) {
|
||||
// await initialiseBudibase({ dir: budibaseDir })
|
||||
// }
|
||||
// // evict environment from cache, so it reloads when next asked
|
||||
// delete require.cache[require.resolve("./environment")]
|
||||
// // store the port incase its going to get overridden
|
||||
// const port = process.env.PORT
|
||||
// require("dotenv").config({ path: envFile })
|
||||
// // overwrite the port - don't want to use dotenv for the port
|
||||
// require("./environment")._set("PORT", port)
|
||||
|
||||
let win
|
||||
// unhandled({
|
||||
// showDialog: true,
|
||||
// reportButton: error => {
|
||||
// openNewGitHubIssue({
|
||||
// title: error.message,
|
||||
// user: "Budibase",
|
||||
// labels: ["error-report"],
|
||||
// repo: "budibase",
|
||||
// body: `### Error that occurred when using the budibase builder:\n\`\`\`\n${
|
||||
// error.stack
|
||||
// }\n\`\`\`\n### Operating System Information:\n---\n\n${debugInfo()}`,
|
||||
// })
|
||||
// },
|
||||
// })
|
||||
|
||||
function handleRedirect(e, url) {
|
||||
e.preventDefault()
|
||||
shell.openExternal(url)
|
||||
}
|
||||
// let win
|
||||
|
||||
async function createWindow() {
|
||||
app.server = require("./app")
|
||||
eventEmitter.on("internal:port", port => {
|
||||
const APP_URL = `http://localhost:${port}/_builder`
|
||||
const APP_TITLE = "Budibase Builder"
|
||||
win = new BrowserWindow({
|
||||
width: 1920,
|
||||
height: 1080,
|
||||
icon: join(__dirname, "..", "build", "icons", "512x512.png"),
|
||||
})
|
||||
win.setTitle(APP_TITLE)
|
||||
win.loadURL(APP_URL)
|
||||
if (isDev) {
|
||||
win.webContents.openDevTools()
|
||||
} else {
|
||||
autoUpdater.checkForUpdatesAndNotify()
|
||||
}
|
||||
// function handleRedirect(e, url) {
|
||||
// e.preventDefault()
|
||||
// shell.openExternal(url)
|
||||
// }
|
||||
|
||||
// open _blank in default browser
|
||||
win.webContents.on("new-window", handleRedirect)
|
||||
win.webContents.on("will-navigate", handleRedirect)
|
||||
})
|
||||
}
|
||||
// async function createWindow() {
|
||||
// app.server = require("./app")
|
||||
// eventEmitter.on("internal:port", port => {
|
||||
// const APP_URL = `http://localhost:${port}/_builder`
|
||||
// const APP_TITLE = "Budibase Builder"
|
||||
// win = new BrowserWindow({
|
||||
// width: 1920,
|
||||
// height: 1080,
|
||||
// icon: join(__dirname, "..", "build", "icons", "512x512.png"),
|
||||
// })
|
||||
// win.setTitle(APP_TITLE)
|
||||
// win.loadURL(APP_URL)
|
||||
// if (isDev) {
|
||||
// win.webContents.openDevTools()
|
||||
// } else {
|
||||
// autoUpdater.checkForUpdatesAndNotify()
|
||||
// }
|
||||
|
||||
app.whenReady().then(createWindow)
|
||||
// // open _blank in default browser
|
||||
// win.webContents.on("new-window", handleRedirect)
|
||||
// win.webContents.on("will-navigate", handleRedirect)
|
||||
// })
|
||||
// }
|
||||
|
||||
// Quit when all windows are closed.
|
||||
app.on("window-all-closed", () => {
|
||||
// On macOS it is common for applications and their menu bar
|
||||
// to stay active until the user quits explicitly with Cmd + Q
|
||||
if (process.platform !== "darwin") {
|
||||
app.server.close()
|
||||
app.quit()
|
||||
}
|
||||
})
|
||||
// app.whenReady().then(createWindow)
|
||||
|
||||
app.on("activate", () => {
|
||||
// On macOS it's common to re-create a window in the app when the
|
||||
// dock icon is clicked and there are no other windows open.
|
||||
if (win === null) createWindow()
|
||||
})
|
||||
}
|
||||
// // Quit when all windows are closed.
|
||||
// app.on("window-all-closed", () => {
|
||||
// // On macOS it is common for applications and their menu bar
|
||||
// // to stay active until the user quits explicitly with Cmd + Q
|
||||
// if (process.platform !== "darwin") {
|
||||
// app.server.close()
|
||||
// app.quit()
|
||||
// }
|
||||
// })
|
||||
|
||||
autoUpdater.on("update-downloaded", (event, releaseNotes, releaseName) => {
|
||||
const dialogOpts = {
|
||||
type: "info",
|
||||
buttons: ["Restart", "Later"],
|
||||
title: "Budibase Update Available",
|
||||
message: process.platform === "win32" ? releaseNotes : releaseName,
|
||||
detail:
|
||||
"A new version of the budibase builder has been downloaded. Restart the application to apply the updates.",
|
||||
}
|
||||
// app.on("activate", () => {
|
||||
// // On macOS it's common to re-create a window in the app when the
|
||||
// // dock icon is clicked and there are no other windows open.
|
||||
// if (win === null) createWindow()
|
||||
// })
|
||||
// }
|
||||
|
||||
dialog.showMessageBox(dialogOpts).then(returnValue => {
|
||||
if (returnValue.response === 0) autoUpdater.quitAndInstall()
|
||||
})
|
||||
})
|
||||
// autoUpdater.on("update-downloaded", (event, releaseNotes, releaseName) => {
|
||||
// const dialogOpts = {
|
||||
// type: "info",
|
||||
// buttons: ["Restart", "Later"],
|
||||
// title: "Budibase Update Available",
|
||||
// message: process.platform === "win32" ? releaseNotes : releaseName,
|
||||
// detail:
|
||||
// "A new version of the budibase builder has been downloaded. Restart the application to apply the updates.",
|
||||
// }
|
||||
|
||||
autoUpdater.on("error", message => {
|
||||
console.error("There was a problem updating the application")
|
||||
console.error(message)
|
||||
})
|
||||
// dialog.showMessageBox(dialogOpts).then(returnValue => {
|
||||
// if (returnValue.response === 0) autoUpdater.quitAndInstall()
|
||||
// })
|
||||
// })
|
||||
|
||||
startApp()
|
||||
// autoUpdater.on("error", message => {
|
||||
// console.error("There was a problem updating the application")
|
||||
// console.error(message)
|
||||
// })
|
||||
|
||||
// startApp()
|
||||
|
|
|
@ -1,37 +0,0 @@
|
|||
// const { existsSync, readFile, writeFile, ensureDir } = require("fs-extra")
|
||||
// const { join, resolve } = require("./centralPath")
|
||||
// const { processString } = require("@budibase/string-templates")
|
||||
// const uuid = require("uuid")
|
||||
|
||||
// module.exports = async opts => {
|
||||
// // await ensureDir(opts.dir)
|
||||
// await setCouchDbUrl(opts)
|
||||
|
||||
// // need an env file
|
||||
// await createDevEnvFile(opts)
|
||||
// }
|
||||
|
||||
// const setCouchDbUrl = async opts => {
|
||||
// if (!opts.couchDbUrl) {
|
||||
// const dataDir = join(opts.dir, ".data")
|
||||
// await ensureDir(dataDir)
|
||||
// opts.couchDbUrl =
|
||||
// dataDir + (dataDir.endsWith("/") || dataDir.endsWith("\\") ? "" : "/")
|
||||
// }
|
||||
// }
|
||||
|
||||
// const createDevEnvFile = async opts => {
|
||||
// const destConfigFile = join(opts.dir, "./.env")
|
||||
// let createConfig = !existsSync(destConfigFile) || opts.quiet
|
||||
// if (createConfig) {
|
||||
// const template = await readFile(
|
||||
// resolve(__dirname, "..", "..", ".env.template"),
|
||||
// {
|
||||
// encoding: "utf8",
|
||||
// }
|
||||
// )
|
||||
// opts.cookieKey1 = opts.cookieKey1 || uuid.v4()
|
||||
// const config = await processString(template, opts)
|
||||
// await writeFile(destConfigFile, config, { flag: "w+" })
|
||||
// }
|
||||
// }
|
Loading…
Reference in New Issue