Merge branch 'main' into save-backend-b

This commit is contained in:
JBB0807 2025-05-08 00:50:09 -07:00
commit ffd2404aaa
17 changed files with 291 additions and 104 deletions

View file

@ -0,0 +1,9 @@
NODE_ENV=docker
FLY_ACCESS_TOKEN="FlyV1 fm2_lJPECAAAAAAACJJHxBAjRF69RAjf3FXXuVT+M3bcwrVodHRwczovL2FwaS5mbHkuaW8vdjGUAJLOAA//nh8Lk7lodHRwczovL2FwaS5mbHkuaW8vYWFhL3YxxDxmIdNTu/DGjUSyYxuC5W7Rio4bNT5w6c1Ihi+ZJnjcmEutbt5KuyFcCo1C0CFPEhrP4hY5SEvXN58GHUDEToWZ0GwI5ndmIsZnhWSG8TBixbuFTaBb8lTBU5lNOvm2l4rX1i6dfId7S9Ko6qXpOzl9oYngy0zw+g2MwXuQrH6/XELBdEy/KThVeTEjt8QgBzOo/Eae+DsrATm6WjVv9f5a4iS/s7WtYHydZZr3z9M=,fm2_lJPEToWZ0GwI5ndmIsZnhWSG8TBixbuFTaBb8lTBU5lNOvm2l4rX1i6dfId7S9Ko6qXpOzl9oYngy0zw+g2MwXuQrH6/XELBdEy/KThVeTEjt8QQNZaUoOrVdOnk6Vo/DkeMGsO5aHR0cHM6Ly9hcGkuZmx5LmlvL2FhYS92MZgEks5oGwzFzwAAAAEkEyrjF84AD2FZCpHOAA9hWQzEEASQrBHkPDFO3LlZDaxRRIjEIEW1ki/syKHnhFamHgze8PFeunPOAmNmh57hslV04lL7"
AWS_ACCESS_KEY_ID='tid__NSmOVaGknqitaCySppZjqVTgJSdDFnFbWcQllkC_juHwkbQZO'
AWS_ENDPOINT_URL_S3='https://fly.storage.tigris.dev'
AWS_REGION='auto'
AWS_SECRET_ACCESS_KEY='tsec_6Bz1aMbfYQftuq5WfIVEDZkHwskU4MMjVywdtxSP6uxetEBvkSC2VHI9HfTeDgHr4D6kiz'
COMMON_BUCKET='snakeapi-deployment-test-bucket'
FLY_ORG='personal'
IMAGE_REF="registry.fly.io/snake-api-template:latest"

View file

@ -91,13 +91,6 @@ app.post("/deploy", async (req, res) => {
return res.status(400).json({ error: "appName required" });
}
// const notebookPath = path.join(__dirname, '../snakeapi_service/notebooks', notebookName);
// console.log('Resolved notebookPath:', notebookPath);
// if (!fs.existsSync(notebookPath)) {
// console.error('Notebook not found at:', notebookPath);
// return res.status(500).json({ error: `Notebook not found: ${notebookPath}` });
// }
try {
const fly = createFlyClient();
@ -108,17 +101,6 @@ app.post("/deploy", async (req, res) => {
primary_region: "sea",
});
// console.log('Uploading notebook to S3');
// const data = fs.readFileSync(notebookPath);
// const key = `${appName}/notebooks/${Date.now()}-notebook.ipynb`;
// console.log('S3 key:', key);
// await s3.putObject({
// Bucket: COMMON_BUCKET,
// Key: key,
// Body: data,
// ContentType: 'application/json'
// }).promise();
console.log("Creating machine");
const machineConfig = {
name: `${appName}-machine`,
@ -181,13 +163,21 @@ app.post("/deploy", async (req, res) => {
const ipv6 = v6resp.data.data.allocateIpAddress.ipAddress.address;
console.log("Allocated IPv6:", ipv6);
const machines = await fly.get(`/apps/${appName}/machines`);
const firstPrivateIp = machines.data[0]?.private_ip;
if (!firstPrivateIp) {
console.error("No private IP found for the machine:", machines.data);
return machines.status(500).json({ error: "No private IP found" });
}
console.log("First private IP:", firstPrivateIp);
return res.json({
status: "created",
app: appName,
ipv4,
ipv6,
ipv6 : firstPrivateIp,
url_v4: `http://${ipv4}`,
url_v6: `http://[${ipv6}]`,
url_v6: `http://[${firstPrivateIp}]`,
});
} catch (err) {
console.error(
@ -259,12 +249,27 @@ app.post("/:appName/delete", async (req, res) => {
try {
const fly = createFlyClient();
console.log("Destroying Fly app:", appName);
//check if the app exists
console.log("Checking if app exists:", appName);
const appCheck = await fly.get(`/apps/${appName}`);
console.log("App check response:", appCheck.status);
await fly.delete(`/apps/${appName}`);
return res.json({ status: "deleted", app: appName });
} catch (err) {
console.error("App deletion error:", err.response?.data || err.message);
return res.status(500).json({ error: err.response?.data || err.message });
//handle the 404 error and not treat it as a failure (no app to delete)
if (err.response?.status === 404) {
console.log("App not found, nothing to delete:", appName);
return res.status(200).json({ error: "App not found" });
}
const errorData = err.response?.data || err.stack || err.message;
console.error("App deletion error:", errorData);
return res.status(500).json({ errorData });
}
});
@ -272,3 +277,28 @@ const LISTEN_PORT = process.env.PORT || 3006;
app.listen(LISTEN_PORT, "0.0.0.0", () => {
console.log(`Deployment service listening on port ${LISTEN_PORT}`);
});
//deploy fly app based on appname
app.post("/deploy/:appName", async (req, res) => {
const { appName } = req.params;
const { region } = req.body;
if (!appName || !region) {
return res.status(400).json({ error: "appName and region are required" });
}
try {
const fly = createFlyClient();
console.log("Creating Fly app:", appName);
await fly.post("/apps", {
app_name: appName,
org_slug: FLY_ORG,
primary_region: region,
});
return res.json({ status: "created", app: appName });
} catch (err) {
console.error("App creation error:", err.response?.data || err.message);
return res.status(500).json({ error: err.response?.data || err.message });
}
});