ваше сообщение коммита
This commit is contained in:
@@ -1 +0,0 @@
|
|||||||
{"AccountTag":"a67861072a144cdd746e9c9bdd8476fe","TunnelSecret":"NCu/3BUoqAbF5kwXfs3rTjU9QUiVvXv7OM27BrUd/50Kf/wthq2rIH0G+Eu76LK8JQon/UQBUbQPoRPRY3qbtA==","TunnelID":"a765a217-5312-48f8-9bb7-5a7ef56602b8"}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
tunnel: a765a217-5312-48f8-9bb7-5a7ef56602b8
|
|
||||||
credentials-file: /etc/cloudflared/a765a217-5312-48f8-9bb7-5a7ef56602b8.json
|
|
||||||
|
|
||||||
ingress:
|
|
||||||
- hostname: hb3-accelerator.com
|
|
||||||
service: http://dapp-frontend:5173
|
|
||||||
- service: http_status:404
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
FROM alpine:3.20 as base
|
|
||||||
RUN apk add --no-cache bash curl wget
|
|
||||||
|
|
||||||
FROM cloudflare/cloudflared:2025.6.1 as src
|
|
||||||
|
|
||||||
FROM base
|
|
||||||
COPY --from=src /usr/local/bin/cloudflared /usr/local/bin/cloudflared
|
|
||||||
USER nobody
|
|
||||||
ENTRYPOINT ["bash", "/start-cloudflared.sh"]
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "ест3",
|
|
||||||
"symbol": "тест3",
|
|
||||||
"location": "07522, United States, Paterson",
|
|
||||||
"isicCodes": [
|
|
||||||
"0111"
|
|
||||||
],
|
|
||||||
"tokenAddress": "0xFcF1304FAe013d52e09a1497a47988d125a9e2Ed",
|
|
||||||
"timelockAddress": "0xbcF1daCB040b681129Df122f67a0D2eC23DA99B6",
|
|
||||||
"governorAddress": "0xC8aC4c9431B57934eEccac6322352abfcE8a994a",
|
|
||||||
"creationBlock": 8626309,
|
|
||||||
"creationTimestamp": 1750859640,
|
|
||||||
"deployedManually": true
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1752,3 +1752,281 @@
|
|||||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-06-28T23:06:53.889Z"}
|
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-06-28T23:06:53.889Z"}
|
||||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-06-28T23:06:53.890Z"}
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-06-28T23:06:53.890Z"}
|
||||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-06-28T23:06:53.890Z"}
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-06-28T23:06:53.890Z"}
|
||||||
|
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:13:39.979Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:13:39.982Z"}
|
||||||
|
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.153Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.154Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.154Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.154Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.154Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.155Z"}
|
||||||
|
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:17:39.759Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:17:39.760Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:17:39.760Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:17:39.760Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:17:39.761Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:18:26.622Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:18:26.623Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.366Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.370Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.371Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.372Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.375Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.376Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.376Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.377Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.380Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.381Z"}
|
||||||
|
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:23.948Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:23.949Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:23.949Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:23.950Z"}
|
||||||
|
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:43.017Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:43.018Z"}
|
||||||
|
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:58.241Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:35:30.659Z"}
|
||||||
|
{"level":"error","message":"Uncaught Exception: Not authenticated","stack":"Error: Not authenticated\n at Connection.openBox (/app/node_modules/imap/lib/Connection.js:409:11)\n at Connection.<anonymous> (/app/services/emailBot.js:105:19)\n at Object.onceWrapper (node:events:638:28)\n at Connection.emit (node:events:536:35)\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:1623:12)\n at Connection._resTagged (/app/node_modules/imap/lib/Connection.js:1535:22)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:194:10)\n at Parser.emit (node:events:524:28)\n at Parser._resTagged (/app/node_modules/imap/lib/Parser.js:175:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:139:16)","timestamp":"2025-07-03T19:35:45.020Z"}
|
||||||
|
{"level":"error","message":"Uncaught Exception: Cannot read properties of undefined (reading 'type')","stack":"TypeError: Cannot read properties of undefined (reading 'type')\n at Connection._resUntagged (/app/node_modules/imap/lib/Connection.js:1265:52)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:191:10)\n at Parser.emit (node:events:524:28)\n at Parser._resUntagged (/app/node_modules/imap/lib/Parser.js:271:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:137:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:81:21)","timestamp":"2025-07-03T19:36:51.701Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:36:56.893Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:36:56.894Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:36:56.894Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:36:56.895Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:36:56.895Z"}
|
||||||
|
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.227Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.228Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.228Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.228Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.228Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.228Z"}
|
||||||
|
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:37.459Z"}
|
||||||
|
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.234Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.235Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.235Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.235Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.235Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.236Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.236Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:49:48.912Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:49:48.913Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.240Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.240Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.240Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.241Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.241Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.241Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.241Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.568Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.568Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.569Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.569Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.569Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.569Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.569Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.570Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.570Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.570Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:00:23.282Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:00:23.283Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:00:55.560Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:02:36.580Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:02:36.581Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:02:36.581Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:03:08.903Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.543Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.544Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.545Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.545Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.546Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.546Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.546Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.546Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:09:16.584Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:09:16.585Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:09:16.585Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.579Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.580Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.580Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.580Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.580Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.580Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:14:15.535Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:14:15.536Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:14:15.536Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:15:22.204Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:15:22.204Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: write after end","timestamp":"2025-07-03T20:15:51.506Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:16:28.896Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:18:09.935Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:18:09.935Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:18:09.936Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.585Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.585Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.586Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.586Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.587Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.588Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.588Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.588Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.917Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:29:48.813Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:29:48.813Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:29:48.814Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:32:36.545Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:32:36.546Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:32:36.546Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:32:36.546Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:32:36.546Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:22.200Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:22.200Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:22.200Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:22.200Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:22.200Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:56.580Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:37:35.512Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:37:35.513Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:37:35.513Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.918Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.919Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.919Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.919Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.919Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.919Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.920Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.911Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.913Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.913Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.913Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.913Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.913Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.566Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.566Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.566Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.568Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.568Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.568Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.856Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.251Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.199Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.199Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.199Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.201Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.201Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.774Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.344Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:30:51.066Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:30:51.066Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:32:31.458Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:32:31.459Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:32:31.459Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.451Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.452Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.452Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.452Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.120Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.120Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.121Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.121Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.121Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.123Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.123Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.123Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.473Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.473Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.473Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.473Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.474Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.474Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.474Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:51:23.788Z"}
|
||||||
|
{"level":"error","message":"Unhandled Rejection: Cannot use a pool after calling end on the pool","stack":"Error: Cannot use a pool after calling end on the pool\n at /app/node_modules/pg-pool/index.js:45:11\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/app.js:103:20","timestamp":"2025-07-03T21:56:00.872Z"}
|
||||||
|
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T22:06:50.565Z"}
|
||||||
|
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T22:06:50.566Z"}
|
||||||
|
|||||||
@@ -43,7 +43,6 @@
|
|||||||
"express-rate-limit": "^7.5.0",
|
"express-rate-limit": "^7.5.0",
|
||||||
"express-session": "^1.17.3",
|
"express-session": "^1.17.3",
|
||||||
"helmet": "^8.0.0",
|
"helmet": "^8.0.0",
|
||||||
"hnswlib-node": "^3.0.0",
|
|
||||||
"imap": "^0.8.19",
|
"imap": "^0.8.19",
|
||||||
"interface-store": "^6.0.2",
|
"interface-store": "^6.0.2",
|
||||||
"langchain": "^0.3.19",
|
"langchain": "^0.3.19",
|
||||||
|
|||||||
@@ -10,9 +10,12 @@ router.get('/', async (req, res) => {
|
|||||||
|
|
||||||
// Vector Search
|
// Vector Search
|
||||||
try {
|
try {
|
||||||
const vs = await axios.get(process.env.VECTOR_SEARCH_URL || 'http://vector-search:8001/health', { timeout: 2000 });
|
const baseUrl = process.env.VECTOR_SEARCH_URL || 'http://vector-search:8001';
|
||||||
|
const healthUrl = baseUrl.replace(/\/$/, '') + '/health';
|
||||||
|
const vs = await axios.get(healthUrl, { timeout: 2000 });
|
||||||
results.vectorSearch = { status: 'ok', ...vs.data };
|
results.vectorSearch = { status: 'ok', ...vs.data };
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
console.log('Vector Search error:', e.message, 'Status:', e.response?.status);
|
||||||
results.vectorSearch = { status: 'error', error: e.message };
|
results.vectorSearch = { status: 'error', error: e.message };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ const express = require('express');
|
|||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
const { ragAnswer, generateLLMResponse } = require('../services/ragService');
|
const { ragAnswer, generateLLMResponse } = require('../services/ragService');
|
||||||
|
|
||||||
|
router.get('/health', (req, res) => {
|
||||||
|
res.json({ status: 'ok', message: 'RAG service is running' });
|
||||||
|
});
|
||||||
|
|
||||||
router.post('/answer', async (req, res) => {
|
router.post('/answer', async (req, res) => {
|
||||||
const { tableId, question, userTags, product, systemPrompt, priority, date, rules, history, model, language } = req.body;
|
const { tableId, question, userTags, product, systemPrompt, priority, date, rules, history, model, language } = req.body;
|
||||||
try {
|
try {
|
||||||
@@ -24,6 +28,7 @@ router.post('/answer', async (req, res) => {
|
|||||||
});
|
});
|
||||||
res.json({ ...ragResult, llmResponse });
|
res.json({ ...ragResult, llmResponse });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
console.error('[RAG] Error in /answer route:', e);
|
||||||
res.status(500).json({ error: e.message });
|
res.status(500).json({ error: e.message });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,9 +5,16 @@ const { getProviderSettings } = require('./aiProviderSettingsService');
|
|||||||
console.log('[RAG] ragService.js loaded');
|
console.log('[RAG] ragService.js loaded');
|
||||||
|
|
||||||
async function getTableData(tableId) {
|
async function getTableData(tableId) {
|
||||||
|
console.log(`[RAG] getTableData called for tableId: ${tableId}`);
|
||||||
|
|
||||||
const columns = (await db.query('SELECT * FROM user_columns WHERE table_id = $1', [tableId])).rows;
|
const columns = (await db.query('SELECT * FROM user_columns WHERE table_id = $1', [tableId])).rows;
|
||||||
|
console.log(`[RAG] Found ${columns.length} columns:`, columns.map(col => ({ id: col.id, name: col.name, purpose: col.options?.purpose })));
|
||||||
|
|
||||||
const rows = (await db.query('SELECT * FROM user_rows WHERE table_id = $1', [tableId])).rows;
|
const rows = (await db.query('SELECT * FROM user_rows WHERE table_id = $1', [tableId])).rows;
|
||||||
|
console.log(`[RAG] Found ${rows.length} rows:`, rows.map(row => ({ id: row.id, name: row.name })));
|
||||||
|
|
||||||
const cellValues = (await db.query('SELECT * FROM user_cell_values WHERE row_id IN (SELECT id FROM user_rows WHERE table_id = $1)', [tableId])).rows;
|
const cellValues = (await db.query('SELECT * FROM user_cell_values WHERE row_id IN (SELECT id FROM user_rows WHERE table_id = $1)', [tableId])).rows;
|
||||||
|
console.log(`[RAG] Found ${cellValues.length} cell values`);
|
||||||
|
|
||||||
const getColId = purpose => columns.find(col => col.options?.purpose === purpose)?.id;
|
const getColId = purpose => columns.find(col => col.options?.purpose === purpose)?.id;
|
||||||
const questionColId = getColId('question');
|
const questionColId = getColId('question');
|
||||||
@@ -18,9 +25,19 @@ async function getTableData(tableId) {
|
|||||||
const priorityColId = getColId('priority');
|
const priorityColId = getColId('priority');
|
||||||
const dateColId = getColId('date');
|
const dateColId = getColId('date');
|
||||||
|
|
||||||
|
console.log(`[RAG] Column IDs:`, {
|
||||||
|
question: questionColId,
|
||||||
|
answer: answerColId,
|
||||||
|
userTags: userTagsColId,
|
||||||
|
context: contextColId,
|
||||||
|
product: productColId,
|
||||||
|
priority: priorityColId,
|
||||||
|
date: dateColId
|
||||||
|
});
|
||||||
|
|
||||||
const data = rows.map(row => {
|
const data = rows.map(row => {
|
||||||
const cells = cellValues.filter(cell => cell.row_id === row.id);
|
const cells = cellValues.filter(cell => cell.row_id === row.id);
|
||||||
return {
|
const result = {
|
||||||
id: row.id,
|
id: row.id,
|
||||||
question: cells.find(c => c.column_id === questionColId)?.value,
|
question: cells.find(c => c.column_id === questionColId)?.value,
|
||||||
answer: cells.find(c => c.column_id === answerColId)?.value,
|
answer: cells.find(c => c.column_id === answerColId)?.value,
|
||||||
@@ -30,16 +47,29 @@ async function getTableData(tableId) {
|
|||||||
priority: cells.find(c => c.column_id === priorityColId)?.value,
|
priority: cells.find(c => c.column_id === priorityColId)?.value,
|
||||||
date: cells.find(c => c.column_id === dateColId)?.value,
|
date: cells.find(c => c.column_id === dateColId)?.value,
|
||||||
};
|
};
|
||||||
|
console.log(`[RAG] Processed row ${row.id}:`, result);
|
||||||
|
return result;
|
||||||
});
|
});
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function ragAnswer({ tableId, userQuestion, userTags = [], product = null, threshold = 0.3 }) {
|
async function ragAnswer({ tableId, userQuestion, userTags = [], product = null, threshold = 10 }) {
|
||||||
console.log(`[RAG] ragAnswer called: tableId=${tableId}, userQuestion="${userQuestion}"`);
|
console.log(`[RAG] ragAnswer called: tableId=${tableId}, userQuestion="${userQuestion}"`);
|
||||||
|
|
||||||
const data = await getTableData(tableId);
|
const data = await getTableData(tableId);
|
||||||
console.log(`[RAG] Got ${data.length} rows from database`);
|
console.log(`[RAG] Got ${data.length} rows from database`);
|
||||||
|
|
||||||
|
// Подробное логирование данных
|
||||||
|
data.forEach((row, index) => {
|
||||||
|
console.log(`[RAG] Row ${index}:`, {
|
||||||
|
id: row.id,
|
||||||
|
question: row.question,
|
||||||
|
answer: row.answer,
|
||||||
|
userTags: row.userTags,
|
||||||
|
product: row.product
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
const questions = data.map(row => row.question && typeof row.question === 'string' ? row.question.trim() : row.question);
|
const questions = data.map(row => row.question && typeof row.question === 'string' ? row.question.trim() : row.question);
|
||||||
const rowsForUpsert = data.map(row => ({
|
const rowsForUpsert = data.map(row => ({
|
||||||
row_id: row.id,
|
row_id: row.id,
|
||||||
@@ -70,23 +100,53 @@ async function ragAnswer({ tableId, userQuestion, userTags = [], product = null,
|
|||||||
if (rowsForUpsert.length > 0) {
|
if (rowsForUpsert.length > 0) {
|
||||||
results = await vectorSearch.search(tableId, userQuestion, 3);
|
results = await vectorSearch.search(tableId, userQuestion, 3);
|
||||||
console.log(`[RAG] Search completed, got ${results.length} results`);
|
console.log(`[RAG] Search completed, got ${results.length} results`);
|
||||||
|
|
||||||
|
// Подробное логирование результатов поиска
|
||||||
|
results.forEach((result, index) => {
|
||||||
|
console.log(`[RAG] Search result ${index}:`, {
|
||||||
|
row_id: result.row_id,
|
||||||
|
score: result.score,
|
||||||
|
metadata: result.metadata
|
||||||
|
});
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
console.log(`[RAG] No data in table, skipping search`);
|
console.log(`[RAG] No data in table, skipping search`);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Фильтрация по тегам/продукту
|
// Фильтрация по тегам/продукту
|
||||||
let filtered = results;
|
let filtered = results;
|
||||||
|
console.log(`[RAG] Before filtering: ${filtered.length} results`);
|
||||||
|
|
||||||
if (userTags.length) {
|
if (userTags.length) {
|
||||||
|
console.log(`[RAG] Filtering by userTags:`, userTags);
|
||||||
filtered = filtered.filter(row => row.metadata.userTags && userTags.some(tag => row.metadata.userTags.includes(tag)));
|
filtered = filtered.filter(row => row.metadata.userTags && userTags.some(tag => row.metadata.userTags.includes(tag)));
|
||||||
}
|
console.log(`[RAG] After userTags filtering: ${filtered.length} results`);
|
||||||
if (product) {
|
|
||||||
filtered = filtered.filter(row => row.metadata.product === product);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Берём лучший результат с учётом порога
|
if (product) {
|
||||||
const best = filtered.find(row => row.score >= threshold);
|
console.log(`[RAG] Filtering by product:`, product);
|
||||||
|
filtered = filtered.filter(row => row.metadata.product === product);
|
||||||
|
console.log(`[RAG] After product filtering: ${filtered.length} results`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Берём ближайший результат с учётом порога (по модулю)
|
||||||
|
console.log(`[RAG] Looking for best result with abs(threshold): ${threshold}`);
|
||||||
|
const best = filtered.reduce((acc, row) => {
|
||||||
|
if (Math.abs(row.score) <= threshold && (acc === null || Math.abs(row.score) < Math.abs(acc.score))) {
|
||||||
|
return row;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}, null);
|
||||||
console.log(`[RAG] Best result:`, best);
|
console.log(`[RAG] Best result:`, best);
|
||||||
|
|
||||||
|
// Логируем все результаты с их score для диагностики
|
||||||
|
if (filtered.length > 0) {
|
||||||
|
console.log(`[RAG] All filtered results with scores:`);
|
||||||
|
filtered.forEach((result, index) => {
|
||||||
|
console.log(`[RAG] ${index}: score=${result.score}, meets_threshold=${Math.abs(result.score) <= threshold}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
answer: best?.metadata?.answer,
|
answer: best?.metadata?.answer,
|
||||||
context: best?.metadata?.context,
|
context: best?.metadata?.context,
|
||||||
|
|||||||
@@ -1684,13 +1684,6 @@ binary-extensions@^2.0.0, binary-extensions@^2.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
|
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
|
||||||
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
|
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
|
||||||
|
|
||||||
bindings@^1.5.0:
|
|
||||||
version "1.5.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
|
|
||||||
integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
|
|
||||||
dependencies:
|
|
||||||
file-uri-to-path "1.0.0"
|
|
||||||
|
|
||||||
bl@^1.2.3:
|
bl@^1.2.3:
|
||||||
version "1.2.3"
|
version "1.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
|
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
|
||||||
@@ -3168,11 +3161,6 @@ file-type@^3.9.0:
|
|||||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
|
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
|
||||||
integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==
|
integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==
|
||||||
|
|
||||||
file-uri-to-path@1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
|
|
||||||
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
|
|
||||||
|
|
||||||
fill-range@^7.1.1:
|
fill-range@^7.1.1:
|
||||||
version "7.1.1"
|
version "7.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
|
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
|
||||||
@@ -3799,14 +3787,6 @@ hmac-drbg@^1.0.1:
|
|||||||
minimalistic-assert "^1.0.0"
|
minimalistic-assert "^1.0.0"
|
||||||
minimalistic-crypto-utils "^1.0.1"
|
minimalistic-crypto-utils "^1.0.1"
|
||||||
|
|
||||||
hnswlib-node@^3.0.0:
|
|
||||||
version "3.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/hnswlib-node/-/hnswlib-node-3.0.0.tgz#0ec5cedf082691a5e2bec7a8faa24f742077cc50"
|
|
||||||
integrity sha512-fypn21qvVORassppC8/qNfZ5KAOspZpm/IbUkAtlqvbtDNnF5VVk5RWF7O5V6qwr7z+T3s1ePej6wQt5wRQ4Cg==
|
|
||||||
dependencies:
|
|
||||||
bindings "^1.5.0"
|
|
||||||
node-addon-api "^8.0.0"
|
|
||||||
|
|
||||||
html-to-text@9.0.5:
|
html-to-text@9.0.5:
|
||||||
version "9.0.5"
|
version "9.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d"
|
resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d"
|
||||||
@@ -4900,11 +4880,6 @@ node-addon-api@^5.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762"
|
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762"
|
||||||
integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==
|
integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==
|
||||||
|
|
||||||
node-addon-api@^8.0.0:
|
|
||||||
version "8.4.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.4.0.tgz#8cbc68ee1c216368921a8f63038a23a39cd8ba44"
|
|
||||||
integrity sha512-D9DI/gXHvVmjHS08SVch0Em8G5S1P+QWtU31appcKT/8wFSPRcdHadIFSAntdMMVM5zz+/DL+bL/gz3UDppqtg==
|
|
||||||
|
|
||||||
node-cron@^3.0.3:
|
node-cron@^3.0.3:
|
||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.3.tgz#c4bc7173dd96d96c50bdb51122c64415458caff2"
|
resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.3.tgz#c4bc7173dd96d96c50bdb51122c64415458caff2"
|
||||||
@@ -5213,7 +5188,7 @@ parent-module@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
callsites "^3.0.0"
|
callsites "^3.0.0"
|
||||||
|
|
||||||
parse-duration@^1.0.0:
|
parse-duration@^1.1.0:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.2.tgz#20008e6c507814761864669bb936e3f4a9a80758"
|
resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.2.tgz#20008e6c507814761864669bb936e3f4a9a80758"
|
||||||
integrity sha512-p8EIONG8L0u7f8GFgfVlL4n8rnChTt8O5FSxgxMz2tjc9FMP199wxVKVB6IbKx11uTbKHACSvaLVIKNnoeNR/A==
|
integrity sha512-p8EIONG8L0u7f8GFgfVlL4n8rnChTt8O5FSxgxMz2tjc9FMP199wxVKVB6IbKx11uTbKHACSvaLVIKNnoeNR/A==
|
||||||
|
|||||||
Binary file not shown.
@@ -13,7 +13,12 @@
|
|||||||
<div v-for="(dle, index) in dleList" :key="index" class="dle-card"
|
<div v-for="(dle, index) in dleList" :key="index" class="dle-card"
|
||||||
:class="{ 'active': selectedDleIndex === index }"
|
:class="{ 'active': selectedDleIndex === index }"
|
||||||
@click="selectDle(index)">
|
@click="selectDle(index)">
|
||||||
|
<div class="dle-card-header">
|
||||||
<h3>{{ dle.name }} ({{ dle.symbol }})</h3>
|
<h3>{{ dle.name }} ({{ dle.symbol }})</h3>
|
||||||
|
<button v-if="isAdmin" class="delete-dle-btn" @click.stop="deleteDle(dle, index)" title="Удалить DLE">
|
||||||
|
<i class="fas fa-trash"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<p><strong>Адрес:</strong> {{ shortenAddress(dle.tokenAddress) }}</p>
|
<p><strong>Адрес:</strong> {{ shortenAddress(dle.tokenAddress) }}</p>
|
||||||
<p><strong>Местонахождение:</strong> {{ dle.location }}</p>
|
<p><strong>Местонахождение:</strong> {{ dle.location }}</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -195,11 +200,23 @@
|
|||||||
<div v-for="(module, index) in availableModules" :key="index" class="module-card">
|
<div v-for="(module, index) in availableModules" :key="index" class="module-card">
|
||||||
<h4>{{ module.name }}</h4>
|
<h4>{{ module.name }}</h4>
|
||||||
<p>{{ module.description }}</p>
|
<p>{{ module.description }}</p>
|
||||||
<div class="module-status" :class="{ 'installed': module.installed }">
|
<div class="module-status" :class="{ 'installed': isModuleInstalled(module) }">
|
||||||
{{ module.installed ? 'Установлен' : 'Доступен' }}
|
{{ isModuleInstalled(module) ? 'Установлен' : 'Доступен' }}
|
||||||
|
</div>
|
||||||
|
<div v-if="module.name === 'Прием платежей' && paymentModuleTokens.length > 0" class="payment-tokens-list">
|
||||||
|
<div v-for="token in paymentModuleTokens" :key="token.address + token.network" class="payment-token-entry">
|
||||||
|
<span><b>{{ token.name }}</b> ({{ token.network }})</span>
|
||||||
|
<span style="font-size:0.95em;color:#888">{{ token.address }}</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="module-actions">
|
<div class="module-actions">
|
||||||
<button v-if="!module.installed" class="btn btn-success" @click="installModule(module)">
|
<button v-if="module.name === 'Прием платежей' && !isModuleInstalled(module)" class="btn btn-success" @click="openPaymentTokensModal">
|
||||||
|
<i class="fas fa-plus"></i> Настроить
|
||||||
|
</button>
|
||||||
|
<button v-else-if="module.name === 'Прием платежей' && isModuleInstalled(module)" class="btn btn-danger" @click="uninstallPaymentModule">
|
||||||
|
<i class="fas fa-trash"></i> Удалить
|
||||||
|
</button>
|
||||||
|
<button v-else-if="!isModuleInstalled(module)" class="btn btn-success" @click="installModule(module)">
|
||||||
<i class="fas fa-plus"></i> Установить
|
<i class="fas fa-plus"></i> Установить
|
||||||
</button>
|
</button>
|
||||||
<button v-else class="btn btn-danger" @click="uninstallModule(module)">
|
<button v-else class="btn btn-danger" @click="uninstallModule(module)">
|
||||||
@@ -211,12 +228,58 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<BaseModal
|
||||||
|
:show="showDeleteModal"
|
||||||
|
:title="deleteSuccess ? 'Готово' : 'Подтвердите удаление DLE'"
|
||||||
|
@close="closeDeleteModal"
|
||||||
|
>
|
||||||
|
<template #default>
|
||||||
|
<div style="margin-bottom:18px;">
|
||||||
|
<span v-if="!deleteSuccess">Удалить DLE <b>«{{ dleToDelete?.name }}»</b>? Это действие необратимо.</span>
|
||||||
|
<span v-else>DLE успешно удалён</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #actions>
|
||||||
|
<template v-if="!deleteSuccess">
|
||||||
|
<button class="modal-ok-btn delete-btn" @click="confirmDeleteDle" :disabled="isDeletingDle">
|
||||||
|
{{ isDeletingDle ? 'Удаление...' : 'Удалить' }}
|
||||||
|
</button>
|
||||||
|
<button class="modal-ok-btn cancel-btn" @click="closeDeleteModal" :disabled="isDeletingDle">Отмена</button>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<button class="modal-ok-btn" @click="closeDeleteModal">OK</button>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</BaseModal>
|
||||||
|
<BaseModal
|
||||||
|
:show="showPaymentTokensModal"
|
||||||
|
title="Выберите токены для приема платежей"
|
||||||
|
@close="closePaymentTokensModal"
|
||||||
|
>
|
||||||
|
<template #default>
|
||||||
|
<div v-if="authTokens.length === 0">Нет доступных токенов. Добавьте токены в настройках безопасности.</div>
|
||||||
|
<div v-else>
|
||||||
|
<div v-for="token in authTokens" :key="token.address + token.network" class="token-select-row">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" :value="token" v-model="paymentModuleTokens.value" />
|
||||||
|
<b>{{ token.name }}</b> ({{ token.network }}) <span style="font-size:0.95em;color:#888">{{ token.address }}</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #actions>
|
||||||
|
<button class="modal-ok-btn" @click="closePaymentTokensModal">Отмена</button>
|
||||||
|
<button class="modal-ok-btn btn-success" @click="closePaymentTokensModal">Сохранить</button>
|
||||||
|
</template>
|
||||||
|
</BaseModal>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, defineProps, computed } from 'vue';
|
import { ref, defineProps, computed, inject } from 'vue';
|
||||||
import { useAuthContext } from '@/composables/useAuth';
|
import { useAuthContext } from '@/composables/useAuth';
|
||||||
|
import dleService from '@/services/dleService';
|
||||||
|
import BaseModal from './NoAccessModal.vue';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
dleList: { type: Array, required: true },
|
dleList: { type: Array, required: true },
|
||||||
@@ -353,6 +416,62 @@ function uninstallModule(module) {
|
|||||||
module.installed = false;
|
module.installed = false;
|
||||||
alert(`Модуль "${module.name}" удален.`);
|
alert(`Модуль "${module.name}" удален.`);
|
||||||
}
|
}
|
||||||
|
function isModuleInstalled(module) {
|
||||||
|
if (typeof module.installed === 'function') return module.installed();
|
||||||
|
return !!module.installed;
|
||||||
|
}
|
||||||
|
const emit = defineEmits(['close', 'dle-updated']);
|
||||||
|
const showDeleteModal = ref(false);
|
||||||
|
const dleToDelete = ref(null);
|
||||||
|
const isDeletingDle = ref(false);
|
||||||
|
const deleteSuccess = ref(false);
|
||||||
|
function deleteDle(dle, idx) {
|
||||||
|
if (!isAdmin.value) return;
|
||||||
|
dleToDelete.value = dle;
|
||||||
|
showDeleteModal.value = true;
|
||||||
|
deleteSuccess.value = false;
|
||||||
|
}
|
||||||
|
function closeDeleteModal() {
|
||||||
|
showDeleteModal.value = false;
|
||||||
|
dleToDelete.value = null;
|
||||||
|
isDeletingDle.value = false;
|
||||||
|
deleteSuccess.value = false;
|
||||||
|
}
|
||||||
|
async function confirmDeleteDle() {
|
||||||
|
if (!dleToDelete.value) return;
|
||||||
|
isDeletingDle.value = true;
|
||||||
|
try {
|
||||||
|
await dleService.deleteDLE(dleToDelete.value.tokenAddress);
|
||||||
|
deleteSuccess.value = true;
|
||||||
|
emit('dle-updated');
|
||||||
|
isDeletingDle.value = false;
|
||||||
|
} catch (e) {
|
||||||
|
alert('Ошибка при удалении DLE: ' + (e?.message || e));
|
||||||
|
isDeletingDle.value = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const authTokens = inject('authTokens', ref([]));
|
||||||
|
const paymentModuleTokens = ref([]);
|
||||||
|
const showPaymentTokensModal = ref(false);
|
||||||
|
function openPaymentTokensModal() {
|
||||||
|
showPaymentTokensModal.value = true;
|
||||||
|
}
|
||||||
|
function closePaymentTokensModal() {
|
||||||
|
showPaymentTokensModal.value = false;
|
||||||
|
}
|
||||||
|
function savePaymentTokens(selected) {
|
||||||
|
paymentModuleTokens.value = selected;
|
||||||
|
closePaymentTokensModal();
|
||||||
|
// Можно добавить сохранение в API, если потребуется
|
||||||
|
}
|
||||||
|
function uninstallPaymentModule() {
|
||||||
|
paymentModuleTokens.value = [];
|
||||||
|
}
|
||||||
|
availableModules.value.push({
|
||||||
|
name: 'Прием платежей',
|
||||||
|
description: 'Позволяет принимать оплату в выбранных токенах. Можно выбрать один или несколько токенов для приема платежей.',
|
||||||
|
installed: computed(() => paymentModuleTokens.value.length > 0)
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
@@ -406,6 +525,12 @@ function uninstallModule(module) {
|
|||||||
border-color: #17a2b8;
|
border-color: #17a2b8;
|
||||||
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
|
||||||
}
|
}
|
||||||
|
.dle-card-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
.dle-card h3 {
|
.dle-card h3 {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
@@ -624,4 +749,81 @@ function uninstallModule(module) {
|
|||||||
display: flex;
|
display: flex;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
}
|
}
|
||||||
|
.delete-dle-btn {
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
color: #dc3545;
|
||||||
|
font-size: 1.2em;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 2px 6px;
|
||||||
|
border-radius: 4px;
|
||||||
|
transition: background 0.15s;
|
||||||
|
}
|
||||||
|
.delete-dle-btn:hover {
|
||||||
|
background: #ffeaea;
|
||||||
|
color: #a71d2a;
|
||||||
|
}
|
||||||
|
.delete-btn {
|
||||||
|
background: #dc3545;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 0.5rem 2rem;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 1rem;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.delete-btn:disabled {
|
||||||
|
background: #e6a6ad;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
.delete-btn:hover:not(:disabled) {
|
||||||
|
background: #b52a37;
|
||||||
|
}
|
||||||
|
.cancel-btn {
|
||||||
|
background: #f5f5f5;
|
||||||
|
color: #333;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 0.5rem 2rem;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 1rem;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.cancel-btn:disabled {
|
||||||
|
background: #eee;
|
||||||
|
color: #aaa;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
.cancel-btn:hover:not(:disabled) {
|
||||||
|
background: #e0e0e0;
|
||||||
|
}
|
||||||
|
.payment-tokens-list {
|
||||||
|
margin: 10px 0 0 0;
|
||||||
|
padding: 8px 0 0 0;
|
||||||
|
border-top: 1px solid #e5e7eb;
|
||||||
|
}
|
||||||
|
.payment-token-entry {
|
||||||
|
font-size: 1.02em;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.token-select-row {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.btn-success {
|
||||||
|
background: #28a745;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 0.5rem 2rem;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 1rem;
|
||||||
|
transition: background 0.2s;
|
||||||
|
}
|
||||||
|
.btn-success:hover {
|
||||||
|
background: #218838;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -1,9 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="show" class="modal-backdrop">
|
<div v-if="show" class="modal-backdrop">
|
||||||
<div class="modal-window">
|
<div class="modal-window">
|
||||||
<div class="modal-title">{{ title }}</div>
|
<div v-if="title" class="modal-title">{{ title }}</div>
|
||||||
<div class="modal-body">{{ message }}</div>
|
<div class="modal-body">
|
||||||
|
<slot>{{ message }}</slot>
|
||||||
|
</div>
|
||||||
|
<div class="modal-actions">
|
||||||
|
<slot name="actions">
|
||||||
<button class="modal-ok-btn" @click="$emit('close')">OK</button>
|
<button class="modal-ok-btn" @click="$emit('close')">OK</button>
|
||||||
|
</slot>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -11,8 +17,8 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
defineProps({
|
defineProps({
|
||||||
show: Boolean,
|
show: Boolean,
|
||||||
title: { type: String, default: 'Нет доступа' },
|
title: { type: String, default: '' },
|
||||||
message: { type: String, default: 'Доступ к этим данным разрешён только администраторам.' }
|
message: { type: String, default: '' }
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -43,6 +49,11 @@ defineProps({
|
|||||||
margin-bottom: 1.5rem;
|
margin-bottom: 1.5rem;
|
||||||
color: #444;
|
color: #444;
|
||||||
}
|
}
|
||||||
|
.modal-actions {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 18px;
|
||||||
|
}
|
||||||
.modal-ok-btn {
|
.modal-ok-btn {
|
||||||
background: var(--color-primary);
|
background: var(--color-primary);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
:dle-list="dleList"
|
:dle-list="dleList"
|
||||||
:selected-dle-index="selectedDleIndex"
|
:selected-dle-index="selectedDleIndex"
|
||||||
@close="goBack"
|
@close="goBack"
|
||||||
|
@dle-updated="reloadDleList"
|
||||||
class="dle-management-root"
|
class="dle-management-root"
|
||||||
/>
|
/>
|
||||||
</BaseLayout>
|
</BaseLayout>
|
||||||
@@ -28,8 +29,19 @@ function goBack() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function reloadDleList() {
|
||||||
|
dleList.value = await dleService.getAllDLEs() || [];
|
||||||
|
// Сбросить выбранный индекс, если список изменился
|
||||||
|
if (dleList.value.length === 0) {
|
||||||
|
selectedDleIndex.value = 0;
|
||||||
|
} else if (selectedDleIndex.value >= dleList.value.length) {
|
||||||
|
selectedDleIndex.value = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
dleList.value = await dleService.getAllDLEs() || [];
|
dleList.value = await dleService.getAllDLEs() || [];
|
||||||
|
onMounted(reloadDleList);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,9 @@
|
|||||||
</form>
|
</form>
|
||||||
<RuleEditor v-if="showRuleEditor" :rule="editingRule" @close="onRuleEditorClose" />
|
<RuleEditor v-if="showRuleEditor" :rule="editingRule" @close="onRuleEditorClose" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Системный мониторинг -->
|
||||||
|
<SystemMonitoring />
|
||||||
</div>
|
</div>
|
||||||
</BaseLayout>
|
</BaseLayout>
|
||||||
</template>
|
</template>
|
||||||
@@ -64,6 +67,7 @@ import { useRouter } from 'vue-router';
|
|||||||
import { ref, onMounted, computed, watch } from 'vue';
|
import { ref, onMounted, computed, watch } from 'vue';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import RuleEditor from '@/components/ai-assistant/RuleEditor.vue';
|
import RuleEditor from '@/components/ai-assistant/RuleEditor.vue';
|
||||||
|
import SystemMonitoring from '@/components/ai-assistant/SystemMonitoring.vue';
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const goBack = () => router.push('/settings/ai');
|
const goBack = () => router.push('/settings/ai');
|
||||||
const settings = ref({ system_prompt: '', model: '', selected_rag_tables: [], rules_id: null });
|
const settings = ref({ system_prompt: '', model: '', selected_rag_tables: [], rules_id: null });
|
||||||
@@ -149,11 +153,11 @@ async function onRuleEditorClose(updated) {
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.ai-assistant-settings-block {
|
.ai-assistant-settings-block {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-radius: 16px;
|
border-radius: var(--radius-lg);
|
||||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||||
padding: 32px 24px 24px 24px;
|
padding: 20px;
|
||||||
max-width: 1200px;
|
margin-top: 20px;
|
||||||
margin: 32px auto 0 auto;
|
margin-bottom: 20px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
|
|||||||
@@ -111,12 +111,12 @@ const cancelEdit = () => {
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.db-settings-block {
|
.db-settings-block {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-radius: 16px;
|
border-radius: var(--radius-lg);
|
||||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||||
padding: 32px 24px 24px 24px;
|
padding: 20px;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 600px;
|
|
||||||
margin: 40px auto 0 auto;
|
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -126,12 +126,12 @@ const cancelEdit = () => {
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.email-settings-block {
|
.email-settings-block {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-radius: 16px;
|
border-radius: var(--radius-lg);
|
||||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||||
padding: 32px 24px 24px 24px;
|
padding: 20px;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 600px;
|
|
||||||
margin: 40px auto 0 auto;
|
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,12 +28,12 @@ const goBack = () => router.push('/settings/ai');
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.ollama-settings-block {
|
.ollama-settings-block {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-radius: 16px;
|
border-radius: var(--radius-lg);
|
||||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||||
padding: 32px 24px 24px 24px;
|
padding: 20px;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 600px;
|
|
||||||
margin: 40px auto 0 auto;
|
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,12 +28,12 @@ const goBack = () => router.push('/settings/ai');
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.openai-settings-block {
|
.openai-settings-block {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-radius: 16px;
|
border-radius: var(--radius-lg);
|
||||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||||
padding: 32px 24px 24px 24px;
|
padding: 20px;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 600px;
|
|
||||||
margin: 40px auto 0 auto;
|
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,12 +87,12 @@ const cancelEdit = () => {
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.telegram-settings-block {
|
.telegram-settings-block {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-radius: 16px;
|
border-radius: var(--radius-lg);
|
||||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||||
padding: 32px 24px 24px 24px;
|
padding: 20px;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 600px;
|
|
||||||
margin: 40px auto 0 auto;
|
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,34 +2,33 @@
|
|||||||
<div class="blockchain-settings settings-panel" style="position:relative">
|
<div class="blockchain-settings settings-panel" style="position:relative">
|
||||||
<button class="close-btn" @click="goBack">×</button>
|
<button class="close-btn" @click="goBack">×</button>
|
||||||
|
|
||||||
<!-- Панель Создать новое DLE (Digital Legal Entity) -->
|
<div class="settings-block">
|
||||||
<div class="sub-settings-panel">
|
<h2>Создать новое DLE (Digital Legal Entity)</h2>
|
||||||
<h3>Создать новое DLE (Digital Legal Entity)</h3>
|
|
||||||
<div class="setting-form">
|
|
||||||
<p>Настройка и деплой нового DLE (Digital Legal Entity) с токеном управления и контрактом Governor.</p>
|
|
||||||
|
|
||||||
<!-- 1. Имя DLE -->
|
<!-- 1. Создание DLE -->
|
||||||
|
<div class="setting-form">
|
||||||
|
|
||||||
|
<!-- Имя DLE -->
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" for="dleName">Имя DLE (Digital Legal Entity) (и токена):</label>
|
<label class="form-label" for="dleName">Имя DLE (Digital Legal Entity):</label>
|
||||||
<input type="text" id="dleName" v-model="dleDeploymentSettings.name" class="form-control" placeholder="Например, My DLE">
|
<input type="text" id="dleName" v-model="dleDeploymentSettings.name" class="form-control" placeholder="Например, My DLE">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 2. Символ токена -->
|
<!-- Символ токена -->
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" for="dleSymbol">Символ токена управления (GT):</label>
|
<label class="form-label" for="dleSymbol">Символ токена управления (GT):</label>
|
||||||
<input type="text" id="dleSymbol" v-model="dleDeploymentSettings.symbol" class="form-control" placeholder="Например, MDGT (3-5 символов)">
|
<input type="text" id="dleSymbol" v-model="dleDeploymentSettings.symbol" class="form-control" placeholder="Например, MDGT (3-5 символов)">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 3. Местонахождение -->
|
<!-- Местонахождение -->
|
||||||
<h4>Местонахождение</h4>
|
|
||||||
<div class="address-grid">
|
<div class="address-grid">
|
||||||
<div class="form-group address-index">
|
<div class="form-group address-index">
|
||||||
<label class="form-label" for="locIndex">Индекс:</label>
|
<label class="form-label" for="locIndex">Местонахождение</label>
|
||||||
<div class="input-group">
|
<div class="input-icon-wrapper">
|
||||||
<input type="text" id="locIndex" v-model="dleDeploymentSettings.locationIndex" @input="checkIndexInput" class="form-control">
|
<input type="text" id="locIndex" v-model="dleDeploymentSettings.locationIndex" @input="checkIndexInput" class="form-control" placeholder="Индекс">
|
||||||
<button class="btn btn-outline-secondary btn-sm" type="button" @click="fetchAddressByZipcode" :disabled="isFetchingByZipcode || !dleDeploymentSettings.locationIndex">
|
<span class="input-icon" :class="{disabled: !isAdmin || isFetchingByZipcode}" @click="isAdmin && !isFetchingByZipcode && fetchAddressByZipcode()">
|
||||||
<i class="fas fa-search"></i> {{ isFetchingByZipcode ? 'Поиск...' : 'Найти по индексу' }}
|
<i class="fas fa-search"></i>
|
||||||
</button>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -76,19 +75,9 @@
|
|||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 4. Код деятельности -->
|
|
||||||
<h4>Код деятельности</h4>
|
|
||||||
<div v-if="dleDeploymentSettings.selectedIsicCodes && dleDeploymentSettings.selectedIsicCodes.length > 0" class="isic-codes-list mt-3">
|
|
||||||
<h5>Добавленные коды деятельности:</h5>
|
|
||||||
<ul>
|
|
||||||
<li v-for="(isic, index) in dleDeploymentSettings.selectedIsicCodes" :key="index" class="d-flex justify-content-between align-items-center mb-1">
|
|
||||||
<span>{{ isic.text }} ({{ isic.code }})</span>
|
|
||||||
<button @click="removeIsicCode(index)" class="btn btn-danger btn-xs">Удалить</button>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 2. Коды деятельности (ISIC) -->
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" for="isicSection">Выберите код деятельности:</label>
|
<label class="form-label" for="isicSection">Выберите код деятельности:</label>
|
||||||
<select id="isicSection" v-model="selectedSection" class="form-control" :disabled="isLoadingSections">
|
<select id="isicSection" v-model="selectedSection" class="form-control" :disabled="isLoadingSections">
|
||||||
@@ -134,8 +123,7 @@
|
|||||||
<button @click="addIsicCode" class="btn btn-success btn-sm" :disabled="!currentSelectedIsicCode">Добавить код деятельности</button>
|
<button @click="addIsicCode" class="btn btn-success btn-sm" :disabled="!currentSelectedIsicCode">Добавить код деятельности</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 5. Первоначальное распределение токенов -->
|
<!-- 3. Партнёры -->
|
||||||
<h4>Первоначальное распределение токенов управления</h4>
|
|
||||||
<div v-for="(partner, index) in dleDeploymentSettings.partners" :key="index" class="partner-entry">
|
<div v-for="(partner, index) in dleDeploymentSettings.partners" :key="index" class="partner-entry">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label">Адрес партнера {{ index + 1 }}:</label>
|
<label class="form-label">Адрес партнера {{ index + 1 }}:</label>
|
||||||
@@ -145,43 +133,37 @@
|
|||||||
<label class="form-label">Сумма GT для партнера {{ index + 1 }}:</label>
|
<label class="form-label">Сумма GT для партнера {{ index + 1 }}:</label>
|
||||||
<input type="number" v-model="partner.amount" min="1" class="form-control">
|
<input type="number" v-model="partner.amount" min="1" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
|
<div class="partner-actions-row">
|
||||||
<button class="btn btn-danger btn-sm" @click="removePartner(index)" :disabled="!isAdmin">Удалить партнера</button>
|
<button class="btn btn-danger btn-sm" @click="removePartner(index)" :disabled="!isAdmin">Удалить партнера</button>
|
||||||
</div>
|
|
||||||
<button class="btn btn-secondary" @click="addPartner" :disabled="!isAdmin">Добавить партнера</button>
|
<button class="btn btn-secondary" @click="addPartner" :disabled="!isAdmin">Добавить партнера</button>
|
||||||
<div class="form-group">
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group mb-gt-total">
|
||||||
<label class="form-label">Общее количество выпускаемых GT: {{ totalInitialSupply }}</label>
|
<label class="form-label">Общее количество выпускаемых GT: {{ totalInitialSupply }}</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 6. Настройки Governor -->
|
|
||||||
<h4>Настройки Governor</h4>
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" for="proposalThreshold">Порог для создания предложений (кол-во GT):</label>
|
<label class="form-label" for="proposalThreshold">Порог для создания предложений (кол-во GT):</label>
|
||||||
<input type="number" id="proposalThreshold" v-model="dleDeploymentSettings.proposalThreshold" min="0" class="form-control">
|
<input type="number" id="proposalThreshold" v-model="dleDeploymentSettings.proposalThreshold" min="0" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" for="quorumPercentGovernor">Кворум (% от общего числа голосов):</label>
|
<label class="form-label" for="quorumPercentGovernor">Кворум (% от общего числа голосов):</label>
|
||||||
<input type="number" id="quorumPercentGovernor" v-model="dleDeploymentSettings.quorumPercent" min="1" max="100" class="form-control">
|
<input type="number" id="quorumPercentGovernor" v-model="dleDeploymentSettings.quorumPercent" min="1" max="100" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" for="votingDelay">Задержка перед голосованием (в днях):</label>
|
<label class="form-label" for="votingDelay">Задержка перед голосованием (в днях):</label>
|
||||||
<input type="number" id="votingDelay" v-model="dleDeploymentSettings.votingDelayDays" min="0" class="form-control">
|
<input type="number" id="votingDelay" v-model="dleDeploymentSettings.votingDelayDays" min="0" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" for="votingPeriod">Период голосования (в днях):</label>
|
<label class="form-label" for="votingPeriod">Период голосования (в днях):</label>
|
||||||
<input type="number" id="votingPeriod" v-model="dleDeploymentSettings.votingPeriodDays" min="1" class="form-control">
|
<input type="number" id="votingPeriod" v-model="dleDeploymentSettings.votingPeriodDays" min="1" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" for="timelockMinDelay">Минимальная задержка Timelock (в днях):</label>
|
<label class="form-label" for="timelockMinDelay">Минимальная задержка Timelock (в днях):</label>
|
||||||
<input type="number" id="timelockMinDelay" v-model="dleDeploymentSettings.timelockMinDelayDays" min="0" class="form-control">
|
<input type="number" id="timelockMinDelay" v-model="dleDeploymentSettings.timelockMinDelayDays" min="0" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 7. RPC Провайдеры -->
|
<!-- 4. RPC Провайдеры -->
|
||||||
<h4>RPC Провайдеры</h4>
|
<!-- <h3>RPC Провайдеры</h3> -->
|
||||||
<p>Конфигурации RPC для сетей, которые будут использоваться в приложении.</p>
|
|
||||||
|
|
||||||
<!-- Список добавленных RPC -->
|
<!-- Список добавленных RPC -->
|
||||||
<div v-if="securitySettings.rpcConfigs.length > 0" class="rpc-list">
|
<div v-if="securitySettings.rpcConfigs.length > 0" class="rpc-list">
|
||||||
@@ -241,8 +223,9 @@
|
|||||||
<button class="btn btn-secondary" @click="addRpcConfig" :disabled="!isAdmin">Добавить RPC</button>
|
<button class="btn btn-secondary" @click="addRpcConfig" :disabled="!isAdmin">Добавить RPC</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 8. Выбор сети для деплоя -->
|
<!-- 5. Настройки деплоя -->
|
||||||
<h4>Сеть для деплоя</h4>
|
<!-- <h3>Настройки деплоя</h3> -->
|
||||||
|
<!-- <h4>Сеть для деплоя</h4> -->
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" for="deployNetwork">Выберите сеть блокчейн для деплоя:</label>
|
<label class="form-label" for="deployNetwork">Выберите сеть блокчейн для деплоя:</label>
|
||||||
<select id="deployNetwork" v-model="dleDeploymentSettings.blockchainNetwork" class="form-control">
|
<select id="deployNetwork" v-model="dleDeploymentSettings.blockchainNetwork" class="form-control">
|
||||||
@@ -251,33 +234,23 @@
|
|||||||
{{ network.label }}
|
{{ network.label }}
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
<small class="text-warning" v-if="!dleDeploymentSettings.blockchainNetwork.includes('testnet') &&
|
|
||||||
!['sepolia', 'goerli', 'mumbai'].includes(dleDeploymentSettings.blockchainNetwork)">
|
|
||||||
<i class="fas fa-exclamation-triangle"></i>
|
|
||||||
Внимание! Для тестирования рекомендуется использовать тестовые сети (Sepolia, Goerli, Mumbai).
|
|
||||||
</small>
|
|
||||||
</div>
|
</div>
|
||||||
|
<!-- <h4>Ключ Деплоера</h4> -->
|
||||||
<!-- 9. Ключ Деплоера -->
|
|
||||||
<h4>Ключ Деплоера</h4>
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-label" for="deployerKey">Приватный ключ для деплоя:</label>
|
<label class="form-label" for="deployerKey">Приватный ключ для деплоя:</label>
|
||||||
<div class="input-group">
|
<div class="input-icon-wrapper">
|
||||||
<input :type="showDeployerKey ? 'text' : 'password'" id="deployerKey" v-model="securitySettings.deployerPrivateKey" class="form-control">
|
<input :type="showDeployerKey ? 'text' : 'password'" id="deployerKey" v-model="securitySettings.deployerPrivateKey" class="form-control">
|
||||||
<button class="btn btn-outline-secondary" @click="toggleShowDeployerKey">
|
<span class="input-icon" @click="toggleShowDeployerKey">
|
||||||
<i :class="showDeployerKey ? 'fas fa-eye-slash' : 'fas fa-eye'"></i>
|
<i :class="showDeployerKey ? 'fas fa-eye-slash' : 'fas fa-eye'"></i>
|
||||||
</button>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- <h4>Газовые настройки</h4> -->
|
||||||
<!-- 10. Газовые настройки -->
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<h4>Газовые настройки</h4>
|
|
||||||
<div class="custom-control custom-checkbox">
|
<div class="custom-control custom-checkbox">
|
||||||
<input type="checkbox" class="custom-control-input" id="customGas" v-model="useCustomGas">
|
<input type="checkbox" class="custom-control-input" id="customGas" v-model="useCustomGas">
|
||||||
<label class="custom-control-label" for="customGas">Использовать пользовательские настройки газа</label>
|
<label class="custom-control-label" for="customGas">Использовать пользовательские настройки газа</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="useCustomGas" class="gas-settings mt-3">
|
<div v-if="useCustomGas" class="gas-settings mt-3">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="gasLimit">Лимит газа (Gas Limit):</label>
|
<label for="gasLimit">Лимит газа (Gas Limit):</label>
|
||||||
@@ -294,7 +267,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 10. Кнопка деплоя DLE -->
|
<!-- Кнопка деплоя, результат, ошибки -->
|
||||||
<div class="deployment-actions mt-4">
|
<div class="deployment-actions mt-4">
|
||||||
<button class="btn btn-primary" @click="deployDLE" :disabled="!isAdmin || isDeploying">
|
<button class="btn btn-primary" @click="deployDLE" :disabled="!isAdmin || isDeploying">
|
||||||
<i class="fas fa-rocket"></i> {{ isDeploying ? 'Создание DLE...' : 'Создать и задеплоить DLE (Digital Legal Entity)' }}
|
<i class="fas fa-rocket"></i> {{ isDeploying ? 'Создание DLE...' : 'Создать и задеплоить DLE (Digital Legal Entity)' }}
|
||||||
@@ -315,16 +288,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Модальное окно для результатов тестирования RPC -->
|
|
||||||
<RpcTestModal
|
<RpcTestModal
|
||||||
:show="showRpcTestModal"
|
:show="showRpcTestModal"
|
||||||
:result="rpcTestResult"
|
:result="rpcTestResult"
|
||||||
@close="closeRpcTestModal"
|
@close="closeRpcTestModal"
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
@@ -1043,11 +1013,16 @@ const goBack = () => router.push('/settings');
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.settings-panel {
|
.settings-block {
|
||||||
padding: var(--block-padding);
|
background: #fff;
|
||||||
background-color: var(--color-light);
|
border-radius: var(--radius-lg, 16px);
|
||||||
border-radius: var(--radius-md);
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
||||||
margin-top: var(--spacing-lg);
|
padding: 20px;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
overflow-x: auto;
|
||||||
animation: fadeIn var(--transition-normal);
|
animation: fadeIn var(--transition-normal);
|
||||||
}
|
}
|
||||||
h3 {
|
h3 {
|
||||||
@@ -1070,7 +1045,7 @@ h3 {
|
|||||||
gap: var(--spacing-md);
|
gap: var(--spacing-md);
|
||||||
}
|
}
|
||||||
.form-group {
|
.form-group {
|
||||||
margin-bottom: 0;
|
margin-bottom: var(--spacing-md);
|
||||||
}
|
}
|
||||||
.form-label {
|
.form-label {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -1078,7 +1053,7 @@ h3 {
|
|||||||
gap: var(--spacing-sm);
|
gap: var(--spacing-sm);
|
||||||
}
|
}
|
||||||
.form-control {
|
.form-control {
|
||||||
max-width: 500px;
|
/* max-width: 500px; */
|
||||||
}
|
}
|
||||||
.btn-primary {
|
.btn-primary {
|
||||||
align-self: flex-start;
|
align-self: flex-start;
|
||||||
@@ -1089,10 +1064,11 @@ h3 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.partner-entry {
|
.partner-entry {
|
||||||
border: 1px solid var(--color-grey-light);
|
border: none;
|
||||||
padding: var(--spacing-md);
|
padding: 0;
|
||||||
margin-bottom: var(--spacing-md);
|
margin-bottom: var(--spacing-md);
|
||||||
border-radius: var(--radius-sm);
|
border-radius: 0;
|
||||||
|
background: none;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: var(--spacing-sm);
|
gap: var(--spacing-sm);
|
||||||
@@ -1119,15 +1095,15 @@ h3 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.address-grid {
|
.address-grid {
|
||||||
display: grid;
|
display: flex;
|
||||||
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); /* Адаптивная сетка */
|
flex-direction: column;
|
||||||
gap: var(--spacing-md);
|
gap: var(--spacing-md);
|
||||||
/* margin-bottom: var(--spacing-lg); Убрано, т.к. есть блок верификации */
|
|
||||||
}
|
}
|
||||||
|
.address-grid .form-group:first-child {
|
||||||
/* Можно добавить специфичные стили для полей адреса, если нужно */
|
margin-top: 0 !important;
|
||||||
.address-grid .form-group {
|
}
|
||||||
margin-bottom: 0; /* Убрать лишний отступ у полей в сетке */
|
.address-grid .form-control {
|
||||||
|
/* max-width: 100%; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.code-list {
|
.code-list {
|
||||||
@@ -1356,4 +1332,55 @@ h3 {
|
|||||||
cursor: not-allowed !important;
|
cursor: not-allowed !important;
|
||||||
opacity: 1 !important;
|
opacity: 1 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.index-inline-group {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0;
|
||||||
|
}
|
||||||
|
.index-inline-group .form-control {
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
}
|
||||||
|
.index-inline-group .btn {
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-icon-wrapper {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.input-icon-wrapper .form-control {
|
||||||
|
padding-right: 2.5rem;
|
||||||
|
}
|
||||||
|
.input-icon {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
right: 0.75rem;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
color: #2196f3;
|
||||||
|
font-size: 1.2em;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: color 0.2s;
|
||||||
|
}
|
||||||
|
.input-icon.disabled {
|
||||||
|
color: #bdbdbd;
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.partner-actions-row {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
gap: var(--spacing-md);
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: var(--spacing-md);
|
||||||
|
}
|
||||||
|
|
||||||
|
.mb-gt-total {
|
||||||
|
margin-bottom: 2.5rem;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -51,12 +51,17 @@ function goBack() {
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.create-table-container {
|
.create-table-container {
|
||||||
max-width: 500px;
|
|
||||||
margin: 2rem auto;
|
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-radius: 16px;
|
border-radius: var(--radius-lg);
|
||||||
box-shadow: 0 2px 16px rgba(0,0,0,0.07);
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||||
padding: 2rem 1.5rem;
|
padding: 20px;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
overflow-x: auto;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
}
|
}
|
||||||
.create-table-form {
|
.create-table-form {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
@@ -51,13 +51,16 @@ function goToCreate() {
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.table-block-wrapper {
|
.table-block-wrapper {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-radius: 16px;
|
border-radius: var(--radius-lg);
|
||||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||||
padding: 32px 24px 24px 24px;
|
padding: 20px;
|
||||||
max-width: 950px;
|
margin-top: 20px;
|
||||||
margin: 40px auto;
|
margin-bottom: 20px;
|
||||||
|
width: 100%;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
}
|
}
|
||||||
.tableview-header-row {
|
.tableview-header-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
@@ -1,84 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
echo "==== Содержимое /cloudflared.env ===="
|
|
||||||
cat /cloudflared.env || echo "Файл не найден"
|
|
||||||
echo "===="
|
|
||||||
|
|
||||||
# Получаем токен из переменной окружения или из файла
|
|
||||||
if [ -z "$TUNNEL_TOKEN" ] && [ -f /cloudflared.env ]; then
|
|
||||||
. /cloudflared.env
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "TUNNEL_TOKEN=[$TUNNEL_TOKEN]"
|
|
||||||
|
|
||||||
# Функция для проверки сети
|
|
||||||
check_network() {
|
|
||||||
echo "Проверка сетевого соединения..."
|
|
||||||
for addr in 1.1.1.1 8.8.8.8; do
|
|
||||||
if ping -c 1 -W 5 "$addr" > /dev/null 2>&1; then
|
|
||||||
echo "✓ Сеть доступна ($addr)"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "✗ Сетевые проблемы"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Функция для проверки доступности backend
|
|
||||||
check_backend() {
|
|
||||||
echo "Проверка доступности backend..."
|
|
||||||
if curl -s --connect-timeout 5 http://backend:8000 >/dev/null 2>&1; then
|
|
||||||
echo "✓ Backend доступен"
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
echo "✗ Backend недоступен"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Проверяем сеть перед запуском
|
|
||||||
echo "=== Проверка подключений ==="
|
|
||||||
check_network
|
|
||||||
check_backend
|
|
||||||
|
|
||||||
# Проверяем наличие конфигурационного файла
|
|
||||||
echo "=== Проверка конфигурации ==="
|
|
||||||
if [ -f "/etc/cloudflared/config.yml" ]; then
|
|
||||||
echo "✓ Конфигурационный файл найден"
|
|
||||||
cat /etc/cloudflared/config.yml
|
|
||||||
else
|
|
||||||
echo "✗ Конфигурационный файл не найден"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f "/etc/cloudflared/a765a217-5312-48f8-9bb7-5a7ef56602b8.json" ]; then
|
|
||||||
echo "✓ Credentials файл найден"
|
|
||||||
else
|
|
||||||
echo "✗ Credentials файл не найден"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Проверим доступность frontend
|
|
||||||
echo "=== Проверка frontend ==="
|
|
||||||
if curl -s --connect-timeout 5 http://dapp-frontend:5173 >/dev/null 2>&1; then
|
|
||||||
echo "✓ Frontend доступен"
|
|
||||||
else
|
|
||||||
echo "✗ Frontend недоступен, fallback на backend"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Запускаем cloudflared с токеном вместо конфигурационного файла
|
|
||||||
echo "=== Запуск cloudflared с токеном ==="
|
|
||||||
echo "Используем токен туннеля: ${TUNNEL_TOKEN:0:20}..."
|
|
||||||
exec cloudflared tunnel \
|
|
||||||
--no-autoupdate \
|
|
||||||
--edge-ip-version 4 \
|
|
||||||
--protocol http2 \
|
|
||||||
--retries 20 \
|
|
||||||
--grace-period 60s \
|
|
||||||
--loglevel info \
|
|
||||||
--metrics 0.0.0.0:39693 \
|
|
||||||
--proxy-connect-timeout 90s \
|
|
||||||
--proxy-tls-timeout 90s \
|
|
||||||
--proxy-tcp-keepalive 15s \
|
|
||||||
--proxy-keepalive-timeout 120s \
|
|
||||||
--proxy-keepalive-connections 10 \
|
|
||||||
--proxy-no-happy-eyeballs \
|
|
||||||
run --token "$TUNNEL_TOKEN"
|
|
||||||
@@ -36,38 +36,67 @@ class VectorStore:
|
|||||||
self.index_cache[table_id] = (index, meta)
|
self.index_cache[table_id] = (index, meta)
|
||||||
|
|
||||||
def upsert(self, table_id, rows: List[Dict]):
|
def upsert(self, table_id, rows: List[Dict]):
|
||||||
|
print(f"[DEBUG] VectorStore.upsert called: table_id={table_id}, rows_count={len(rows)}")
|
||||||
# rows: [{row_id, embedding, metadata}]
|
# rows: [{row_id, embedding, metadata}]
|
||||||
index, meta = self.load(table_id)
|
index, meta = self.load(table_id)
|
||||||
|
print(f"[DEBUG] Loaded existing index: {index is not None}, existing meta count: {len(meta) if meta else 0}")
|
||||||
|
|
||||||
if index is None:
|
if index is None:
|
||||||
dim = len(rows[0]['embedding'])
|
dim = len(rows[0]['embedding'])
|
||||||
|
print(f"[DEBUG] Creating new index with dimension: {dim}")
|
||||||
index = faiss.IndexFlatL2(dim)
|
index = faiss.IndexFlatL2(dim)
|
||||||
meta = []
|
meta = []
|
||||||
|
else:
|
||||||
|
print(f"[DEBUG] Using existing index")
|
||||||
|
|
||||||
# Удаляем дубликаты row_id
|
# Удаляем дубликаты row_id
|
||||||
existing_ids = {m['row_id'] for m in meta}
|
existing_ids = {m['row_id'] for m in meta}
|
||||||
new_rows = [r for r in rows if r['row_id'] not in existing_ids]
|
new_rows = [r for r in rows if r['row_id'] not in existing_ids]
|
||||||
|
print(f"[DEBUG] Found {len(new_rows)} new rows to add (out of {len(rows)} total)")
|
||||||
|
|
||||||
if not new_rows:
|
if not new_rows:
|
||||||
|
print(f"[DEBUG] No new rows to add")
|
||||||
return
|
return
|
||||||
|
|
||||||
vectors = np.array([r['embedding'] for r in new_rows]).astype('float32')
|
vectors = np.array([r['embedding'] for r in new_rows]).astype('float32')
|
||||||
|
print(f"[DEBUG] Adding {len(vectors)} vectors to index")
|
||||||
index.add(vectors)
|
index.add(vectors)
|
||||||
meta.extend(new_rows)
|
meta.extend(new_rows)
|
||||||
|
print(f"[DEBUG] Total meta count after upsert: {len(meta)}")
|
||||||
self.save(table_id, index, meta)
|
self.save(table_id, index, meta)
|
||||||
|
print(f"[DEBUG] Index saved successfully")
|
||||||
|
|
||||||
def search(self, table_id, query_embedding, top_k=3):
|
def search(self, table_id, query_embedding, top_k=3):
|
||||||
|
print(f"[DEBUG] VectorStore.search called: table_id={table_id}, top_k={top_k}")
|
||||||
index, meta = self.load(table_id)
|
index, meta = self.load(table_id)
|
||||||
|
print(f"[DEBUG] Loaded index: {index is not None}, meta count: {len(meta) if meta else 0}")
|
||||||
|
|
||||||
if index is None or not meta:
|
if index is None or not meta:
|
||||||
|
print(f"[DEBUG] No index or meta found, returning empty results")
|
||||||
return []
|
return []
|
||||||
|
|
||||||
query = np.array([query_embedding]).astype('float32')
|
query = np.array([query_embedding]).astype('float32')
|
||||||
|
print(f"[DEBUG] Query shape: {query.shape}")
|
||||||
|
|
||||||
D, I = index.search(query, top_k)
|
D, I = index.search(query, top_k)
|
||||||
|
print(f"[DEBUG] FAISS search results - D: {D}, I: {I}")
|
||||||
|
|
||||||
results = []
|
results = []
|
||||||
for idx, dist in zip(I[0], D[0]):
|
for idx, dist in zip(I[0], D[0]):
|
||||||
|
print(f"[DEBUG] Processing result: idx={idx}, dist={dist}")
|
||||||
if idx < 0 or idx >= len(meta):
|
if idx < 0 or idx >= len(meta):
|
||||||
|
print(f"[DEBUG] Invalid index {idx}, skipping")
|
||||||
continue
|
continue
|
||||||
m = meta[idx]
|
m = meta[idx]
|
||||||
|
score = float(-dist) # FAISS: чем меньше dist, тем ближе
|
||||||
|
print(f"[DEBUG] Valid result: row_id={m['row_id']}, score={score}, metadata={m['metadata']}")
|
||||||
results.append({
|
results.append({
|
||||||
'row_id': m['row_id'],
|
'row_id': m['row_id'],
|
||||||
'score': float(-dist), # FAISS: чем меньше dist, тем ближе
|
'score': score,
|
||||||
'metadata': m['metadata']
|
'metadata': m['metadata']
|
||||||
})
|
})
|
||||||
|
|
||||||
|
print(f"[DEBUG] Returning {len(results)} results")
|
||||||
return results
|
return results
|
||||||
|
|
||||||
def delete(self, table_id, row_ids: List[str]):
|
def delete(self, table_id, row_ids: List[str]):
|
||||||
|
|||||||
Reference in New Issue
Block a user