From b78df2e0219a1291c2b83da0ac83fa63dbedde6f Mon Sep 17 00:00:00 2001 From: Elliot Braem Date: Thu, 16 Jan 2025 01:05:07 -0700 Subject: [PATCH 1/3] working --- Dockerfile | 6 ++++- backend/package.json | 1 + backend/src/index.ts | 31 +++++++++++-------------- backend/src/services/twitter/client.ts | 6 ++--- bun.lockb | Bin 328848 -> 329912 bytes fly.toml | 1 - litefs.yml | 1 + package.json | 1 + 8 files changed, 24 insertions(+), 23 deletions(-) diff --git a/Dockerfile b/Dockerfile index 548ed24..106ce23 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,6 +27,7 @@ WORKDIR /app # Copy backend package files COPY package.json ./ COPY backend/package.json ./backend/ +COPY backend/drizzle.config.ts ./backend/ # Install backend dependencies RUN cd backend && bun install @@ -57,11 +58,14 @@ COPY --from=backend-builder --chown=bun:bun /app/package.json ./ COPY --chown=bun:bun curate.config.json ./ COPY --from=frontend-builder --chown=bun:bun /app/frontend/dist ./frontend/dist -COPY --from=backend-builder --chown=bun:bun /app/backend/dist ./backend/dist +COPY --from=backend-builder --chown=bun:bun /app/backend ./backend + +RUN cd backend && bun install # Set environment variables ENV DATABASE_URL="file:/litefs/db" ENV NODE_ENV="production" +ENV FRONTEND_DIST_PATH="/app/frontend/dist" # Expose the port EXPOSE 3000 diff --git a/backend/package.json b/backend/package.json index dfb72bc..b9315a4 100644 --- a/backend/package.json +++ b/backend/package.json @@ -41,6 +41,7 @@ }, "dependencies": { "@elysiajs/cors": "^1.2.0", + "@elysiajs/static": "^1.2.0", "@elysiajs/swagger": "^1.2.0", "@libsql/client": "^0.14.0", "@types/cors": "^2.8.17", diff --git a/backend/src/index.ts b/backend/src/index.ts index 3d905ea..b92c901 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -3,6 +3,7 @@ import path from "path"; import { Elysia } from "elysia"; import { cors } from "@elysiajs/cors"; import { swagger } from "@elysiajs/swagger"; +import { staticPlugin } from "@elysiajs/static"; import { DistributionService } from "services/distribution/distribution.service"; import configService, { validateEnv } from "./config/config"; import { db } from "./services/db"; @@ -210,23 +211,19 @@ export async function main() { return { processed }; }) - // Static file serving in production - .get("/*", async ({ request }) => { - if (process.env.NODE_ENV === "production") { - const url = new URL(request.url); - const filePath = url.pathname === "/" ? "/index.html" : url.pathname; - const file = Bun.file( - path.join(__dirname, "../../frontend/dist", filePath), - ); - if (await file.exists()) { - return new Response(file); - } - // Fallback to index.html for client-side routing - return new Response( - Bun.file(path.join(__dirname, "../../frontend/dist/index.html")), - ); - } - throw new Error("Not found"); + // Serve static files in production + .use(staticPlugin({ + assets: process.env.FRONTEND_DIST_PATH || path.join(process.cwd(), "../frontend/dist"), + prefix: "/", + indexHTML: true // Enable SPA routing + })) + .get("/debug/env", () => { + return { + cwd: process.cwd(), + frontendPath: process.env.FRONTEND_DIST_PATH || path.join(process.cwd(), "../frontend/dist"), + resolvedPath: path.resolve(process.env.FRONTEND_DIST_PATH || path.join(process.cwd(), "../frontend/dist")), + env: process.env.NODE_ENV + }; }) .onError(({ error }) => { logger.error("Request error:", error); diff --git a/backend/src/services/twitter/client.ts b/backend/src/services/twitter/client.ts index 4230d1c..58382d2 100644 --- a/backend/src/services/twitter/client.ts +++ b/backend/src/services/twitter/client.ts @@ -23,10 +23,8 @@ export class TwitterService { private async setCookiesFromArray(cookies: TwitterCookie[]) { const cookieStrings = cookies.map( (cookie) => - `${cookie.name}=${cookie.value}; Domain=${cookie.domain}; Path=${cookie.path}; ${ - cookie.secure ? "Secure" : "" - }; ${cookie.httpOnly ? "HttpOnly" : ""}; SameSite=${ - cookie.sameSite || "Lax" + `${cookie.name}=${cookie.value}; Domain=${cookie.domain}; Path=${cookie.path}; ${cookie.secure ? "Secure" : "" + }; ${cookie.httpOnly ? "HttpOnly" : ""}; SameSite=${cookie.sameSite || "Lax" }`, ); await this.client.setCookies(cookieStrings); diff --git a/bun.lockb b/bun.lockb index 367fd44fd3079c1c51cd8bccf8e28d56fccdacfc..025dc46e86d6949870c80cb6ab2c7aee0fc8d763 100755 GIT binary patch delta 44322 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 Y45;V|W{@s3?hjBt0}E8uS9aFJ0JMqVV*mgE diff --git a/fly.toml b/fly.toml index 3056e29..efaa1e7 100644 --- a/fly.toml +++ b/fly.toml @@ -29,4 +29,3 @@ primary_region = 'den' memory = '1gb' cpu_kind = 'shared' cpus = 1 - \ No newline at end of file diff --git a/litefs.yml b/litefs.yml index 26bac5d..f2fc7c6 100644 --- a/litefs.yml +++ b/litefs.yml @@ -33,6 +33,7 @@ proxy: # the last command to be long-running (e.g. an application server). When the # last command exits, LiteFS is shut down. exec: + - cmd: "bun run db:push" - cmd: "bun run start" # The lease section specifies how the cluster will be managed. We're using the diff --git a/package.json b/package.json index ebc7f57..b7c47f4 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "dev": "bunx turbo run dev", "build": "bunx turbo run build", "start": "NODE_ENV=production cd backend && bun run dist/index.js", + "db:push": "cd backend && bun run db:push", "lint": "bunx turbo run lint", "deploy:init": "fly launch && fly consul attach", "deploy": "fly deploy", From 7e80610ccf979773e3ea3d824c249e42ea810315 Mon Sep 17 00:00:00 2001 From: Elliot Braem Date: Thu, 16 Jan 2025 09:59:52 -0700 Subject: [PATCH 2/3] fmt --- backend/src/index.ts | 25 +++++++++++++++++-------- backend/src/services/twitter/client.ts | 6 ++++-- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index b92c901..19e621a 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -212,17 +212,26 @@ export async function main() { return { processed }; }) // Serve static files in production - .use(staticPlugin({ - assets: process.env.FRONTEND_DIST_PATH || path.join(process.cwd(), "../frontend/dist"), - prefix: "/", - indexHTML: true // Enable SPA routing - })) + .use( + staticPlugin({ + assets: + process.env.FRONTEND_DIST_PATH || + path.join(process.cwd(), "../frontend/dist"), + prefix: "/", + indexHTML: true, // Enable SPA routing + }), + ) .get("/debug/env", () => { return { cwd: process.cwd(), - frontendPath: process.env.FRONTEND_DIST_PATH || path.join(process.cwd(), "../frontend/dist"), - resolvedPath: path.resolve(process.env.FRONTEND_DIST_PATH || path.join(process.cwd(), "../frontend/dist")), - env: process.env.NODE_ENV + frontendPath: + process.env.FRONTEND_DIST_PATH || + path.join(process.cwd(), "../frontend/dist"), + resolvedPath: path.resolve( + process.env.FRONTEND_DIST_PATH || + path.join(process.cwd(), "../frontend/dist"), + ), + env: process.env.NODE_ENV, }; }) .onError(({ error }) => { diff --git a/backend/src/services/twitter/client.ts b/backend/src/services/twitter/client.ts index 58382d2..4230d1c 100644 --- a/backend/src/services/twitter/client.ts +++ b/backend/src/services/twitter/client.ts @@ -23,8 +23,10 @@ export class TwitterService { private async setCookiesFromArray(cookies: TwitterCookie[]) { const cookieStrings = cookies.map( (cookie) => - `${cookie.name}=${cookie.value}; Domain=${cookie.domain}; Path=${cookie.path}; ${cookie.secure ? "Secure" : "" - }; ${cookie.httpOnly ? "HttpOnly" : ""}; SameSite=${cookie.sameSite || "Lax" + `${cookie.name}=${cookie.value}; Domain=${cookie.domain}; Path=${cookie.path}; ${ + cookie.secure ? "Secure" : "" + }; ${cookie.httpOnly ? "HttpOnly" : ""}; SameSite=${ + cookie.sameSite || "Lax" }`, ); await this.client.setCookies(cookieStrings); From aff8192ac583d734b9c8b4828037c98ea099faf8 Mon Sep 17 00:00:00 2001 From: Elliot Braem Date: Thu, 16 Jan 2025 10:01:07 -0700 Subject: [PATCH 3/3] near protocol rewards --- .github/near-rewards.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/near-rewards.yml diff --git a/.github/near-rewards.yml b/.github/near-rewards.yml new file mode 100644 index 0000000..16ed2b3 --- /dev/null +++ b/.github/near-rewards.yml @@ -0,0 +1,28 @@ +name: NEAR Protocol Rewards Tracking +on: + schedule: + - cron: '0 */12 * * *' # Every 12 hours + workflow_dispatch: # Manual trigger + push: + branches: [ main ] # Start on main branch updates + +jobs: + calculate-rewards: + runs-on: ubuntu-latest + permissions: + contents: read + issues: read + pull-requests: read + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '18' + + - name: Calculate Rewards + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPO: ${{ github.repository }} + run: | + npm install -g near-protocol-rewards@latest + near-protocol-rewards calculate \ No newline at end of file