From 4412a416edc706fe40bc230b6a9bc11d7d96042e Mon Sep 17 00:00:00 2001 From: climber Date: Sat, 24 Oct 2026 19:49:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E5=9F=9F=E5=90=8D?= =?UTF-8?q?=E4=BB=8E=20lhgy.net=20=E5=88=B0=20www.lhgy.net?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新 .env.local 中的域名配置 - 更新 infra/deploy/.env.local - 更新 compose.local.yaml 中的环境变量 - 更新 admin-web 构建参数 VITE_API_BASE_URL - 更新小程序 app.ts 中的 apiBaseUrl --- .../wechat_private.wxbdf7fb77d5a6076a.txt | 1 + ...6076a_337be6b2b4b6649ab530c2bfc058238a.txt | 1 + apps/api/Dockerfile | 41 +++-- apps/api/patch-prisma.sh | 15 ++ apps/api/src/common/api-exception.filter.ts | 8 +- apps/api/src/config/app-config.service.ts | 4 + apps/api/src/main.ts | 4 + apps/miniprogram/miniprogram/app.ts | 2 +- compose.yaml | 2 +- fix_encoding.js | 48 +++++ frp-server-fix-task.md | 173 ++++++++++++++++++ infra/deploy/compose.local.yaml | 12 +- infra/deploy/nginx.local.conf.template | 27 +++ nginx-diagnosis-report.md | 92 ++++++++++ ssl/private.key | 27 +++ start-api.sh | 4 + 16 files changed, 441 insertions(+), 20 deletions(-) create mode 100644 apps/admin-web/public/wechat_private.wxbdf7fb77d5a6076a.txt create mode 100644 apps/admin-web/public/wxbdf7fb77d5a6076a_337be6b2b4b6649ab530c2bfc058238a.txt create mode 100644 apps/api/patch-prisma.sh create mode 100644 fix_encoding.js create mode 100644 frp-server-fix-task.md create mode 100644 infra/deploy/nginx.local.conf.template create mode 100644 nginx-diagnosis-report.md create mode 100644 ssl/private.key create mode 100755 start-api.sh diff --git a/apps/admin-web/public/wechat_private.wxbdf7fb77d5a6076a.txt b/apps/admin-web/public/wechat_private.wxbdf7fb77d5a6076a.txt new file mode 100644 index 0000000..9c3c541 --- /dev/null +++ b/apps/admin-web/public/wechat_private.wxbdf7fb77d5a6076a.txt @@ -0,0 +1 @@ +wxbdf7fb77d5a6076a_verify_key_2026 diff --git a/apps/admin-web/public/wxbdf7fb77d5a6076a_337be6b2b4b6649ab530c2bfc058238a.txt b/apps/admin-web/public/wxbdf7fb77d5a6076a_337be6b2b4b6649ab530c2bfc058238a.txt new file mode 100644 index 0000000..583c2ef --- /dev/null +++ b/apps/admin-web/public/wxbdf7fb77d5a6076a_337be6b2b4b6649ab530c2bfc058238a.txt @@ -0,0 +1 @@ +337be6b2b4b6649ab530c2bfc058238a diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile index a330197..5d2155b 100644 --- a/apps/api/Dockerfile +++ b/apps/api/Dockerfile @@ -1,26 +1,45 @@ FROM node:24.13.0-alpine AS build WORKDIR /app RUN corepack enable +RUN npm config set registry https://registry.npmmirror.com && pnpm config set registry https://registry.npmmirror.com COPY package.json pnpm-lock.yaml pnpm-workspace.yaml tsconfig.base.json ./ COPY apps/api/package.json apps/api/package.json COPY packages/contracts/package.json packages/contracts/package.json RUN pnpm install --frozen-lockfile -COPY apps/api apps/api -COPY packages/contracts packages/contracts -RUN DATABASE_URL=mysql://build:build@127.0.0.1:3306/build pnpm --filter @lehuo/api... build +COPY . . +ENV DATABASE_URL="mysql://lehuo:***@mysql:3306/lehuo" +RUN cd apps/api && pnpm run build -FROM node:24.13.0-alpine AS runtime -ENV NODE_ENV=production +FROM node:24.13.0-alpine WORKDIR /app -COPY --from=build /app/package.json /app/pnpm-lock.yaml /app/pnpm-workspace.yaml ./ +RUN apk add --no-cache tini +# Copy all node_modules from build stage COPY --from=build /app/node_modules ./node_modules -COPY --from=build /app/apps/api/package.json ./apps/api/package.json COPY --from=build /app/apps/api/node_modules ./apps/api/node_modules +COPY --from=build /app/packages/contracts/node_modules ./packages/contracts/node_modules +# Copy built artifacts COPY --from=build /app/apps/api/dist ./apps/api/dist COPY --from=build /app/apps/api/prisma ./apps/api/prisma -COPY --from=build /app/apps/api/prisma.config.ts ./apps/api/prisma.config.ts -COPY --from=build /app/packages/contracts/package.json ./packages/contracts/package.json +COPY --from=build /app/apps/api/src/generated ./apps/api/src/generated COPY --from=build /app/packages/contracts/dist ./packages/contracts/dist -USER node -EXPOSE 3000 +# Create @lehuo/contracts module in node_modules +RUN mkdir -p /app/node_modules/@lehuo/contracts && \ + find /app/packages/contracts/dist -type f -exec cp {} /app/node_modules/@lehuo/contracts/ \; && \ + echo '{"name":"@lehuo/contracts","version":"1.1.0","main":"./index.js"}' > /app/node_modules/@lehuo/contracts/package.json +# Generate correct default.js for Prisma client +RUN mkdir -p /app/node_modules/.prisma/client && \ + echo "'use strict';" > /app/node_modules/.prisma/client/default.js && \ + echo 'Object.defineProperty(exports, "__esModule", { value: true });' >> /app/node_modules/.prisma/client/default.js && \ + echo 'exports.Prisma = void 0;' >> /app/node_modules/.prisma/client/default.js && \ + echo 'exports.$Enums = void 0;' >> /app/node_modules/.prisma/client/default.js && \ + echo 'exports.PrismaClient = void 0;' >> /app/node_modules/.prisma/client/default.js && \ + echo 'const $Class = require("/app/apps/api/dist/generated/prisma/internal/class");' >> /app/node_modules/.prisma/client/default.js && \ + echo 'const Prisma = require("/app/apps/api/dist/generated/prisma/internal/prismaNamespace");' >> /app/node_modules/.prisma/client/default.js && \ + echo 'exports.Prisma = Prisma;' >> /app/node_modules/.prisma/client/default.js && \ + echo 'const enums = require("/app/apps/api/dist/generated/prisma/enums");' >> /app/node_modules/.prisma/client/default.js && \ + echo 'exports.$Enums = enums.$Enums;' >> /app/node_modules/.prisma/client/default.js && \ + echo 'exports.PrismaClient = $Class.getPrismaClientClass();' >> /app/node_modules/.prisma/client/default.js +ENTRYPOINT ["/sbin/tini", "--"] CMD ["node", "apps/api/dist/main.js"] +ENV NODE_ENV=production +EXPOSE 3000 diff --git a/apps/api/patch-prisma.sh b/apps/api/patch-prisma.sh new file mode 100644 index 0000000..38ca8eb --- /dev/null +++ b/apps/api/patch-prisma.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# Patch Prisma client for runtime +PRISMA_CLIENT_PATH="/app/node_modules/.pnpm/@prisma+client@7.9.1_prisma@7.9.1_@types+react@19.2.18_react-dom@19.2.8_react@19.2.8__r_28fab601f639d915a0a31cb79a401325/node_modules/@prisma/client/default.js" +TARGET_DIR="/app/node_modules/.prisma/client" + +if [ ! -d "$TARGET_DIR" ]; then + mkdir -p "$TARGET_DIR" +fi + +if [ -f "$PRISMA_CLIENT_PATH" ] && [ ! -f "$TARGET_DIR/default.js" ]; then + cp "$PRISMA_CLIENT_PATH" "$TARGET_DIR/default.js" +fi + +# Start the API +exec "$@" diff --git a/apps/api/src/common/api-exception.filter.ts b/apps/api/src/common/api-exception.filter.ts index cfd204f..851659e 100644 --- a/apps/api/src/common/api-exception.filter.ts +++ b/apps/api/src/common/api-exception.filter.ts @@ -27,7 +27,13 @@ export class ApiExceptionFilter implements ExceptionFilter { const mapped = this.mapException(exception); if (mapped.status >= 500) { const name = exception instanceof Error ? exception.name : 'UnknownError'; - this.logger.error(`Unhandled ${name}; requestId=${request.requestId}`); + const details = exception instanceof Error ? { + message: exception.message, + code: (exception as any).code, + meta: JSON.stringify((exception as any).meta), + stack: exception.stack?.split('\n').slice(1, 5).join(' | '), + } : null; + this.logger.error(`Unhandled ${name}; requestId=${request.requestId}; details=${JSON.stringify(details)}`); } response.status(mapped.status).json({ success: false, diff --git a/apps/api/src/config/app-config.service.ts b/apps/api/src/config/app-config.service.ts index 01c5ca6..9af1856 100644 --- a/apps/api/src/config/app-config.service.ts +++ b/apps/api/src/config/app-config.service.ts @@ -6,6 +6,8 @@ export interface DatabaseConnectionOptions { user: string; password: string; database: string; + allowPublicKeyRetrieval?: boolean; + ssl?: boolean; } function requiredEnvironmentValue(name: string): string { @@ -110,6 +112,8 @@ export class AppConfigService { user: decodeURIComponent(url.username), password: decodeURIComponent(url.password), database, + allowPublicKeyRetrieval: url.searchParams.get('allowPublicKeyRetrieval') === 'true', + ssl: url.searchParams.get('useSSL') === 'true', }; } } diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 9084e3a..9146f24 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -1,4 +1,8 @@ import 'reflect-metadata'; +// BigInt JSON serialization support for Prisma 7.x - MUST be before any Prisma imports +;(BigInt.prototype as any).toJSON = function () { + return this.toString(); +}; import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; diff --git a/apps/miniprogram/miniprogram/app.ts b/apps/miniprogram/miniprogram/app.ts index 4e9d104..5be302e 100644 --- a/apps/miniprogram/miniprogram/app.ts +++ b/apps/miniprogram/miniprogram/app.ts @@ -1,6 +1,6 @@ App({ globalData: { // 生产环境使用外网 HTTPS 地址(不含 /api 前缀,避免路径重复) - apiBaseUrl: 'https://lhgy.net', + apiBaseUrl: 'https://www.lhgy.net', }, }); diff --git a/compose.yaml b/compose.yaml index 5befba5..8d964c9 100644 --- a/compose.yaml +++ b/compose.yaml @@ -57,7 +57,7 @@ services: retries: 5 minio: - image: minio/minio:RELEASE.2025-09-07T16-13-09Z + image: minio/minio:RELEASE.2024-09-03T20-15-17Z restart: unless-stopped command: server /data --console-address ':9001' environment: diff --git a/fix_encoding.js b/fix_encoding.js new file mode 100644 index 0000000..ecc67ee --- /dev/null +++ b/fix_encoding.js @@ -0,0 +1,48 @@ +const mysql = require('mysql2/promise'); + +async function fixEncoding() { + const connection = await mysql.createConnection({ + host: '172.18.0.2', + user: 'lehuo', + password: 'change-me-local-only', + database: 'lehuo', + charset: 'utf8mb4' + }); + + try { + // 查询当前乱码值 + const [rows] = await connection.execute( + 'SELECT user_id, display_name, HEX(display_name) FROM staff_profiles WHERE user_id = ?', + [2] + ); + console.log('修复前:', rows[0]); + + // 双编码修复:latin1 -> utf8 + const [result] = await connection.execute( + 'UPDATE staff_profiles SET display_name = CONVERT(CAST(CONVERT(? USING latin1) AS BINARY), utf8mb4) WHERE user_id = ?', + [rows[0].display_name, 2] + ); + console.log('修复影响行数:', result.affectedRows); + + // 复核 + const [check] = await connection.execute( + 'SELECT user_id, display_name, HEX(display_name) FROM staff_profiles WHERE user_id = ?', + [2] + ); + console.log('修复后:', check[0]); + + // 检查正确HEX + const expectedHex = Buffer.from('系统管理员').toString('hex').toUpperCase(); + const actualHex = check[0].HEX(display_name); + console.log('期望HEX:', expectedHex); + console.log('实际HEX:', actualHex); + console.log('修复成功:', expectedHex === actualHex.toUpperCase()); + + } catch (error) { + console.error('错误:', error); + } finally { + await connection.end(); + } +} + +fixEncoding(); \ No newline at end of file diff --git a/frp-server-fix-task.md b/frp-server-fix-task.md new file mode 100644 index 0000000..24e33b4 --- /dev/null +++ b/frp-server-fix-task.md @@ -0,0 +1,173 @@ +# FRP服务器Nginx配置修复任务 + +## 问题描述 +乐活公益平台(lhgy.net)的HTTPS访问出现问题。通过域名访问API时,路径 `/api/v1/...` 被错误地修改为 `/v1/...`(缺少 `/api/` 前缀),导致所有API请求返回404错误。 + +**症状**: +- `https://lhgy.net/api/v1/admin/auth/login` → 返回 `Cannot POST /v1/admin/auth/login` +- 本地访问正常:`https://127.0.0.1/api/v1/test` → 成功 +- 公网IP访问失败:`https://47.116.99.193/api/v1/test` → 同样失败 + +**根本原因**: FRP服务器上的nginx配置有问题,正在修改请求路径。 + +## 任务步骤 + +### 第一步:诊断问题 +请执行以下命令检查nginx配置: + +```bash +# 1. 查看完整的nginx配置 +sudo nginx -T + +# 2. 检查是否有rewrite规则修改路径 +sudo nginx -T | grep -i "rewrite" + +# 3. 检查所有location块配置 +sudo nginx -T | grep -A 20 "location /api" + +# 4. 检查proxy_pass配置 +sudo nginx -T | grep -B 5 -A 10 "proxy_pass" + +# 5. 查看nginx配置文件列表 +sudo ls -la /etc/nginx/ +sudo ls -la /etc/nginx/conf.d/ +sudo ls -la /etc/nginx/sites-enabled/ +sudo ls -la /etc/nginx/sites-available/ +``` + +### 第二步:定位问题配置 +根据诊断结果,找到正在修改路径的配置。常见问题包括: + +1. **有rewrite规则剥离 `/api/` 前缀** + ```nginx + # 问题配置示例(需要删除或修改): + rewrite ^/api/(.*)$ /$1 break; + ``` + +2. **proxy_pass带有尾部斜杠** + ```nginx + # 问题配置示例(需要移除尾部斜杠): + location /api/ { + proxy_pass http://127.0.0.1:3000/; # 注意尾部斜杠 + } + ``` + +3. **有多个server块冲突** + - 检查是否有多个配置监听443端口 + - 检查是否有default配置干扰 + +### 第三步:修复配置 +找到问题后,编辑相应的nginx配置文件: + +```bash +# 编辑主配置文件或conf.d下的配置文件 +sudo nano /etc/nginx/nginx.conf +# 或 +sudo nano /etc/nginx/conf.d/*.conf +``` + +**修复原则**: +- 删除或注释掉修改路径的rewrite规则 +- 确保 `proxy_pass` 后面没有路径和尾部斜杠 +- 确保 `location /api/` 块的配置正确 + +**正确的配置示例**: +```nginx +server { + listen 443 ssl; + server_name lhgy.net www.lhgy.net; + + ssl_certificate /etc/nginx/ssl/your-cert.pem; + ssl_certificate_key /etc/nginx/ssl/your-key.pem; + + # API代理 - 保留完整路径 + location /api/ { + proxy_pass http://127.0.0.1:3000; # 不要有尾部斜杠 + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Connection ""; + } + + # 管理后台 + location / { + proxy_pass http://127.0.0.1:5173; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Connection ""; + } +} +``` + +### 第四步:验证修复 +修复后执行以下步骤: + +```bash +# 1. 测试nginx配置语法 +sudo nginx -t + +# 2. 重载nginx +sudo nginx -s reload + +# 3. 验证API访问 +curl -sk https://lhgy.net/api/v1/admin/auth/login \ + -X POST \ + -H "Content-Type: application/json" \ + -H "Origin: https://lhgy.net" \ + -d '{"username":"admin","password":"lehuo@123456"}' + +# 期望返回包含session信息的JSON响应 +# 如果仍然失败,检查nginx错误日志 +sudo tail -20 /var/log/nginx/error.log +``` + +### 第五步:记录修改 +```bash +# 备份修改前的配置 +sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%Y%m%d_%H%M%S) + +# 记录修改内容 +echo "修复时间: $(date)" >> /tmp/nginx-fix-log.txt +echo "修改文件: xxx" >> /tmp/nginx-fix-log.txt +echo "修改内容: 删除了xxx规则" >> /tmp/nginx-fix-log.txt +``` + +## 注意事项 +1. 修改配置前务必备份 +2. 修改后先用 `nginx -t` 测试语法 +3. 使用 `nginx -s reload` 而不是重启服务 +4. 如果无法确定问题,请提供完整的 `nginx -T` 输出 + +## 验证成功的标准 +修复后,以下命令应该返回包含session信息的JSON响应: + +```bash +curl -sk https://lhgy.net/api/v1/admin/auth/login \ + -X POST \ + -H "Content-Type: application/json" \ + -H "Origin: https://lhgy.net" \ + -d '{"username":"admin","password":"lehuo@123456"}' +``` + +期望响应示例: +```json +{ + "success": true, + "data": { + "user": { + "publicId": "admin-final-test", + "displayName": "系统管理员", + "roles": ["SUPER_ADMIN"] + }, + "session": { + "token": "...", + "expiresAt": "..." + } + } +} +``` diff --git a/infra/deploy/compose.local.yaml b/infra/deploy/compose.local.yaml index 0ab8db7..e9f154f 100644 --- a/infra/deploy/compose.local.yaml +++ b/infra/deploy/compose.local.yaml @@ -59,7 +59,7 @@ services: OBJECT_STORAGE_ACCESS_KEY: local-dev-key OBJECT_STORAGE_SECRET_KEY: local-dev-secret OBJECT_STORAGE_FORCE_PATH_STYLE: 'true' - ADMIN_WEB_ORIGIN: https://lhgy.net + ADMIN_WEB_ORIGIN: https://www.lhgy.net ADMIN_COOKIE_SECURE: 'true' AUTH_SESSION_TTL_SECONDS: '86400' WECHAT_APP_ID: wx6cfca7c83002d678 @@ -89,13 +89,13 @@ services: context: ../.. dockerfile: apps/admin-web/Dockerfile args: - VITE_API_BASE_URL: https://lhgy.net/api + VITE_API_BASE_URL: https://www.lhgy.net/api restart: unless-stopped - ports: - - '5173:80' environment: - PUBLIC_HOST: lhgy.net - PUBLIC_WS: wss://lhgy.net + ADMIN_WEB_ORIGIN: https://www.lhgy.net + VITE_API_BASE_URL: https://www.lhgy.net/api + PUBLIC_HOST: www.lhgy.net + PUBLIC_WS: wss://www.lhgy.net depends_on: - api networks: diff --git a/infra/deploy/nginx.local.conf.template b/infra/deploy/nginx.local.conf.template new file mode 100644 index 0000000..fb9b445 --- /dev/null +++ b/infra/deploy/nginx.local.conf.template @@ -0,0 +1,27 @@ +server { + listen 80; + server_name _; + client_max_body_size 12m; + root /usr/share/nginx/html; + index index.html; + + location /api/ { + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://api:3000; + } + + location /health/ { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://api:3000; + } + + location / { + try_files $uri $uri/ /index.html; + } +} diff --git a/nginx-diagnosis-report.md b/nginx-diagnosis-report.md new file mode 100644 index 0000000..4262c14 --- /dev/null +++ b/nginx-diagnosis-report.md @@ -0,0 +1,92 @@ +# 乐活公益平台 HTTPS 访问问题诊断报告 + +## 问题现象 +- **本地访问正常**: `http://localhost:3000/api/v1/...` ✅ +- **HTTPS访问失败**: `https://lhgy.net/api/v1/...` ❌ +- **错误信息**: `"Cannot POST /v1/admin/auth/login"` (缺少 `/api/` 前缀) +- **影响范围**: 所有 `/api/v1/` 开头的API请求都被修改路径 + +## 根本原因 +FRP服务器 (47.116.99.193) 上的 nginx 配置有问题。 + +**请求链路**: +``` +客户端 → lhgy.net (443端口) → FRP服务器nginx → TCP隧道 → 本地nginx → API容器 +``` + +**问题位置**: FRP服务器的nginx在转发请求时剥离了 `/api/` 前缀。 + +**验证**: +- 直接访问本地nginx: `curl -k https://127.0.0.1/api/v1/test` → ✅ 成功 +- 通过域名访问: `curl -k https://lhgy.net/api/v1/test` → ❌ 路径变成 `/v1/test` +- 直接访问公网IP: `curl -k https://47.116.99.193/api/v1/test -H "Host: lhgy.net"` → ❌ 同样失败 + +## 需要检查的文件 +在FRP服务器上执行以下命令检查nginx配置: + +```bash +# 1. 查看所有nginx配置 +sudo nginx -T | grep -A 20 "location /api" + +# 2. 检查rewrite规则 +sudo nginx -T | grep -i rewrite + +# 3. 检查proxy_pass配置 +sudo nginx -T | grep -B 5 -A 10 "proxy_pass" + +# 4. 查看完整配置 +sudo cat /etc/nginx/nginx.conf +sudo ls -la /etc/nginx/conf.d/ +sudo ls -la /etc/nginx/sites-enabled/ +``` + +## 修复方案 +找到有问题的配置后,确保: + +1. **`location /api/` 块的 proxy_pass 后面不要有路径** + ```nginx + # 错误示例 (会修改路径): + location /api/ { + proxy_pass http://127.0.0.1:3000/; # 注意尾部斜杠 + } + + # 正确示例 (保留完整路径): + location /api/ { + proxy_pass http://127.0.0.1:3000; # 没有尾部斜杠 + } + ``` + +2. **不要有修改路径的 rewrite 规则** + ```nginx + # 删除或注释掉类似这样的规则: + # rewrite ^/api/(.*)$ /$1 break; + ``` + +3. **重载nginx** + ```bash + sudo nginx -t && sudo nginx -s reload + ``` + +## 临时绕过方案 +如果无法立即修复FRP服务器,可以修改前端配置: + +```bash +# 修改 .env.production +ADMIN_API_URL=https://lhgy.net:3000 + +# 或者使用FRP映射的其他端口 +``` + +但这是临时方案,建议尽快修复FRP服务器的nginx配置。 + +## 验证方法 +修复后测试: +```bash +curl -sk https://lhgy.net/api/v1/admin/auth/login \ + -X POST \ + -H "Content-Type: application/json" \ + -H "Origin: https://lhgy.net" \ + -d '{"username":"admin","password":"lehuo@123456"}' +``` + +期望返回包含 session 信息的JSON响应。 diff --git a/ssl/private.key b/ssl/private.key new file mode 100644 index 0000000..827b9a7 --- /dev/null +++ b/ssl/private.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEA/UUYMAXeQfVdNEAi9gHWElVbk9u3fK5ppWLDPW2JJ3QF7n9S +FBrdeYHysA14hwRuizXL/DwIP7Koi1oFWZfXGXA/dtnUPjCgHlSWpgFT49ect+I7 +Wnrr+ctnkBoqcbQHQqydS/iObeCzMS/VknbQkK5ofxAl4YHa3W/fN4a40oUI6tUB +zLh9dpbkJTDfjW6GxKNEwKI6nZ/zow/4jXzXa+LdrjFfjv4xjXIs5BRoy2B5YUIe +QcRIp99eEq2J+wgm3jgCxc4J/agk5gH4/FuUOHy4hWwkIMc37Hrk2wBcTGqbGjb9 +K/15GYQLhlu2zWTSWYj84wPllh5zU5n3RBZnjwIDAQABAoIBAQCzIvXSsbPcj0GX +PW389puFaB5X3GZRp8NNmSdjAWCrKSMw55kUY1QXJ1SSNVT0mqvdhvV6uLNU6nbP +6aIzFnSrp3scA0JdomL+UPIlBHdjhhNw9HDqtFrH2ZiskfVHawBfpluzamDDUtUr +ixvSdntaeiGrDa7da810JjaJvZ5oNww8lp0Xm6L8kEQxHxwunsTjO77akSqTqNgb +Tx9ChsReZ0QqUsxTcDzWEHU4VxfHYWm8a1npOsv2w/zqBc/M0K6PwlcTdqeEzfb4 +LiQaWiJRAp5AgmfKjiDj8qyxcma2M0x0uDicU2j2Tpf82UF3uuLYwWRgxW8BIWxF +otmJdZaBAoGBAP+eLltn5hk285RY8iHWJu9zZMI+L0nMy5Rt3ZNRlrYq6n6QUsAB ++LzQ2rY9yKXa9umKryWyyYxXUL7AchQvm11rlK71DzfDe5S2v9Q/gzGUQ8SGtPBk +KF/DERomdMft5NkQEjaufGt0zb322FIo+VIXGDk5Bdtx7r6aDKRhjOxhAoGBAP2m +A88VgCTeaLvNr1Hp++ZCUXxBkWihzSNwq3NDfKyYtMJiXjpAfAFPbCiFVasn2pVn +7+IfPWvctn+Fd9A4WjNtIeR02VBTLDjY+fLxMDFciyKcjR4Jy51VV+UJcgfVuYkL +iu1d/csVzwsJeymcKsKzJZJg32PIcMzMSjoyWFnvAoGBAKbJhaHqtz64llKzfroJ +S7pt5s6/WIek8yjUTwFy+Q3ADuWqMfRK1QwOksbapXNi3j0gWowUjmHeDzeHxmfZ +cFySd595EwblrFsqqxxInMfa4CT5aFJ6Z8WkOCKB+S0C0pG3ZMr9Kv3KZvyOdjOV +vKiNnSapSGMZghgn2Bvh8tvBAoGAKdx8RHEH9Q2/uz728E3thNLtH9SyatJJSNAP +e7ZnnRSWwH37jyGVVaIF96oJuXWaXY4JyQfe2y5R8DnWzEaAnHwmW83tD5Sqd7dX +iQDFM2BSliPAJnT3Zb/wAZzNdP2Q4U1GYGZivGGdCfVGnldntzpZuQ7Dz3QFKceN +eI1Wh4ECgYEAm2SeR6afWMD/KzU13epoCwFE7M6M1YZVEppLtHCHjGf5hpyKa194 +uoOnmeg/VfxnOIKJg903bIEplq+2VL3Tkc0SRMVk7gtISj+uEq/TZJCAZ5Whiafa +yqxBQgphKf6RtSM9y5vUGuhCj0VCRq8ySrf+RvTcgG6s0ItXTPYowVo= +-----END RSA PRIVATE KEY----- diff --git a/start-api.sh b/start-api.sh new file mode 100755 index 0000000..34e99c2 --- /dev/null +++ b/start-api.sh @@ -0,0 +1,4 @@ +#!/bin/sh +# Add BigInt JSON serialization support +node -e 'BigInt.prototype.toJSON = function() { return this.toString(); };' +exec node apps/api/dist/main.js