From 1b2be79b336cb307135408c6659fce20eea30bcc Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Oct 2025 04:10:09 -0700 Subject: [PATCH 01/20] Trying to run the project on my computer installed dependencies --- server/package-lock.json | 337 ++++++++++++++++++++++++++++++++++++++- server/package.json | 5 +- 2 files changed, 339 insertions(+), 3 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 0b7b353..0963b80 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -10,13 +10,46 @@ "license": "ISC", "dependencies": { "cors": "^2.8.5", + "dotenv": "^17.2.3", "esm": "^3.2.25", - "express": "^5.1.0" + "express": "^5.1.0", + "mysql2": "^3.15.3", + "sequelize": "^6.37.7" }, "devDependencies": { "nodemon": "^3.1.10" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", + "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/validator": { + "version": "13.15.3", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.3.tgz", + "integrity": "sha512-7bcUmDyS6PN3EuD9SlGGOxM77F8WLVsrwkxyWxKnxzmXoequ6c7741QBrANq6htVRGOITJ7z72mTP6Z4XyuG+Q==", + "license": "MIT" + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -44,6 +77,15 @@ "node": ">= 8" } }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -247,6 +289,15 @@ } } }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -256,6 +307,24 @@ "node": ">= 0.8" } }, + "node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==", + "license": "MIT" + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -453,6 +522,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -593,6 +671,15 @@ "dev": true, "license": "ISC" }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ], + "license": "MIT" + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -660,6 +747,48 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/lru.min": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz", + "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -724,12 +853,81 @@ "node": "*" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz", + "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/mysql2": { + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.3.tgz", + "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.0", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "license": "MIT", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -839,6 +1037,12 @@ "url": "https://opencollective.com/express" } }, + "node_modules/pg-connection-string": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", + "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", + "license": "MIT" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -940,6 +1144,12 @@ "node": ">=8.10.0" } }, + "node_modules/retry-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.1.1.tgz", + "integrity": "sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==", + "license": "MIT" + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -986,7 +1196,6 @@ "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1017,6 +1226,82 @@ "node": ">= 18" } }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/sequelize": { + "version": "6.37.7", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.7.tgz", + "integrity": "sha512-mCnh83zuz7kQxxJirtFD7q6Huy6liPanI67BSlbzSYgVNl5eXVdE2CN1FuAeZwG1SNpGsNRCV+bJAVVnykZAFA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", @@ -1123,6 +1408,15 @@ "node": ">=10" } }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -1167,6 +1461,12 @@ "node": ">=0.6" } }, + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==", + "license": "MIT" + }, "node_modules/touch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", @@ -1198,6 +1498,12 @@ "dev": true, "license": "MIT" }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -1207,6 +1513,24 @@ "node": ">= 0.8" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.15.15", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", + "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -1216,6 +1540,15 @@ "node": ">= 0.8" } }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/server/package.json b/server/package.json index 402bb6b..399ee9b 100644 --- a/server/package.json +++ b/server/package.json @@ -12,8 +12,11 @@ "description": "", "dependencies": { "cors": "^2.8.5", + "dotenv": "^17.2.3", "esm": "^3.2.25", - "express": "^5.1.0" + "express": "^5.1.0", + "mysql2": "^3.15.3", + "sequelize": "^6.37.7" }, "type": "module", "devDependencies": { From 58d8d120967b615986b3e32d1a5b1cde0a747d7a Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Oct 2025 04:12:09 -0700 Subject: [PATCH 02/20] working on dockerfile for backend --- pixel2pattern/dockerfile | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pixel2pattern/dockerfile diff --git a/pixel2pattern/dockerfile b/pixel2pattern/dockerfile new file mode 100644 index 0000000..e69de29 From f40a332e866c3e6ef6660e1c0c490c05abf6cf23 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Oct 2025 04:15:23 -0700 Subject: [PATCH 03/20] working on dockerfile for frontend --- pixel2pattern/dockerfile | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pixel2pattern/dockerfile diff --git a/pixel2pattern/dockerfile b/pixel2pattern/dockerfile new file mode 100644 index 0000000..e69de29 From 3a9e925f44ed13876969e20910a2e10b68781076 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Oct 2025 04:36:11 -0700 Subject: [PATCH 04/20] Added frontend Dockerfile for Next.js app --- pixel2pattern/dockerfile | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pixel2pattern/dockerfile b/pixel2pattern/dockerfile index e69de29..dee30cf 100644 --- a/pixel2pattern/dockerfile +++ b/pixel2pattern/dockerfile @@ -0,0 +1,12 @@ +# Frontend Dockerfile +FROM node:20-alpine + +WORKDIR /app + +COPY package*.json ./ +RUN npm install + +COPY . . + +EXPOSE 3000 +CMD ["npm", "run", "dev"] From 72d5b9aef4d08095492b7629dd9f8fde846e92b3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Oct 2025 04:37:10 -0700 Subject: [PATCH 05/20] working dockerfile for backend --- server/dockerfile | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 server/dockerfile diff --git a/server/dockerfile b/server/dockerfile new file mode 100644 index 0000000..e69de29 From 9db7739f1717285c92d9fe69e7403bcc7af81dca Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Oct 2025 05:25:30 -0700 Subject: [PATCH 06/20] done with dockerfile for backend --- server/dockerfile | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/server/dockerfile b/server/dockerfile index e69de29..8731859 100644 --- a/server/dockerfile +++ b/server/dockerfile @@ -0,0 +1,11 @@ +FROM node:20-alpine + +WORKDIR /app + +COPY package*.json ./ +RUN npm install + +COPY . . + +EXPOSE 3001 +CMD ["npm", "run", "dev"] From 0dffbe63648422922a5db75cea6647d04f35dd80 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Oct 2025 05:26:16 -0700 Subject: [PATCH 07/20] started working on docker compose file --- docker-compose.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e69de29 From 91051600174898d04fc4a0fdc536a3bb0ba898a6 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Oct 2025 05:54:03 -0700 Subject: [PATCH 08/20] made progress on docker compose file for front end --- docker-compose.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index e69de29..e6e8330 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +services: + db: + image: mysql:8.0 + container_name: pixel_db + environment: + MYSQL_ROOT_PASSWORD: rootpassword + MYSQL_DATABASE: pixel2pattern + MYSQL_USER: user + MYSQL_PASSWORD: password + ports: + - "3306:3306" + volumes: + - db-data:/var/lib/mysql From 1c948c9086ab578a19f6856cc863b928fef335ec Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Oct 2025 05:55:07 -0700 Subject: [PATCH 09/20] working on docker compose file for backend --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index e6e8330..377e34e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,3 +11,5 @@ services: - "3306:3306" volumes: - db-data:/var/lib/mysql +backend: + build: \ No newline at end of file From 10f915e712a6caaba12de571d7766ea261b11339 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Oct 2025 06:40:08 -0700 Subject: [PATCH 10/20] Added docker-compose.yml to run database, backend, and frontend containers --- docker-compose.yml | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 377e34e..3094bca 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,5 +11,28 @@ services: - "3306:3306" volumes: - db-data:/var/lib/mysql -backend: - build: \ No newline at end of file + + backend: + build: + context: ./server + container_name: pixel_backend + env_file: + - ./db.env + environment: + DB_HOST: db + ports: + - "3001:3001" + depends_on: + - db + + frontend: + build: + context: ./pixel2pattern + container_name: pixel_frontend + ports: + - "3000:3000" + depends_on: + - backend + +volumes: + db-data: From 4db7e6e19a7c9c4ce910ed0c72b294499f2e53e4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 2 Nov 2025 01:50:37 -0800 Subject: [PATCH 11/20] fix some bugs and configured .yml file to run the project --- docker-compose.yml | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3094bca..e10d907 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,6 +2,7 @@ services: db: image: mysql:8.0 container_name: pixel_db + restart: always environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: pixel2pattern @@ -11,28 +12,42 @@ services: - "3306:3306" volumes: - db-data:/var/lib/mysql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-prootpassword"] + interval: 5s + timeout: 5s + retries: 10 backend: build: context: ./server container_name: pixel_backend + restart: always env_file: - ./db.env environment: - DB_HOST: db + DB_HOST: db + DB_USER: user + DB_PASSWORD: password + DB_NAME: pixel2pattern + DB_DIALECT: mysql + depends_on: + db: + condition: service_healthy ports: - "3001:3001" - depends_on: - - db + command: sh -c "sleep 10 && npm run dev" frontend: build: context: ./pixel2pattern container_name: pixel_frontend - ports: - - "3000:3000" + restart: always depends_on: - backend + ports: + - "3000:3000" + command: sh -c "npm run dev" volumes: db-data: From 225f5f5400eb2809603fe3fa1e7fae73e0d79ef4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 14 Nov 2025 01:50:16 -0800 Subject: [PATCH 12/20] made minor changes to files and deplyoyed the project to VM and test it --- docker-compose.yml | 12 +++++++++--- pixel2pattern/dockerfile | 4 +++- pixel2pattern/src/app/view/[id]/page.jsx | 7 +++---- pixel2pattern/src/components/EditablePatternView.jsx | 4 +++- pixel2pattern/src/components/PixelForm.jsx | 4 +++- pixel2pattern/src/components/PostsCollection.jsx | 5 ++++- server/dockerfile | 2 +- 7 files changed, 26 insertions(+), 12 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e10d907..385c47d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,3 +1,5 @@ +version: "3.8" + services: db: image: mysql:8.0 @@ -12,7 +14,7 @@ services: - "3306:3306" volumes: - db-data:/var/lib/mysql - healthcheck: + healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-prootpassword"] interval: 5s timeout: 5s @@ -31,12 +33,13 @@ services: DB_PASSWORD: password DB_NAME: pixel2pattern DB_DIALECT: mysql + PORT: 3001 depends_on: db: condition: service_healthy ports: - "3001:3001" - command: sh -c "sleep 10 && npm run dev" + command: sh -c "sleep 10 && npm run dev" frontend: build: @@ -45,9 +48,12 @@ services: restart: always depends_on: - backend + environment: + - NEXT_PUBLIC_API_URL=http://143.244.187.217:3001 ports: - "3000:3000" - command: sh -c "npm run dev" + command: sh -c "npm run dev" + volumes: db-data: diff --git a/pixel2pattern/dockerfile b/pixel2pattern/dockerfile index dee30cf..be1a47b 100644 --- a/pixel2pattern/dockerfile +++ b/pixel2pattern/dockerfile @@ -1,4 +1,3 @@ -# Frontend Dockerfile FROM node:20-alpine WORKDIR /app @@ -8,5 +7,8 @@ RUN npm install COPY . . +ARG NEXT_PUBLIC_API_URL +ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL + EXPOSE 3000 CMD ["npm", "run", "dev"] diff --git a/pixel2pattern/src/app/view/[id]/page.jsx b/pixel2pattern/src/app/view/[id]/page.jsx index 1145ffa..1326341 100644 --- a/pixel2pattern/src/app/view/[id]/page.jsx +++ b/pixel2pattern/src/app/view/[id]/page.jsx @@ -24,10 +24,12 @@ export default function PatternPage({params}) { setEditView(true); } + const apiUrl = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001"; + useEffect(()=> { const fetchPost = async () => { try{ - const res = await fetch(`http://localhost:3001/patterns/${id}`); + const res = await fetch(`${apiUrl}/patterns/${id}`); if(!res.ok) throw new Error(`Failed to fetch post with ID: ${id}`); const post = await res.json(); setPost(post); @@ -83,7 +85,4 @@ export default function PatternPage({params}) { ); - - - } \ No newline at end of file diff --git a/pixel2pattern/src/components/EditablePatternView.jsx b/pixel2pattern/src/components/EditablePatternView.jsx index 1d2e271..51cb937 100644 --- a/pixel2pattern/src/components/EditablePatternView.jsx +++ b/pixel2pattern/src/components/EditablePatternView.jsx @@ -6,6 +6,8 @@ import { useState } from "react"; import { useParams } from "next/navigation"; import PixelDisplay from "@/components/PixelDisplay"; +const apiUrl = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001"; + export default function EditablePatternView({ post, onCancel, params}) { const { id } = useParams(); const [formData, setFormData] = useState({ @@ -24,7 +26,7 @@ export default function EditablePatternView({ post, onCancel, params}) { const handleSubmit = async(e) => { try{ - const res = await fetch(`http://localhost:3001/update/${id}`, + const res = await fetch(`${apiUrl}/update/${id}`, { method: 'PATCH', headers: {"Content-Type": "application/json"}, diff --git a/pixel2pattern/src/components/PixelForm.jsx b/pixel2pattern/src/components/PixelForm.jsx index b366459..65357f1 100644 --- a/pixel2pattern/src/components/PixelForm.jsx +++ b/pixel2pattern/src/components/PixelForm.jsx @@ -9,6 +9,8 @@ import DrawIcon from '@mui/icons-material/Draw'; import {useEffect, useState} from "react"; import { useRouter } from 'next/navigation'; +const apiUrl = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001"; + export default function PixelForm() { // form detail states const [name, setName] = useState(""); @@ -72,7 +74,7 @@ export default function PixelForm() { } try{ - const res = await fetch('http://localhost:3001/patterns', + const res = await fetch(`${apiUrl}/patterns`, { method: "POST", headers: {"Content-Type": "application/json"}, diff --git a/pixel2pattern/src/components/PostsCollection.jsx b/pixel2pattern/src/components/PostsCollection.jsx index ca194c9..c10cdab 100644 --- a/pixel2pattern/src/components/PostsCollection.jsx +++ b/pixel2pattern/src/components/PostsCollection.jsx @@ -2,6 +2,9 @@ import { useEffect, useState } from "react"; import PixelPost from "./PixelPost.jsx"; import Link from "next/link.js"; + +const apiUrl = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001"; + export default function PostsCollection() { const [ pixelPosts, setPixelPosts] = useState([]); @@ -9,7 +12,7 @@ export default function PostsCollection() { useEffect(() => { const fetchPosts = async () => { try { - const res = await fetch("http://localhost:3001/patterns"); + const res = await fetch(`${apiUrl}/patterns`); if (!res.ok) throw new Error("failed to fetch posts"); const posts = await res.json(); setPixelPosts(posts); diff --git a/server/dockerfile b/server/dockerfile index 8731859..79c3d60 100644 --- a/server/dockerfile +++ b/server/dockerfile @@ -8,4 +8,4 @@ RUN npm install COPY . . EXPOSE 3001 -CMD ["npm", "run", "dev"] +CMD ["node", "server.js"] From 915729330fec616fd69b8ba6c5c2e99136664f64 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 14 Nov 2025 01:52:12 -0800 Subject: [PATCH 13/20] updating the readme file --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 618e6b8..c0accb8 100644 --- a/README.md +++ b/README.md @@ -79,4 +79,6 @@ Restart your development server if it's already running (e.g., npm start). ## Deployment Process Linked below is the documentation that was created while setting up the virtual machine for deployment. -[Click Here!](https://loving-eye-8b5.notion.site/VM-Deployment-27e101a39e1480328574fee619f042d8) \ No newline at end of file +[Click Here!](https://loving-eye-8b5.notion.site/VM-Deployment-27e101a39e1480328574fee619f042d8) + +updating readme file \ No newline at end of file From f26ed190884b3f8836f51e3c79324af28358ca8d Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 14 Nov 2025 03:40:54 -0800 Subject: [PATCH 14/20] updated README.md with Docker-specific setup and deployment instructions --- README.md | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c0accb8..172a448 100644 --- a/README.md +++ b/README.md @@ -81,4 +81,125 @@ Restart your development server if it's already running (e.g., npm start). Linked below is the documentation that was created while setting up the virtual machine for deployment. [Click Here!](https://loving-eye-8b5.notion.site/VM-Deployment-27e101a39e1480328574fee619f042d8) -updating readme file \ No newline at end of file + + + + +🐳 Docker Setup + +```bash +# Build containers +docker compose build + +# Run containers in background +docker compose up -d + +# Stop containers +docker compose down + +# View logs for all services +docker compose logs -f +``` + +After running these commands, visit: + +Frontend: http://localhost:3000 +Backend API: http://localhost:3001/patterns + +---- + +☁️ VM Deployment with Docker + +```bash +ssh root@ +# Clone your repo on the VM +git clone https://github.com//.git +cd + +# Start containers +docker compose up -d +``` + +Then open in a browser: +``` +http://:3000 +``` + +---- + + +🌿 Environment Variables for Docker + +``` +The Docker setup uses: +MySQL service name: db +Backend container: pixel_backend +Frontend container: pixel_frontend +Your docker-compose.yml config for the database: +``` + +services: + db: + image: mysql:8.0 + container_name: pixel_db + restart: always + environment: + MYSQL_ROOT_PASSWORD: rootpassword + MYSQL_DATABASE: pixel2pattern + MYSQL_USER: user + MYSQL_PASSWORD: password + ports: + - "3306:3306" + volumes: + - db-data:/var/lib/mysql + + +db.env for Docker: + +``` +DB_HOST=db +DB_USER=user +DB_PASSWORD=password +DB_NAME=pixel2pattern +DB_DIALECT=mysql +DB_PORT=3306 +PORT=3001 +``` + + +💾 Database Volume Persistence + +A Docker volume is used so MySQL data is not lost when containers restart: + +```yaml +volumes: + db-data: +``` + +Useful commands: + +```bash +# List volumes +docker volume ls +``` + +# Inspect your DB volume +```bash +docker volume inspect _db-data +``` +---- + +🧰 Quick Troubleshooting + +Check containers and logs + +docker compose ps +docker compose logs -f db +docker compose logs -f backend +docker compose logs -f frontend + + +Database connection issues + +Make sure DB_HOST=db in db.env when using Docker. +Ensure DB_USER, DB_PASSWORD, and DB_NAME match the values in docker-compose.yml. \ No newline at end of file From 43aa91a20545beab9ec8b3abde680c170411316f Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 14 Nov 2025 03:56:26 -0800 Subject: [PATCH 15/20] working on deploy.sh file --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 172a448..45214f2 100644 --- a/README.md +++ b/README.md @@ -202,4 +202,6 @@ docker compose logs -f frontend Database connection issues Make sure DB_HOST=db in db.env when using Docker. -Ensure DB_USER, DB_PASSWORD, and DB_NAME match the values in docker-compose.yml. \ No newline at end of file +Ensure DB_USER, DB_PASSWORD, and DB_NAME match the values in docker-compose.yml. + +#creating the deploy.sh file \ No newline at end of file From 57281c52c810fef0e94b9b80c3f9b9313a35a9ed Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 16 Nov 2025 00:53:20 -0800 Subject: [PATCH 16/20] working docker deployment Script --- scripts/deploy_docker.sh | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 scripts/deploy_docker.sh diff --git a/scripts/deploy_docker.sh b/scripts/deploy_docker.sh new file mode 100644 index 0000000..4489fb1 --- /dev/null +++ b/scripts/deploy_docker.sh @@ -0,0 +1,59 @@ +#!/bin/bash +set -e + +echo "=== Pixel-to-Pattern Docker Deployment ===" + +# Make apt non-interactive +export DEBIAN_FRONTEND=noninteractive + +echo "[1/5] Updating system packages..." +sudo apt update -y && sudo apt upgrade -y + +# Install Git if missing +if ! command -v git >/dev/null 2>&1; then + echo "[2/5] Installing Git..." + sudo apt install -y git +fi + +# Install Docker if missing +if ! command -v docker >/dev/null 2>&1; then + echo "[3/5] Installing Docker..." + curl -fsSL https://get.docker.com | sudo sh +fi + +echo "Enabling Docker to start on boot..." +sudo systemctl enable --now docker + +# Install Docker Compose plugin if missing +if ! docker compose version >/dev/null 2>&1; then + echo "[4/5] Installing Docker Compose plugin..." + sudo apt install -y docker-compose-plugin +fi + +# Repo settings +REPO_URL="https://github.com/RaiuXL/Pixel-to-Pattern.git" +REPO_DIR="pixel-to-pattern" + +# Clone repo +if [ ! -d "$REPO_DIR/.git" ]; then + echo "[5/5] Cloning repository from $REPO_URL ..." + git clone "$REPO_URL" "$REPO_DIR" +fi + +cd "$REPO_DIR" + +echo "Pulling latest updates from main..." +git pull origin main || true + +echo "Building containers..." +docker compose build + +echo "Starting services (detached)..." +docker compose up -d + +echo "---------------------------------------------" +echo "Deployment complete!" +echo "Frontend: http://:3000" +echo "Backend: http://:3001/patterns" +echo "---------------------------------------------" + From a46adc806ee4c33f96f988ec99c62145252c42fb Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 16 Nov 2025 00:58:20 -0800 Subject: [PATCH 17/20] change localhost in fetch --- pixel2pattern/src/app/view/[id]/page.jsx | 28 ++++++++++++++---------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/pixel2pattern/src/app/view/[id]/page.jsx b/pixel2pattern/src/app/view/[id]/page.jsx index 1326341..eb05334 100644 --- a/pixel2pattern/src/app/view/[id]/page.jsx +++ b/pixel2pattern/src/app/view/[id]/page.jsx @@ -26,21 +26,25 @@ export default function PatternPage({params}) { const apiUrl = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001"; - useEffect(()=> { + useEffect(() => { const fetchPost = async () => { - try{ - const res = await fetch(`${apiUrl}/patterns/${id}`); - if(!res.ok) throw new Error(`Failed to fetch post with ID: ${id}`); - const post = await res.json(); - setPost(post); - setPatternConfig(post.pattern_info); - } catch(err){ - console.error('Failed to fetch post, ', err); + try { + const API_BASE_URL = + process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001"; + + const res = await fetch(`${API_BASE_URL}/patterns/${id}`); + if (!res.ok) { + throw new Error("Failed to fetch pattern"); + } + const data = await res.json(); + setPattern(data); + } catch (err) { + console.error("Failed to fetch post", err); } - } + }; - fetchPost(); - }, []); + fetchPost(); + }, [id]); if (!post) return Loading... From 166d513fffd506a27e6b15887438fdfa2639bf95 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 16 Nov 2025 01:33:59 -0800 Subject: [PATCH 18/20] minor changes --- pixel2pattern/src/app/view/[id]/page.jsx | 31 ++++++++++++------------ 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/pixel2pattern/src/app/view/[id]/page.jsx b/pixel2pattern/src/app/view/[id]/page.jsx index eb05334..ce388a5 100644 --- a/pixel2pattern/src/app/view/[id]/page.jsx +++ b/pixel2pattern/src/app/view/[id]/page.jsx @@ -24,27 +24,26 @@ export default function PatternPage({params}) { setEditView(true); } - const apiUrl = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001"; - useEffect(() => { - const fetchPost = async () => { - try { - const API_BASE_URL = + const fetchPost = async () => { + try { + const apiBaseUrl = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001"; - const res = await fetch(`${API_BASE_URL}/patterns/${id}`); - if (!res.ok) { - throw new Error("Failed to fetch pattern"); - } - const data = await res.json(); - setPattern(data); - } catch (err) { - console.error("Failed to fetch post", err); + const res = await fetch(`${apiBaseUrl}/patterns/${id}`); + if (!res.ok) { + throw new Error(`Failed to fetch post with ID: ${id}`); } - }; - fetchPost(); - }, [id]); + const post = await res.json(); + setPost(post); + } catch (err) { + console.error("Failed to fetch post", err); + } + }; + + fetchPost(); +}, [id]); if (!post) return Loading... From 8037c13d14620b9683eee012c9b342e88d6c12b1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 16 Nov 2025 02:13:25 -0800 Subject: [PATCH 19/20] updating readme file --- README.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 45214f2..66fce7a 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,6 @@ docker volume inspect _db-data ---- 🧰 Quick Troubleshooting - Check containers and logs docker compose ps @@ -198,10 +197,58 @@ docker compose logs -f db docker compose logs -f backend docker compose logs -f frontend - Database connection issues Make sure DB_HOST=db in db.env when using Docker. Ensure DB_USER, DB_PASSWORD, and DB_NAME match the values in docker-compose.yml. -#creating the deploy.sh file \ No newline at end of file + +## 🐚 Docker Deployment Script + +To automate VM provisioning and Docker-based deployment, this project includes a bash script named `deploy_docker.sh`. +You can run this script on a **fresh Ubuntu VM** to install everything and start the app. + +### ✅ What the Script Does + +When you run `deploy_docker.sh`, it: + +- Updates the system packages +- Installs Git +- Installs Docker and the Docker Compose plugin +- Configures Docker to start automatically on boot +- Clones the Pixel to Pattern repository from GitHub +- Builds the Docker images and starts all services with `docker compose up -d` +- Prints clear progress messages at each step so you can see what’s happening + +After the script completes successfully, the application is available at: +- **Frontend:** `http://:3000` +- **Backend API:** `http://:3001/patterns` +Replace `` with the IP address of your VM. + + +### ▶️ How to Use `deploy_docker.sh` + +1. **SSH into your Ubuntu VM:** + +```bash +ssh root@ +``` +Place the script on the VM +If it’s in the repo already, cd into the repo first. Otherwise, create the file and paste the script contents. +Make the script executable and run it: + +```bash +chmod +x deploy_docker.sh +./deploy_docker.sh +``` +Verify containers are running: + +```bash +docker compose ps +``` +You should see the frontend, backend, and db services in the Up state. +Open the app in a browser: + +http://:3000 +📦 Archived Non-Docker Deployment Scripts +Any older scripts used for direct VM deployment without Docker from earlier sprints have been moved to an archive folder so they are not confused with the Docker-based workflow. \ No newline at end of file From e710f323329e9bcd0ab6f93f8e80308e68309394 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 16 Nov 2025 02:19:58 -0800 Subject: [PATCH 20/20] Sprint 3 done --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 66fce7a..8693326 100644 --- a/README.md +++ b/README.md @@ -248,7 +248,4 @@ docker compose ps ``` You should see the frontend, backend, and db services in the Up state. Open the app in a browser: - -http://:3000 -📦 Archived Non-Docker Deployment Scripts -Any older scripts used for direct VM deployment without Docker from earlier sprints have been moved to an archive folder so they are not confused with the Docker-based workflow. \ No newline at end of file +http://:3000 \ No newline at end of file