Canvas: Makefile

Change-Id: I448a36bf60ee33fb4691d5312ac69b32ec38ec14
diff --git a/apps/canvas/Makefile b/apps/canvas/Makefile
new file mode 100644
index 0000000..e06d29b
--- /dev/null
+++ b/apps/canvas/Makefile
@@ -0,0 +1,34 @@
+install:
+	npm install --prefix config/
+	npm install --prefix front/
+	npm install --prefix back/
+
+lint:
+	npm run lint --prefix config/
+	npm run lint --prefix front/
+	npm run lint --prefix back/
+
+format:
+	npm run format --prefix config/
+	npm run format --prefix front/
+	npm run format --prefix back/
+
+build: export DODO_VOLUME_DATA=/home/gio
+build:
+	npm run build --prefix config/
+	npm run build --prefix front/
+	npm run prisma-migrate --prefix back/
+	npm run build --prefix back/
+
+run: export DODO_PORT_WEB=8080
+run: export DODO_PORT_API=8081
+run: export DODO_VOLUME_DATA=/home/gio
+run: build
+	npm run start --prefix back/
+
+start: export DODO_PORT_WEB=8080
+start: export DODO_PORT_API=8081
+start: export DODO_VOLUME_DATA=/home/gio
+start:
+	npm run prisma-migrate --prefix back/
+	npm run start --prefix back/
diff --git a/apps/canvas/back/.env b/apps/canvas/back/.env
index a101621..9efa576 100644
--- a/apps/canvas/back/.env
+++ b/apps/canvas/back/.env
@@ -1,3 +1,3 @@
 DATABASE_URL=file:/home/gio/dodo.db
-PUBLIC_ADDR=https://canvas.p.v1.dodo.cloud
-INTERNAL_API_ADDR=http://canvas.hgrz-dodo-app-jjy.svc.cluster.local:8081
+# PUBLIC_ADDR=https://canvas.p.v1.dodo.cloud
+INTERNAL_API_ADDR=http://10.42.0.39:8081
diff --git a/apps/canvas/back/package.json b/apps/canvas/back/package.json
index 66bf02b..dd63048 100644
--- a/apps/canvas/back/package.json
+++ b/apps/canvas/back/package.json
@@ -5,12 +5,13 @@
   "main": "index.js",
   "type": "module",
   "scripts": {
-    "build": "node --max-old-space-size=4096 node_modules/.bin/tsc",
+    "build": "node --max-old-space-size=1000 node_modules/.bin/tsc",
     "test": "jest",
     "format": "prettier --write src/**/*.{js,ts,jsx,tsx} --list-different",
     "format-check": "prettier --check src/**/*.{js,ts,jsx,tsx}",
     "lint": "eslint .",
-    "start": "node dist/index.js"
+    "start": "node dist/index.js",
+    "prisma-migrate": "prisma migrate dev"
   },
   "author": "",
   "license": "ISC",
diff --git a/apps/canvas/config/src/config.ts b/apps/canvas/config/src/config.ts
index 6793bf7..0eb185c 100644
--- a/apps/canvas/config/src/config.ts
+++ b/apps/canvas/config/src/config.ts
@@ -69,7 +69,7 @@
 					ports: (n.data.ports || [])
 						.filter((p) => !n.data.dev?.enabled || (p.value != 22 && p.value != 9090))
 						.map((p) => ({
-							name: p.name.toLowerCase(),
+							name: p.name.toUpperCase(),
 							value: p.value,
 							protocol: "TCP", // TODO(gio)
 						})),
@@ -105,29 +105,35 @@
 					preBuildCommands: n.data.preBuildCommands
 						? n.data.preBuildCommands.split("\n").map((cmd) => ({ bin: cmd }))
 						: [],
-					dev: {
-						enabled: n.data.dev ? n.data.dev.enabled : false,
-						username: n.data.dev && n.data.dev.enabled ? env.user.username : undefined,
-						codeServer:
-							n.data.dev?.enabled && n.data.dev.expose != null
-								? {
-										network: networkMap.get(n.data.dev.expose.network)!,
-										subdomain: n.data.dev.expose.subdomain,
-									}
-								: undefined,
-						ssh:
-							n.data.dev?.enabled && n.data.dev.expose != null
-								? {
-										network: networkMap.get(n.data.dev.expose.network)!,
-										subdomain: n.data.dev.expose.subdomain,
-									}
-								: undefined,
-					},
-					agent: n.data.agent
+					dev: n.data.dev?.enabled
 						? {
-								geminiApiKey: n.data.agent.geminiApiKey,
+								enabled: true,
+								username: env.user.username,
+								codeServer:
+									n.data.dev.expose != null
+										? {
+												network: networkMap.get(n.data.dev.expose.network)!,
+												subdomain: n.data.dev.expose.subdomain,
+											}
+										: undefined,
+								ssh:
+									n.data.dev.expose != null
+										? {
+												network: networkMap.get(n.data.dev.expose.network)!,
+												subdomain: n.data.dev.expose.subdomain,
+											}
+										: undefined,
 							}
-						: undefined,
+						: {
+								enabled: false,
+							},
+					...(n.data.agent != null
+						? {
+								agent: {
+									geminiApiKey: n.data.agent.geminiApiKey,
+								},
+							}
+						: {}),
 				};
 			});
 		return {
diff --git a/apps/canvas/front/package.json b/apps/canvas/front/package.json
index 0b31f98..4f21636 100644
--- a/apps/canvas/front/package.json
+++ b/apps/canvas/front/package.json
@@ -5,7 +5,7 @@
 	"type": "module",
 	"scripts": {
 		"dev": "vite --port=$DODO_PORT_WEB --host",
-		"build": "vite build",
+		"build": "NODE_OPTIONS=--max-old-space-size=1000 vite build",
 		"format": "prettier --write src/**/*.{js,ts,jsx,tsx} --list-different",
 		"format-check": "prettier --check src/**/*.{js,ts,jsx,tsx}",
 		"lint": "eslint .",