ваше сообщение коммита
This commit is contained in:
@@ -1,6 +0,0 @@
|
||||
FROM node:18-alpine
|
||||
WORKDIR /app
|
||||
COPY cloudflared-agent.js .
|
||||
RUN yarn add express
|
||||
RUN apk add --no-cache docker-cli docker-compose
|
||||
CMD ["node", "cloudflared-agent.js"]
|
||||
@@ -1,48 +1,26 @@
|
||||
FROM node:20-bookworm as nodebase
|
||||
|
||||
FROM ubuntu:24.04
|
||||
FROM node:20-bookworm
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Устанавливаем зависимости, включая Python для node-gyp
|
||||
RUN apt-get update && apt-get install -y \
|
||||
python3 make g++ cmake openssl libssl-dev \
|
||||
ca-certificates curl gnupg lsb-release \
|
||||
build-essential python3-dev libc6-dev \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
# Устанавливаем только docker-cli (без демона)
|
||||
RUN apt-get update && \
|
||||
apt-get install -y ca-certificates curl gnupg lsb-release && \
|
||||
install -m 0755 -d /etc/apt/keyrings && \
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \
|
||||
chmod a+r /etc/apt/keyrings/docker.gpg && \
|
||||
echo \
|
||||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
|
||||
$(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
|
||||
tee /etc/apt/sources.list.d/docker.list > /dev/null && \
|
||||
apt-get update && \
|
||||
apt-get install -y docker-ce-cli && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Устанавливаем Node.js 20 и yarn
|
||||
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
|
||||
apt-get install -y nodejs && \
|
||||
npm install -g yarn
|
||||
|
||||
# Копируем libnode.so.109 из node:20-bookworm
|
||||
COPY --from=nodebase /usr/lib/x86_64-linux-gnu/libnode.so.109 /usr/lib/x86_64-linux-gnu/libnode.so.109
|
||||
|
||||
# Устанавливаем node-gyp глобально
|
||||
RUN npm install -g node-gyp
|
||||
|
||||
# Копируем package.json и yarn.lock для установки зависимостей
|
||||
COPY package.json yarn.lock ./
|
||||
|
||||
# Устанавливаем зависимости
|
||||
RUN yarn install --frozen-lockfile
|
||||
|
||||
# ПРИНУДИТЕЛЬНО пересобираем hnswlib-node из исходников
|
||||
RUN echo "Пересобираем hnswlib-node из исходников..." && \
|
||||
cd node_modules/hnswlib-node && \
|
||||
rm -rf build/ && \
|
||||
node-gyp rebuild --verbose
|
||||
|
||||
# Проверяем версию libstdc++ и наличие нужного символа
|
||||
RUN echo "Версия libstdc++:" && strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX | tail -5
|
||||
RUN echo "Проверка GLIBCXX_3.4.32:" && strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX_3.4.32 || echo "GLIBCXX_3.4.32 not found"
|
||||
|
||||
# Копируем остальные файлы проекта
|
||||
COPY . .
|
||||
|
||||
# Экспозим порт
|
||||
EXPOSE 8000
|
||||
|
||||
# Команда запуска по умолчанию
|
||||
CMD ["yarn", "run", "dev"]
|
||||
@@ -16,7 +16,6 @@ const userTagsRoutes = require('./routes/userTags');
|
||||
const tagsInitRoutes = require('./routes/tagsInit');
|
||||
const tagsRoutes = require('./routes/tags');
|
||||
const ragRoutes = require('./routes/rag'); // Новый роут для RAG-ассистента
|
||||
const cloudflareRoutes = require('./routes/cloudflare');
|
||||
const monitoringRoutes = require('./routes/monitoring');
|
||||
|
||||
// Проверка и создание директорий для хранения данных контрактов
|
||||
@@ -192,7 +191,6 @@ app.use('/api/tags', tagsInitRoutes);
|
||||
app.use('/api/tags', tagsRoutes);
|
||||
app.use('/api/identities', identitiesRoutes);
|
||||
app.use('/api/rag', ragRoutes); // Подключаем роут
|
||||
app.use('/api/cloudflare', cloudflareRoutes);
|
||||
app.use('/api/monitoring', monitoringRoutes);
|
||||
|
||||
const nonceStore = new Map(); // или любая другая реализация хранилища nonce
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
function writeCloudflaredEnv({ tunnelToken, domain }) {
|
||||
console.log('[writeCloudflaredEnv] tunnelToken:', tunnelToken, 'domain:', domain);
|
||||
const envPath = path.join(__dirname, '../cloudflared.env');
|
||||
let content = '';
|
||||
if (tunnelToken) content += `TUNNEL_TOKEN=${tunnelToken}\n`;
|
||||
if (domain) content += `DOMAIN=${domain}\n`;
|
||||
console.log('[writeCloudflaredEnv] Writing to:', envPath, 'content:', content);
|
||||
fs.writeFileSync(envPath, content, 'utf8');
|
||||
console.log('[writeCloudflaredEnv] File written successfully');
|
||||
}
|
||||
|
||||
module.exports = { writeCloudflaredEnv };
|
||||
@@ -1,6 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS ipfs_publications (
|
||||
id SERIAL PRIMARY KEY,
|
||||
cid TEXT NOT NULL,
|
||||
url TEXT NOT NULL,
|
||||
published_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
@@ -1,7 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS cloudflare_settings (
|
||||
id SERIAL PRIMARY KEY,
|
||||
api_token TEXT,
|
||||
tunnel_token TEXT,
|
||||
domain TEXT,
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
@@ -1 +0,0 @@
|
||||
ALTER TABLE cloudflare_settings ADD COLUMN account_id TEXT;
|
||||
@@ -1 +0,0 @@
|
||||
ALTER TABLE cloudflare_settings ADD COLUMN tunnel_id TEXT;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2116,3 +2116,300 @@
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T13:45:08.332Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T13:45:08.332Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T13:45:08.333Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:13:45.482Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.495Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:24:28.352Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:27:02.147Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:27:02.148Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:27:02.149Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:28:27.860Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:28:27.860Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:28:27.861Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:28:27.861Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:28:43.060Z"}
|
||||
{"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-04T21:29:10.790Z"}
|
||||
{"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-04T21:30:17.484Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:30:30.493Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:30:30.494Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:30:45.693Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.254Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T08:53:24.175Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.719Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T09:04:32.829Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:04:32.829Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:04:32.829Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:04:53.116Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:05:58.665Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:05:58.666Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:06:43.823Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.491Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.491Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.491Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.491Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.491Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.492Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.492Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:12:31.430Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:12:31.431Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:12:31.432Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:12:31.432Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.929Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.930Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.930Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.931Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.931Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.931Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.931Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.933Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.935Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.935Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.937Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:33.976Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:33.977Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:33.977Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.676Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.676Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.676Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.676Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.678Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.678Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:48.278Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:59:11.087Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:59:11.087Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:01.557Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:01.558Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:01.558Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:01.558Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:20.679Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:20.679Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:02:08.281Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:02:27.341Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:02:27.342Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:03:14.921Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:03:34.104Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:03:34.104Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:04:40.711Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:04:40.712Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:04:40.712Z"}
|
||||
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\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)\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)","timestamp":"2025-07-05T19:05:46.917Z"}
|
||||
{"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-05T19:05:47.002Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:05:47.493Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:05:47.494Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:05:47.494Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.642Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.643Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.643Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.643Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.643Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.643Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:09:07.514Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:09:07.515Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:09:07.515Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:09:55.004Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:10:14.238Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:10:14.239Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:11:24.583Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:11:24.587Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:11:24.588Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:12:27.512Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:12:27.512Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:12:27.513Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.485Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.486Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.487Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.487Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.488Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.488Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.488Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.488Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.488Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:16:54.457Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:16:54.458Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:16:54.458Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:17:41.916Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:18:00.784Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:18:00.784Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:19:07.422Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:19:07.423Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:19:07.423Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.991Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.992Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.992Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.992Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.993Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.993Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:22:27.568Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:22:27.568Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:22:27.569Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: write after end","timestamp":"2025-07-05T19:23:29.108Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: write after end","timestamp":"2025-07-05T19:23:29.108Z"}
|
||||
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\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)\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)","timestamp":"2025-07-05T19:24:40.124Z"}
|
||||
{"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-05T19:24:40.309Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:24:40.889Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:24:40.890Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:24:40.890Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:24:40.890Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:25:28.668Z"}
|
||||
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\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)\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)","timestamp":"2025-07-05T19:29:06.521Z"}
|
||||
{"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-05T19:29:06.612Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.497Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.497Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.499Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.682Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.682Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.682Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.682Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.683Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.683Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:32:31.089Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:32:31.090Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:32:31.090Z"}
|
||||
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\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)\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)","timestamp":"2025-07-05T19:33:33.543Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:33:34.415Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:33:34.415Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:33:34.416Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:34:40.859Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:34:40.861Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:34:40.861Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:35.004Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:35.008Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:35.009Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:35.009Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:54.176Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:54.177Z"}
|
||||
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\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)\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)","timestamp":"2025-07-05T19:37:59.957Z"}
|
||||
{"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-05T19:38:00.033Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:38:00.883Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:38:00.884Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:38:00.886Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:39:55.053Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:39:55.053Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:39:55.053Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:39:55.053Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:40:14.258Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:40:14.259Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:08.418Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:08.419Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:08.419Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:08.419Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:27.622Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:27.623Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:43:34.383Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:43:34.385Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:43:34.385Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:44:21.795Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:44:44.785Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:44:44.786Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:45:47.637Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:45:47.638Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:45:47.638Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:46:35.188Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:47:41.684Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:47:41.684Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:47:41.685Z"}
|
||||
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\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)\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)","timestamp":"2025-07-05T19:50:13.481Z"}
|
||||
{"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-05T19:50:13.727Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.449Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.450Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.450Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.450Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.450Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.450Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.451Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.451Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.318Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.319Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.320Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.320Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.320Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.320Z"}
|
||||
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\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)\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)","timestamp":"2025-07-05T19:53:33.130Z"}
|
||||
{"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-05T19:53:33.218Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:53:34.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:53:34.201Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:53:34.201Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:18.670Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:18.671Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:18.671Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:18.671Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:18.671Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:40.553Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:40.555Z"}
|
||||
{"level":"error","message":"[SessionService] Error cleaning session NNzFlSqL-TP1U2wa0GL9tgqO7QsdgZVB: 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 SessionService.cleanupProcessedGuestIds (/app/services/session-service.js:295:13)\n at async cleanupSessions (/app/scripts/cleanup-sessions.js:8:20)","timestamp":"2025-07-05T21:26:16.251Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.952Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.955Z"}
|
||||
{"level":"error","message":"[SessionService] Error preparing update for session NNzFlSqL-TP1U2wa0GL9tgqO7QsdgZVB: 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/services/session-service.js:303:34\n at async Promise.allSettled (index 0)\n at async SessionService.cleanupProcessedGuestIds (/app/services/session-service.js:319:29)\n at async cleanupSessions (/app/scripts/cleanup-sessions.js:8:20)","timestamp":"2025-07-05T21:28:03.634Z"}
|
||||
{"code":"42883","file":"parse_func.c","hint":"No function matches the given name and argument types. You might need to add explicit type casts.","length":224,"level":"error","line":"629","message":"[SessionService] Error during cleanup: function jsonb_set(json, unknown, jsonb) does not exist","name":"error","position":"37","routine":"ParseFuncOrColumn","severity":"ERROR","stack":"error: function jsonb_set(json, unknown, jsonb) does not exist\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 SessionService.cleanupProcessedGuestIds (/app/services/session-service.js:285:22)\n at async cleanupSessions (/app/scripts/cleanup-sessions.js:8:20)","timestamp":"2025-07-05T21:28:50.654Z"}
|
||||
{"code":"42883","file":"parse_oper.c","hint":"No operator matches the given name and argument types. You might need to add explicit type casts.","length":199,"level":"error","line":"647","message":"[SessionService] Error during cleanup: operator does not exist: json - unknown","name":"error","position":"42","routine":"op_error","severity":"ERROR","stack":"error: operator does not exist: json - unknown\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 SessionService.cleanupProcessedGuestIds (/app/services/session-service.js:285:22)\n at async cleanupSessions (/app/scripts/cleanup-sessions.js:8:20)","timestamp":"2025-07-05T21:29:17.406Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.008Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.009Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.009Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.010Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.010Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.010Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:35:31.211Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:35:31.212Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:35:31.212Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:35:31.213Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:35:50.053Z"}
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
"@openzeppelin/contracts": "5.2.0",
|
||||
"archiver": "^7.0.1",
|
||||
"axios": "^1.8.4",
|
||||
"cloudflare": "^4.4.1",
|
||||
"connect-pg-simple": "^10.0.0",
|
||||
"cookie": "^1.0.2",
|
||||
"cors": "^2.8.5",
|
||||
|
||||
@@ -457,8 +457,7 @@ router.post('/telegram/init', async (req, res) => {
|
||||
// и получаем результат (код и ссылку на бота)
|
||||
const result = await initTelegramAuth(req.session);
|
||||
|
||||
// Логируем сессию перед сохранением
|
||||
logger.info('[telegram/init] Session object before save:', req.session);
|
||||
|
||||
|
||||
// Сохраняем сессию, чтобы guestId точно записался в базу данных
|
||||
await sessionService.saveSession(req.session);
|
||||
|
||||
@@ -1,700 +0,0 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
let Cloudflare;
|
||||
try {
|
||||
Cloudflare = require('cloudflare');
|
||||
} catch (e) {
|
||||
console.warn('[Cloudflare] Cloudflare package not available:', e.message);
|
||||
Cloudflare = null;
|
||||
}
|
||||
const db = require('../db');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { exec } = require('child_process');
|
||||
const dockerComposePath = path.join(__dirname, '../../docker-compose.cloudflared.yml');
|
||||
const { addCloudflaredToCompose } = require('../utils/cloudflaredCompose');
|
||||
const { writeCloudflaredEnv } = require('../cloudflaredEnv');
|
||||
const axios = require('axios');
|
||||
const credentialsDir = '/home/alex/DApp-for-Business/.cloudflared';
|
||||
const tunnelName = 'hb3-accelerator'; // или из настроек
|
||||
|
||||
// --- Вспомогательные функции ---
|
||||
async function getSettings() {
|
||||
try {
|
||||
const { rows } = await db.query('SELECT * FROM cloudflare_settings ORDER BY id DESC LIMIT 1');
|
||||
return rows[0] || {};
|
||||
} catch (e) {
|
||||
console.error('[Cloudflare] Error getting settings:', e);
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
async function upsertSettings(fields) {
|
||||
try {
|
||||
const current = await getSettings();
|
||||
if (current.id) {
|
||||
const updates = [];
|
||||
const values = [];
|
||||
let idx = 1;
|
||||
for (const [k, v] of Object.entries(fields)) {
|
||||
updates.push(`${k} = $${idx}`);
|
||||
values.push(v);
|
||||
idx++;
|
||||
}
|
||||
values.push(current.id);
|
||||
await db.query(`UPDATE cloudflare_settings SET ${updates.join(', ')}, updated_at = NOW() WHERE id = $${idx}`, values);
|
||||
} else {
|
||||
const keys = Object.keys(fields);
|
||||
const values = Object.values(fields);
|
||||
await db.query(`INSERT INTO cloudflare_settings (${keys.join(',')}) VALUES (${keys.map((_,i)=>`$${i+1}`).join(',')})` , values);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('[Cloudflare] Error upserting settings:', e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
function generateDockerCompose(tunnelToken) {
|
||||
return `version: '3.8'
|
||||
services:
|
||||
cloudflared:
|
||||
image: cloudflare/cloudflared:latest
|
||||
command: tunnel --no-autoupdate run
|
||||
environment:
|
||||
- TUNNEL_TOKEN=${tunnelToken}
|
||||
restart: unless-stopped
|
||||
`;
|
||||
}
|
||||
|
||||
function runDockerCompose() {
|
||||
return new Promise((resolve, reject) => {
|
||||
exec(`docker-compose -f ${dockerComposePath} up -d cloudflared`, (err, stdout, stderr) => {
|
||||
if (err) return reject(stderr || err.message);
|
||||
resolve(stdout);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function checkCloudflaredStatus() {
|
||||
return new Promise((resolve) => {
|
||||
exec('docker ps --filter "name=cloudflared" --format "{{.Status}}"', (err, stdout) => {
|
||||
if (err) return resolve('not_installed');
|
||||
if (stdout.trim()) return resolve('running');
|
||||
resolve('not_running');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// --- API ---
|
||||
// Получить все настройки
|
||||
router.get('/settings', async (req, res) => {
|
||||
try {
|
||||
const settings = await getSettings();
|
||||
res.json({ success: true, settings });
|
||||
} catch (e) {
|
||||
res.json({ success: false, message: 'Ошибка получения настроек: ' + e.message });
|
||||
}
|
||||
});
|
||||
// Сохранить API Token
|
||||
router.post('/token', async (req, res) => {
|
||||
const { token } = req.body;
|
||||
if (!token) return res.status(400).json({ success: false, message: 'Token required' });
|
||||
try {
|
||||
await upsertSettings({ api_token: token });
|
||||
res.json({ success: true, message: 'API Token сохранён!' });
|
||||
} catch (e) {
|
||||
res.json({ success: false, message: 'Ошибка сохранения токена: ' + e.message });
|
||||
}
|
||||
});
|
||||
// Получить список аккаунтов пользователя по API Token
|
||||
router.post('/accounts', async (req, res) => {
|
||||
const { api_token } = req.body;
|
||||
if (!api_token) return res.status(400).json({ success: false, message: 'Token required' });
|
||||
try {
|
||||
const resp = await axios.get('https://api.cloudflare.com/client/v4/accounts', {
|
||||
headers: { Authorization: `Bearer ${api_token}` }
|
||||
});
|
||||
res.json({ success: true, accounts: resp.data.result });
|
||||
} catch (e) {
|
||||
res.json({ success: false, message: 'Ошибка Cloudflare API: ' + e.message });
|
||||
}
|
||||
});
|
||||
// Сохранить выбранный account_id
|
||||
router.post('/account-id', async (req, res) => {
|
||||
const { account_id } = req.body;
|
||||
if (!account_id) return res.status(400).json({ success: false, message: 'Account ID required' });
|
||||
try {
|
||||
await upsertSettings({ account_id });
|
||||
res.json({ success: true, message: 'Account ID сохранён!' });
|
||||
} catch (e) {
|
||||
res.json({ success: false, message: 'Ошибка сохранения Account ID: ' + e.message });
|
||||
}
|
||||
});
|
||||
// Новый /domain: полный цикл автоматизации через Cloudflare API
|
||||
router.post('/domain', async (req, res) => {
|
||||
const steps = [];
|
||||
try {
|
||||
console.log('[Cloudflare /domain] Starting domain connection process');
|
||||
|
||||
// 1. Сохраняем домен, если он пришёл с фронта
|
||||
const { domain: domainFromBody } = req.body;
|
||||
if (domainFromBody) {
|
||||
console.log('[Cloudflare /domain] Saving domain:', domainFromBody);
|
||||
await upsertSettings({ domain: domainFromBody });
|
||||
}
|
||||
|
||||
// 2. Получаем актуальные настройки
|
||||
const settings = await getSettings();
|
||||
console.log('[Cloudflare /domain] Current settings:', { ...settings, api_token: settings.api_token ? '[HIDDEN]' : 'null' });
|
||||
|
||||
const { api_token, domain, account_id, tunnel_id, tunnel_token } = settings;
|
||||
if (!api_token || !domain || !account_id) {
|
||||
console.error('[Cloudflare /domain] Missing required parameters:', { api_token: !!api_token, domain: !!domain, account_id: !!account_id });
|
||||
return res.json({ success: false, error: 'Не все параметры Cloudflare заданы (api_token, domain, account_id)' });
|
||||
}
|
||||
let tunnelId = tunnel_id;
|
||||
let tunnelToken = tunnel_token;
|
||||
// 1. Создание туннеля через Cloudflare API (только если нет tunnel_id)
|
||||
if (!tunnelId || !tunnelToken) {
|
||||
try {
|
||||
const tunnelName = `dapp-tunnel-${domain}`;
|
||||
const tunnelResp = await axios.post(
|
||||
`https://api.cloudflare.com/client/v4/accounts/${account_id}/cfd_tunnel`,
|
||||
{ name: tunnelName },
|
||||
{ headers: { Authorization: `Bearer ${api_token}` } }
|
||||
);
|
||||
tunnelId = tunnelResp.data.result.id;
|
||||
tunnelToken = tunnelResp.data.result.token;
|
||||
console.log('[Cloudflare] Получен tunnelId:', tunnelId, 'tunnelToken:', tunnelToken);
|
||||
// Сохраняем tunnel_id и tunnel_token в базу
|
||||
await upsertSettings({ tunnel_id: tunnelId, tunnel_token: tunnelToken, api_token, account_id, domain });
|
||||
steps.push({ step: 'create_tunnel', status: 'ok', message: 'Туннель создан через Cloudflare API и все параметры сохранены.' });
|
||||
} catch (e) {
|
||||
steps.push({ step: 'create_tunnel', status: 'error', message: 'Ошибка создания туннеля: ' + e.message });
|
||||
return res.json({ success: false, steps, error: e.message });
|
||||
}
|
||||
} else {
|
||||
steps.push({ step: 'use_existing_tunnel', status: 'ok', message: 'Используется существующий туннель.' });
|
||||
}
|
||||
// 2. Сохранение tunnel_token в cloudflared.env
|
||||
try {
|
||||
writeCloudflaredEnv({ tunnelToken, domain });
|
||||
steps.push({ step: 'save_token', status: 'ok', message: 'TUNNEL_TOKEN сохранён в cloudflared.env.' });
|
||||
} catch (e) {
|
||||
steps.push({ step: 'save_token', status: 'error', message: 'Ошибка сохранения tunnel_token: ' + e.message });
|
||||
return res.json({ success: false, steps, error: e.message });
|
||||
}
|
||||
// 3. Создание маршрута (ingress) через Cloudflare API
|
||||
try {
|
||||
await axios.put(
|
||||
`https://api.cloudflare.com/client/v4/accounts/${account_id}/cfd_tunnel/${tunnelId}/configurations`,
|
||||
{
|
||||
config: {
|
||||
ingress: [
|
||||
{ hostname: domain, service: 'http://localhost:5173' },
|
||||
{ service: 'http_status:404' }
|
||||
]
|
||||
}
|
||||
},
|
||||
{ headers: { Authorization: `Bearer ${api_token}` } }
|
||||
);
|
||||
steps.push({ step: 'create_route', status: 'ok', message: 'Маршрут для домена создан.' });
|
||||
} catch (e) {
|
||||
let errorMsg = e.message;
|
||||
if (e.response && e.response.data) {
|
||||
errorMsg += ' | ' + JSON.stringify(e.response.data);
|
||||
}
|
||||
steps.push({ step: 'create_route', status: 'error', message: 'Ошибка создания маршрута: ' + errorMsg });
|
||||
return res.json({ success: false, steps, error: errorMsg });
|
||||
}
|
||||
|
||||
// 3.5. Автоматическое создание DNS записей для туннеля
|
||||
try {
|
||||
console.log('[Cloudflare /domain] Creating DNS records automatically...');
|
||||
|
||||
// Получаем зону для домена
|
||||
const zonesResp = await axios.get('https://api.cloudflare.com/client/v4/zones', {
|
||||
headers: { Authorization: `Bearer ${api_token}` },
|
||||
params: { name: domain }
|
||||
});
|
||||
|
||||
const zones = zonesResp.data.result;
|
||||
if (!zones || zones.length === 0) {
|
||||
steps.push({ step: 'create_dns', status: 'error', message: 'Домен не найден в Cloudflare аккаунте для создания DNS записей' });
|
||||
console.log('[Cloudflare /domain] Domain not found in Cloudflare account, skipping DNS creation');
|
||||
} else {
|
||||
const zoneId = zones[0].id;
|
||||
|
||||
// Получаем существующие DNS записи
|
||||
const recordsResp = await axios.get(`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`, {
|
||||
headers: { Authorization: `Bearer ${api_token}` }
|
||||
});
|
||||
|
||||
const existingRecords = recordsResp.data.result || [];
|
||||
|
||||
// Проверяем, есть ли уже запись для основного домена, указывающая на туннель
|
||||
const tunnelCnamePattern = new RegExp(`${tunnelId}\.cfargotunnel\.com`);
|
||||
const hasMainRecord = existingRecords.some(record =>
|
||||
record.name === domain &&
|
||||
(
|
||||
(record.type === 'CNAME' && tunnelCnamePattern.test(record.content)) ||
|
||||
(record.type === 'CNAME' && record.content.includes('cfargotunnel.com'))
|
||||
)
|
||||
);
|
||||
|
||||
if (!hasMainRecord) {
|
||||
// Удаляем конфликтующие записи для основного домена (A, AAAA, CNAME)
|
||||
const conflictingRecords = existingRecords.filter(record =>
|
||||
record.name === domain && ['A', 'AAAA', 'CNAME'].includes(record.type)
|
||||
);
|
||||
|
||||
for (const conflictRecord of conflictingRecords) {
|
||||
try {
|
||||
await axios.delete(
|
||||
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records/${conflictRecord.id}`,
|
||||
{ headers: { Authorization: `Bearer ${api_token}` } }
|
||||
);
|
||||
console.log('[Cloudflare /domain] Removed conflicting record:', conflictRecord.type, conflictRecord.name, conflictRecord.content);
|
||||
} catch (delErr) {
|
||||
console.warn('[Cloudflare /domain] Failed to delete conflicting record:', delErr.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Создаем CNAME запись для основного домена
|
||||
const cnameRecord = {
|
||||
type: 'CNAME',
|
||||
name: domain,
|
||||
content: `${tunnelId}.cfargotunnel.com`,
|
||||
ttl: 1,
|
||||
proxied: true
|
||||
};
|
||||
|
||||
const createResp = await axios.post(
|
||||
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`,
|
||||
cnameRecord,
|
||||
{ headers: { Authorization: `Bearer ${api_token}` } }
|
||||
);
|
||||
|
||||
console.log('[Cloudflare /domain] Main CNAME record created:', createResp.data.result);
|
||||
steps.push({ step: 'create_dns', status: 'ok', message: `DNS запись создана: ${domain} -> ${tunnelId}.cfargotunnel.com (проксирована)` });
|
||||
} else {
|
||||
console.log('[Cloudflare /domain] Main record already exists and points to tunnel');
|
||||
steps.push({ step: 'create_dns', status: 'ok', message: 'DNS запись для основного домена уже существует и настроена правильно' });
|
||||
}
|
||||
|
||||
// Создаем www поддомен только для корневых доменов (не для поддоменов)
|
||||
const domainParts = domain.split('.');
|
||||
const isRootDomain = domainParts.length === 2; // example.com, а не subdomain.example.com
|
||||
|
||||
if (isRootDomain) {
|
||||
// Обновляем список записей после возможных изменений
|
||||
const updatedRecordsResp = await axios.get(`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`, {
|
||||
headers: { Authorization: `Bearer ${api_token}` }
|
||||
});
|
||||
const updatedRecords = updatedRecordsResp.data.result || [];
|
||||
|
||||
// Проверяем, есть ли уже запись для www поддомена
|
||||
const hasWwwRecord = updatedRecords.some(record =>
|
||||
record.name === `www.${domain}` &&
|
||||
(
|
||||
(record.type === 'CNAME' && tunnelCnamePattern.test(record.content)) ||
|
||||
(record.type === 'CNAME' && record.content.includes('cfargotunnel.com'))
|
||||
)
|
||||
);
|
||||
|
||||
if (!hasWwwRecord) {
|
||||
// Удаляем конфликтующие записи для www поддомена
|
||||
const conflictingWwwRecords = updatedRecords.filter(record =>
|
||||
record.name === `www.${domain}` && ['A', 'AAAA', 'CNAME'].includes(record.type)
|
||||
);
|
||||
|
||||
for (const conflictRecord of conflictingWwwRecords) {
|
||||
try {
|
||||
await axios.delete(
|
||||
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records/${conflictRecord.id}`,
|
||||
{ headers: { Authorization: `Bearer ${api_token}` } }
|
||||
);
|
||||
console.log('[Cloudflare /domain] Removed conflicting www record:', conflictRecord.type, conflictRecord.name, conflictRecord.content);
|
||||
} catch (delErr) {
|
||||
console.warn('[Cloudflare /domain] Failed to delete conflicting www record:', delErr.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Создаем CNAME запись для www поддомена
|
||||
const wwwCnameRecord = {
|
||||
type: 'CNAME',
|
||||
name: `www.${domain}`,
|
||||
content: `${tunnelId}.cfargotunnel.com`,
|
||||
ttl: 1,
|
||||
proxied: true
|
||||
};
|
||||
|
||||
const createWwwResp = await axios.post(
|
||||
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`,
|
||||
wwwCnameRecord,
|
||||
{ headers: { Authorization: `Bearer ${api_token}` } }
|
||||
);
|
||||
|
||||
console.log('[Cloudflare /domain] WWW CNAME record created:', createWwwResp.data.result);
|
||||
steps.push({ step: 'create_dns_www', status: 'ok', message: `DNS запись создана: www.${domain} -> ${tunnelId}.cfargotunnel.com (проксирована)` });
|
||||
} else {
|
||||
console.log('[Cloudflare /domain] WWW record already exists and points to tunnel');
|
||||
steps.push({ step: 'create_dns_www', status: 'ok', message: 'DNS запись для www поддомена уже существует и настроена правильно' });
|
||||
}
|
||||
} else {
|
||||
console.log('[Cloudflare /domain] Skipping www subdomain creation for non-root domain');
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('[Cloudflare /domain] Error creating DNS records:', e);
|
||||
steps.push({ step: 'create_dns', status: 'error', message: 'Ошибка создания DNS записей: ' + (e.response?.data?.errors?.[0]?.message || e.message) });
|
||||
// Не прерываем процесс, DNS можно настроить вручную
|
||||
}
|
||||
// 4. Перезапуск cloudflared через docker compose
|
||||
try {
|
||||
console.log('[Cloudflare /domain] Restarting cloudflared via docker compose...');
|
||||
const { exec } = require('child_process');
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
exec('cd /app && docker compose restart cloudflared', (err, stdout, stderr) => {
|
||||
if (err) {
|
||||
console.error('[Cloudflare /domain] Docker compose restart error:', stderr || err.message);
|
||||
reject(new Error(stderr || err.message));
|
||||
} else {
|
||||
console.log('[Cloudflare /domain] Docker compose restart success:', stdout);
|
||||
resolve(stdout);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
steps.push({ step: 'restart_cloudflared', status: 'ok', message: 'cloudflared перезапущен.' });
|
||||
} catch (e) {
|
||||
console.error('[Cloudflare /domain] Error restarting cloudflared:', e.message);
|
||||
steps.push({ step: 'restart_cloudflared', status: 'error', message: 'Ошибка перезапуска cloudflared: ' + e.message });
|
||||
// Не возвращаем ошибку, так как туннель создан
|
||||
console.log('[Cloudflare /domain] Continuing despite restart error...');
|
||||
}
|
||||
// 5. Возврат app_url
|
||||
res.json({
|
||||
success: true,
|
||||
app_url: `https://${domain}`,
|
||||
message: 'Туннель и маршрут успешно созданы. Ваше приложение доступно по ссылке.',
|
||||
steps
|
||||
});
|
||||
} catch (e) {
|
||||
steps.push({ step: 'fatal', status: 'error', message: e.message });
|
||||
res.json({ success: false, steps, error: e.message });
|
||||
}
|
||||
});
|
||||
// Проверить домен через Cloudflare API (опционально)
|
||||
router.post('/check-domain', async (req, res) => {
|
||||
if (!Cloudflare) return res.json({ success: false, message: 'Cloudflare не доступен на сервере' });
|
||||
const { api_token, domain } = req.body;
|
||||
if (!api_token || !domain) return res.status(400).json({ success: false, message: 'Token и domain обязательны' });
|
||||
try {
|
||||
const cf = new Cloudflare({ apiToken: api_token });
|
||||
const zones = await cf.zones.browse();
|
||||
const found = zones.result.find(z => z.name === domain);
|
||||
if (!found) return res.status(400).json({ success: false, message: 'Домен не найден в Cloudflare аккаунте' });
|
||||
res.json({ success: true, message: 'Домен найден в Cloudflare аккаунте' });
|
||||
} catch (e) {
|
||||
res.json({ success: false, message: 'Ошибка Cloudflare API: ' + e.message });
|
||||
}
|
||||
});
|
||||
// Установить Cloudflared в Docker (добавить в compose и запустить)
|
||||
router.post('/install', async (req, res) => {
|
||||
console.log('[CloudflareInstall] Запрос на установку cloudflared');
|
||||
const settings = await getSettings();
|
||||
console.log('[CloudflareInstall] Текущие настройки:', settings);
|
||||
if (!settings.tunnel_token) {
|
||||
console.warn('[CloudflareInstall] Нет tunnel_token, установка невозможна');
|
||||
return res.status(400).json({ success: false, message: 'Сначала сохраните Tunnel Token' });
|
||||
}
|
||||
try {
|
||||
console.log('[CloudflareInstall] Запись cloudflared.env...');
|
||||
writeCloudflaredEnv({ tunnelToken: settings.tunnel_token, domain: settings.domain });
|
||||
console.log('[CloudflareInstall] Перезапуск cloudflared через docker compose...');
|
||||
exec('docker-compose up -d cloudflared', (err, stdout, stderr) => {
|
||||
if (err) {
|
||||
console.error('[CloudflareInstall] Ошибка docker compose:', stderr || err.message);
|
||||
return res.json({ success: false, message: 'Ошибка docker compose: ' + (stderr || err.message) });
|
||||
}
|
||||
console.log('[CloudflareInstall] Cloudflared перезапущен:', stdout);
|
||||
res.json({ success: true, message: 'Cloudflared переменные обновлены и контейнер перезапущен!' });
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('[CloudflareInstall] Ошибка:', e);
|
||||
res.json({ success: false, message: 'Ошибка: ' + (e.message || e) });
|
||||
}
|
||||
});
|
||||
// Получить статус Cloudflared, домена и туннеля
|
||||
router.get('/status', async (req, res) => {
|
||||
const status = await checkCloudflaredStatus();
|
||||
const settings = await getSettings();
|
||||
let domainStatus = 'not_configured';
|
||||
let domainMsg = 'Cloudflare не настроен';
|
||||
let tunnelStatus = 'not_configured';
|
||||
let tunnelMsg = 'Cloudflare не настроен';
|
||||
if (!Cloudflare) {
|
||||
return res.json({
|
||||
success: true,
|
||||
status,
|
||||
domainStatus: 'not_available',
|
||||
domainMsg: 'Пакет cloudflare не установлен',
|
||||
tunnelStatus: 'not_available',
|
||||
tunnelMsg: 'Пакет cloudflare не установлен',
|
||||
message: 'Cloudflare не доступен на сервере'
|
||||
});
|
||||
}
|
||||
if (settings.api_token && settings.domain) {
|
||||
try {
|
||||
const cf = new Cloudflare({ apiToken: settings.api_token });
|
||||
const zonesResp = await cf.zones.list();
|
||||
const zones = zonesResp.result;
|
||||
const found = zones.find(z => z.name === settings.domain);
|
||||
if (found) {
|
||||
domainStatus = 'ok';
|
||||
domainMsg = 'Домен найден в Cloudflare аккаунте';
|
||||
} else {
|
||||
domainStatus = 'not_found';
|
||||
domainMsg = 'Домен не найден в Cloudflare аккаунте';
|
||||
}
|
||||
} catch (e) {
|
||||
domainStatus = 'error';
|
||||
domainMsg = 'Ошибка Cloudflare API: ' + e.message;
|
||||
}
|
||||
}
|
||||
if (settings.api_token && settings.tunnel_id && settings.account_id) {
|
||||
try {
|
||||
console.log('[Cloudflare /status] Checking tunnel status...');
|
||||
const tunnelsResp = await axios.get(
|
||||
`https://api.cloudflare.com/client/v4/accounts/${settings.account_id}/cfd_tunnel`,
|
||||
{ headers: { Authorization: `Bearer ${settings.api_token}` } }
|
||||
);
|
||||
const tunnels = tunnelsResp.data.result || [];
|
||||
console.log('[Cloudflare /status] Found tunnels:', tunnels.map(t => ({ id: t.id, name: t.name, status: t.status })));
|
||||
|
||||
const foundTunnel = tunnels.find(t => t.id === settings.tunnel_id);
|
||||
if (foundTunnel) {
|
||||
tunnelStatus = foundTunnel.status || 'active';
|
||||
tunnelMsg = `Туннель найден: ${foundTunnel.name || foundTunnel.id}, статус: ${foundTunnel.status}`;
|
||||
console.log('[Cloudflare /status] Tunnel found:', foundTunnel);
|
||||
} else {
|
||||
tunnelStatus = 'not_found';
|
||||
tunnelMsg = 'Туннель не найден в Cloudflare аккаунте';
|
||||
console.log('[Cloudflare /status] Tunnel not found. Looking for tunnel_id:', settings.tunnel_id);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('[Cloudflare /status] Error checking tunnel:', e);
|
||||
tunnelStatus = 'error';
|
||||
tunnelMsg = 'Ошибка Cloudflare API (туннель): ' + e.message;
|
||||
}
|
||||
}
|
||||
res.json({
|
||||
success: true,
|
||||
status,
|
||||
domainStatus,
|
||||
domainMsg,
|
||||
tunnelStatus,
|
||||
tunnelMsg,
|
||||
message: `Cloudflared статус: ${status}, домен: ${domainStatus}, туннель: ${tunnelStatus}`
|
||||
});
|
||||
});
|
||||
|
||||
// --- DNS Управление ---
|
||||
|
||||
// Получить список DNS записей для домена
|
||||
router.get('/dns-records', async (req, res) => {
|
||||
try {
|
||||
const settings = await getSettings();
|
||||
const { api_token, domain } = settings;
|
||||
|
||||
if (!api_token || !domain) {
|
||||
return res.json({
|
||||
success: false,
|
||||
message: 'API Token и домен должны быть настроены'
|
||||
});
|
||||
}
|
||||
|
||||
// Получаем зону для домена
|
||||
const zonesResp = await axios.get('https://api.cloudflare.com/client/v4/zones', {
|
||||
headers: { Authorization: `Bearer ${api_token}` },
|
||||
params: { name: domain }
|
||||
});
|
||||
|
||||
const zones = zonesResp.data.result;
|
||||
if (!zones || zones.length === 0) {
|
||||
return res.json({
|
||||
success: false,
|
||||
message: 'Домен не найден в Cloudflare аккаунте'
|
||||
});
|
||||
}
|
||||
|
||||
const zoneId = zones[0].id;
|
||||
|
||||
// Получаем DNS записи для зоны
|
||||
const recordsResp = await axios.get(`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`, {
|
||||
headers: { Authorization: `Bearer ${api_token}` }
|
||||
});
|
||||
|
||||
const records = recordsResp.data.result || [];
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
records: records.map(record => ({
|
||||
id: record.id,
|
||||
type: record.type,
|
||||
name: record.name,
|
||||
content: record.content,
|
||||
ttl: record.ttl,
|
||||
proxied: record.proxied,
|
||||
zone_id: record.zone_id,
|
||||
zone_name: record.zone_name,
|
||||
created_on: record.created_on,
|
||||
modified_on: record.modified_on
|
||||
})),
|
||||
zone_id: zoneId
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('[Cloudflare /dns-records] Error:', e);
|
||||
res.json({
|
||||
success: false,
|
||||
message: 'Ошибка получения DNS записей: ' + (e.response?.data?.errors?.[0]?.message || e.message)
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Создать/обновить DNS запись
|
||||
router.post('/dns-records', async (req, res) => {
|
||||
try {
|
||||
const settings = await getSettings();
|
||||
const { api_token, domain } = settings;
|
||||
const { type, name, content, ttl = 1, proxied = false, recordId } = req.body;
|
||||
|
||||
if (!api_token || !domain) {
|
||||
return res.json({
|
||||
success: false,
|
||||
message: 'API Token и домен должны быть настроены'
|
||||
});
|
||||
}
|
||||
|
||||
if (!type || !name || !content) {
|
||||
return res.json({
|
||||
success: false,
|
||||
message: 'Обязательные поля: type, name, content'
|
||||
});
|
||||
}
|
||||
|
||||
// Получаем зону для домена
|
||||
const zonesResp = await axios.get('https://api.cloudflare.com/client/v4/zones', {
|
||||
headers: { Authorization: `Bearer ${api_token}` },
|
||||
params: { name: domain }
|
||||
});
|
||||
|
||||
const zones = zonesResp.data.result;
|
||||
if (!zones || zones.length === 0) {
|
||||
return res.json({
|
||||
success: false,
|
||||
message: 'Домен не найден в Cloudflare аккаунте'
|
||||
});
|
||||
}
|
||||
|
||||
const zoneId = zones[0].id;
|
||||
const recordData = { type, name, content, ttl };
|
||||
|
||||
// Добавляем proxied только для типов записей, которые поддерживают прокси
|
||||
if (['A', 'AAAA', 'CNAME'].includes(type)) {
|
||||
recordData.proxied = proxied;
|
||||
}
|
||||
|
||||
let result;
|
||||
if (recordId) {
|
||||
// Обновляем существующую запись
|
||||
const updateResp = await axios.put(
|
||||
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records/${recordId}`,
|
||||
recordData,
|
||||
{ headers: { Authorization: `Bearer ${api_token}` } }
|
||||
);
|
||||
result = updateResp.data.result;
|
||||
} else {
|
||||
// Создаем новую запись
|
||||
const createResp = await axios.post(
|
||||
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`,
|
||||
recordData,
|
||||
{ headers: { Authorization: `Bearer ${api_token}` } }
|
||||
);
|
||||
result = createResp.data.result;
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: recordId ? 'DNS запись обновлена' : 'DNS запись создана',
|
||||
record: {
|
||||
id: result.id,
|
||||
type: result.type,
|
||||
name: result.name,
|
||||
content: result.content,
|
||||
ttl: result.ttl,
|
||||
proxied: result.proxied,
|
||||
zone_id: result.zone_id
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('[Cloudflare /dns-records POST] Error:', e);
|
||||
res.json({
|
||||
success: false,
|
||||
message: 'Ошибка создания/обновления DNS записи: ' + (e.response?.data?.errors?.[0]?.message || e.message)
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Удалить DNS запись
|
||||
router.delete('/dns-records/:recordId', async (req, res) => {
|
||||
try {
|
||||
const settings = await getSettings();
|
||||
const { api_token, domain } = settings;
|
||||
const { recordId } = req.params;
|
||||
|
||||
if (!api_token || !domain) {
|
||||
return res.json({
|
||||
success: false,
|
||||
message: 'API Token и домен должны быть настроены'
|
||||
});
|
||||
}
|
||||
|
||||
// Получаем зону для домена
|
||||
const zonesResp = await axios.get('https://api.cloudflare.com/client/v4/zones', {
|
||||
headers: { Authorization: `Bearer ${api_token}` },
|
||||
params: { name: domain }
|
||||
});
|
||||
|
||||
const zones = zonesResp.data.result;
|
||||
if (!zones || zones.length === 0) {
|
||||
return res.json({
|
||||
success: false,
|
||||
message: 'Домен не найден в Cloudflare аккаунте'
|
||||
});
|
||||
}
|
||||
|
||||
const zoneId = zones[0].id;
|
||||
|
||||
// Удаляем DNS запись
|
||||
await axios.delete(
|
||||
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records/${recordId}`,
|
||||
{ headers: { Authorization: `Bearer ${api_token}` } }
|
||||
);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: 'DNS запись удалена'
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('[Cloudflare /dns-records DELETE] Error:', e);
|
||||
res.json({
|
||||
success: false,
|
||||
message: 'Ошибка удаления DNS записи: ' + (e.response?.data?.errors?.[0]?.message || e.message)
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
23
backend/scripts/cleanup-sessions.js
Normal file
23
backend/scripts/cleanup-sessions.js
Normal file
@@ -0,0 +1,23 @@
|
||||
const sessionService = require('../services/session-service');
|
||||
const db = require('../db');
|
||||
|
||||
async function cleanupSessions() {
|
||||
try {
|
||||
console.log('Starting session cleanup...');
|
||||
|
||||
const result = await sessionService.cleanupProcessedGuestIds();
|
||||
|
||||
if (result) {
|
||||
console.log('Session cleanup completed successfully');
|
||||
} else {
|
||||
console.log('Session cleanup failed');
|
||||
}
|
||||
|
||||
process.exit(0);
|
||||
} catch (error) {
|
||||
console.error('Error during cleanup:', error);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
cleanupSessions();
|
||||
@@ -13,16 +13,12 @@ class SessionService {
|
||||
*/
|
||||
async saveSession(session) {
|
||||
try {
|
||||
// Логируем содержимое сессии перед сохранением
|
||||
logger.info('[SessionService] Saving session data:', session);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
session.save((err) => {
|
||||
if (err) {
|
||||
logger.error('Error saving session:', err);
|
||||
reject(err);
|
||||
} else {
|
||||
logger.info('Session saved successfully');
|
||||
resolve(true);
|
||||
}
|
||||
});
|
||||
@@ -41,16 +37,7 @@ class SessionService {
|
||||
*/
|
||||
async linkGuestMessages(session, userId) {
|
||||
try {
|
||||
logger.info(
|
||||
`[linkGuestMessages] Starting for user ${userId} with guestId=${session.guestId}, previousGuestId=${session.previousGuestId}`
|
||||
);
|
||||
|
||||
// Инициализируем массив обработанных гостевых ID, если его нет
|
||||
if (!session.processedGuestIds) {
|
||||
session.processedGuestIds = [];
|
||||
}
|
||||
|
||||
// Получаем все гостевые ID для текущего пользователя из новой таблицы
|
||||
// Получаем все гостевые ID для текущего пользователя из таблицы
|
||||
const guestIdsResult = await db.getQuery()(
|
||||
'SELECT guest_id FROM guest_user_mapping WHERE user_id = $1',
|
||||
[userId]
|
||||
@@ -60,39 +47,52 @@ class SessionService {
|
||||
// Собираем все гостевые ID, которые нужно обработать
|
||||
const guestIdsToProcess = new Set();
|
||||
|
||||
// Добавляем текущий гостевой ID
|
||||
if (session.guestId && !session.processedGuestIds.includes(session.guestId)) {
|
||||
guestIdsToProcess.add(session.guestId);
|
||||
// Добавляем текущий гостевой ID, если он есть и не обработан в БД
|
||||
if (session.guestId) {
|
||||
const isProcessed = await this.isGuestIdProcessed(session.guestId);
|
||||
if (!isProcessed) {
|
||||
guestIdsToProcess.add(session.guestId);
|
||||
|
||||
// Записываем связь с пользователем в новую таблицу
|
||||
await db.getQuery()(
|
||||
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
|
||||
[userId, session.guestId]
|
||||
);
|
||||
// Записываем связь с пользователем в новую таблицу
|
||||
await db.getQuery()(
|
||||
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
|
||||
[userId, session.guestId]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Добавляем предыдущий гостевой ID
|
||||
if (session.previousGuestId && !session.processedGuestIds.includes(session.previousGuestId)) {
|
||||
guestIdsToProcess.add(session.previousGuestId);
|
||||
// Добавляем предыдущий гостевой ID, если он есть и не обработан в БД
|
||||
if (session.previousGuestId) {
|
||||
const isProcessed = await this.isGuestIdProcessed(session.previousGuestId);
|
||||
if (!isProcessed) {
|
||||
guestIdsToProcess.add(session.previousGuestId);
|
||||
|
||||
// Записываем связь с пользователем в новую таблицу
|
||||
await db.getQuery()(
|
||||
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
|
||||
[userId, session.previousGuestId]
|
||||
);
|
||||
// Записываем связь с пользователем в новую таблицу
|
||||
await db.getQuery()(
|
||||
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
|
||||
[userId, session.previousGuestId]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Добавляем все гостевые ID пользователя из таблицы
|
||||
// Добавляем все гостевые ID пользователя из таблицы, которые еще не обработаны
|
||||
for (const guestId of userGuestIds) {
|
||||
if (!session.processedGuestIds.includes(guestId)) {
|
||||
const isProcessed = await this.isGuestIdProcessed(guestId);
|
||||
if (!isProcessed) {
|
||||
guestIdsToProcess.add(guestId);
|
||||
}
|
||||
}
|
||||
|
||||
// Логируем только если есть что обрабатывать
|
||||
if (guestIdsToProcess.size > 0) {
|
||||
logger.info(
|
||||
`[linkGuestMessages] Processing ${guestIdsToProcess.size} guest IDs for user ${userId}`
|
||||
);
|
||||
}
|
||||
|
||||
// Обрабатываем все собранные гостевые ID
|
||||
for (const guestId of guestIdsToProcess) {
|
||||
await this.processGuestMessagesWrapper(userId, guestId);
|
||||
session.processedGuestIds.push(guestId);
|
||||
|
||||
// Помечаем guestId как обработанный в базе данных
|
||||
await db.getQuery()(
|
||||
@@ -101,9 +101,6 @@ class SessionService {
|
||||
);
|
||||
}
|
||||
|
||||
// Сохраняем сессию
|
||||
await this.saveSession(session);
|
||||
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
logger.error('[linkGuestMessages] Error:', error);
|
||||
@@ -111,6 +108,25 @@ class SessionService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, был ли guest ID уже обработан
|
||||
* @param {string} guestId - ID гостя
|
||||
* @returns {Promise<boolean>} - Был ли guest ID обработан
|
||||
*/
|
||||
async isGuestIdProcessed(guestId) {
|
||||
try {
|
||||
const result = await db.getQuery()(
|
||||
'SELECT processed FROM guest_user_mapping WHERE guest_id = $1',
|
||||
[guestId]
|
||||
);
|
||||
|
||||
return result.rows.length > 0 && result.rows[0].processed === true;
|
||||
} catch (error) {
|
||||
logger.error(`[isGuestIdProcessed] Error checking guest ID ${guestId}:`, error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Обертка для функции processGuestMessages
|
||||
* @param {number} userId - ID пользователя
|
||||
@@ -119,9 +135,6 @@ class SessionService {
|
||||
*/
|
||||
async processGuestMessagesWrapper(userId, guestId) {
|
||||
try {
|
||||
logger.info(
|
||||
`[processGuestMessagesWrapper] Processing messages: userId=${userId}, guestId=${guestId}`
|
||||
);
|
||||
return await processGuestMessages(userId, guestId);
|
||||
} catch (error) {
|
||||
logger.error(`[processGuestMessagesWrapper] Error: ${error.message}`, error);
|
||||
@@ -260,6 +273,29 @@ class SessionService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Очищает все массивы processedGuestIds из сессий в базе данных
|
||||
* @returns {Promise<boolean>} - Результат операции
|
||||
*/
|
||||
async cleanupProcessedGuestIds() {
|
||||
try {
|
||||
logger.info('[SessionService] Starting cleanup of processedGuestIds from sessions');
|
||||
|
||||
// Используем один SQL-запрос для обновления всех сессий
|
||||
const result = await db.getQuery()(
|
||||
`UPDATE session
|
||||
SET sess = (sess::jsonb - 'processedGuestIds')::json
|
||||
WHERE sess::text LIKE '%"processedGuestIds"%'`
|
||||
);
|
||||
|
||||
logger.info(`[SessionService] Cleaned processedGuestIds from ${result.rowCount} sessions`);
|
||||
return true;
|
||||
} catch (error) {
|
||||
logger.error('[SessionService] Error during cleanup:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Очищает данные аутентификации в сессии
|
||||
* @param {object} session - Объект сессии
|
||||
@@ -286,6 +322,11 @@ class SessionService {
|
||||
delete session.telegramUsername;
|
||||
delete session.telegramFirstName;
|
||||
|
||||
// Очищаем массив processedGuestIds для экономии места
|
||||
if (session.processedGuestIds) {
|
||||
delete session.processedGuestIds;
|
||||
}
|
||||
|
||||
// Восстанавливаем гостевой ID для продолжения работы
|
||||
if (guestId) {
|
||||
session.guestId = guestId;
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const yaml = require('js-yaml');
|
||||
|
||||
const composePath = '/docker-compose.yml';
|
||||
|
||||
function addCloudflaredToCompose(tunnelToken) {
|
||||
console.log('[cloudflaredCompose] process.cwd():', process.cwd());
|
||||
console.log('[cloudflaredCompose] __dirname:', __dirname);
|
||||
console.log('[cloudflaredCompose] Ожидаемый путь к compose:', composePath);
|
||||
if (!fs.existsSync(composePath)) {
|
||||
console.error('[cloudflaredCompose] Файл не найден:', composePath);
|
||||
throw new Error('docker-compose.yml не найден по пути: ' + composePath);
|
||||
}
|
||||
let doc;
|
||||
try {
|
||||
doc = yaml.load(fs.readFileSync(composePath, 'utf8'));
|
||||
} catch (e) {
|
||||
console.error('[cloudflaredCompose] Ошибка чтения compose:', e);
|
||||
throw e;
|
||||
}
|
||||
doc.services = doc.services || {};
|
||||
doc.services.cloudflared = {
|
||||
image: 'cloudflare/cloudflared:latest',
|
||||
command: 'tunnel --no-autoupdate run',
|
||||
environment: [`TUNNEL_TOKEN=${tunnelToken}`],
|
||||
restart: 'unless-stopped'
|
||||
};
|
||||
try {
|
||||
fs.writeFileSync(composePath, yaml.dump(doc), 'utf8');
|
||||
console.log('[cloudflaredCompose] cloudflared добавлен в compose:', composePath);
|
||||
} catch (e) {
|
||||
console.error('[cloudflaredCompose] Ошибка записи compose:', e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { addCloudflaredToCompose };
|
||||
@@ -89,19 +89,19 @@
|
||||
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
|
||||
integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
|
||||
|
||||
"@eslint/config-array@^0.20.1":
|
||||
version "0.20.1"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.1.tgz#454f89be82b0e5b1ae872c154c7e2f3dd42c3979"
|
||||
integrity sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==
|
||||
"@eslint/config-array@^0.21.0":
|
||||
version "0.21.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.0.tgz#abdbcbd16b124c638081766392a4d6b509f72636"
|
||||
integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==
|
||||
dependencies:
|
||||
"@eslint/object-schema" "^2.1.6"
|
||||
debug "^4.3.1"
|
||||
minimatch "^3.1.2"
|
||||
|
||||
"@eslint/config-helpers@^0.2.1":
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.3.tgz#39d6da64ed05d7662659aa7035b54cd55a9f3672"
|
||||
integrity sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==
|
||||
"@eslint/config-helpers@^0.3.0":
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.0.tgz#3e09a90dfb87e0005c7694791e58e97077271286"
|
||||
integrity sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==
|
||||
|
||||
"@eslint/core@^0.14.0":
|
||||
version "0.14.0"
|
||||
@@ -132,10 +132,10 @@
|
||||
minimatch "^3.1.2"
|
||||
strip-json-comments "^3.1.1"
|
||||
|
||||
"@eslint/js@9.29.0":
|
||||
version "9.29.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.29.0.tgz#dc6fd117c19825f8430867a662531da36320fe56"
|
||||
integrity sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==
|
||||
"@eslint/js@9.30.1":
|
||||
version "9.30.1"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.30.1.tgz#ebe9dd52a38345784c486300175a28c6013c088d"
|
||||
integrity sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==
|
||||
|
||||
"@eslint/object-schema@^2.1.6":
|
||||
version "2.1.6"
|
||||
@@ -367,9 +367,9 @@
|
||||
integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==
|
||||
|
||||
"@google/genai@^1.0.1":
|
||||
version "1.7.0"
|
||||
resolved "https://registry.yarnpkg.com/@google/genai/-/genai-1.7.0.tgz#4af2fe86343e990eebfb4adcd0fa744cb0e6907e"
|
||||
integrity sha512-s/OZLkrIfBwc+SFFaZoKdEogkw4in0YRTGc4Q483jnfchNBWzrNe560eZEfGJHQRPn6YfzJgECCx0sqEOMWvYw==
|
||||
version "1.8.0"
|
||||
resolved "https://registry.yarnpkg.com/@google/genai/-/genai-1.8.0.tgz#b99d776bfc83160431240b79b8eb57526cb8fbdc"
|
||||
integrity sha512-n3KiMFesQCy2R9iSdBIuJ0JWYQ1HZBJJkmt4PPZMGZKvlgHhBAGw1kUMyX+vsAIzprN3lK45DI755lm70wPOOg==
|
||||
dependencies:
|
||||
google-auth-library "^9.14.2"
|
||||
ws "^8.18.0"
|
||||
@@ -427,6 +427,18 @@
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba"
|
||||
integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
|
||||
|
||||
"@isaacs/balanced-match@^4.0.1":
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29"
|
||||
integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==
|
||||
|
||||
"@isaacs/brace-expansion@^5.0.0":
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3"
|
||||
integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==
|
||||
dependencies:
|
||||
"@isaacs/balanced-match" "^4.0.1"
|
||||
|
||||
"@isaacs/cliui@^8.0.2":
|
||||
version "8.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
|
||||
@@ -445,9 +457,9 @@
|
||||
integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
|
||||
|
||||
"@jridgewell/sourcemap-codec@^1.4.10":
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
|
||||
integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
|
||||
version "1.5.4"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7"
|
||||
integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==
|
||||
|
||||
"@jridgewell/trace-mapping@0.3.9":
|
||||
version "0.3.9"
|
||||
@@ -463,9 +475,9 @@
|
||||
integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==
|
||||
|
||||
"@langchain/community@^0.3.34":
|
||||
version "0.3.47"
|
||||
resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.47.tgz#224d7eae9ae1b1de934761888131cb7b8b30d322"
|
||||
integrity sha512-Vo42kAfkXpTFSevhEkeqqE55az8NyQgDktCbitXYuhipNbFYx08XVvqEDkFkB20MM/Z7u+cvLb+DxCqnKuH0CQ==
|
||||
version "0.3.48"
|
||||
resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.48.tgz#3487ada66da38ed47e2e1fa08d7299264a9be8bf"
|
||||
integrity sha512-0KceBKSx34lL5cnbKybWIMQAFTgkZJMOzcZ1YdcagIwgoDa5a4MsJdtTABxaY0gu+87Uo3KqMj+GXx2wQqnZWA==
|
||||
dependencies:
|
||||
"@langchain/openai" ">=0.2.0 <0.6.0"
|
||||
"@langchain/weaviate" "^0.2.0"
|
||||
@@ -504,9 +516,9 @@
|
||||
uuid "^10.0.0"
|
||||
|
||||
"@langchain/openai@>=0.1.0 <0.6.0", "@langchain/openai@>=0.2.0 <0.6.0":
|
||||
version "0.5.15"
|
||||
resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.5.15.tgz#d426684107cf8b3cac8dfff0344d6635d3699a55"
|
||||
integrity sha512-ANadEHyAj5sufQpz+SOPpKbyoMcTLhnh8/d+afbSPUqWsIMPpEFX3HoSY3nrBPG6l4NQQNG5P5oHb4SdC8+YIg==
|
||||
version "0.5.18"
|
||||
resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.5.18.tgz#59ebbf48044d711ce9503d3b9854a3533cb54683"
|
||||
integrity sha512-CX1kOTbT5xVFNdtLjnM0GIYNf+P7oMSu+dGCFxxWRa3dZwWiuyuBXCm+dToUGxDLnsHuV1bKBtIzrY1mLq/A1Q==
|
||||
dependencies:
|
||||
js-tiktoken "^1.0.12"
|
||||
openai "^5.3.0"
|
||||
@@ -520,9 +532,9 @@
|
||||
js-tiktoken "^1.0.12"
|
||||
|
||||
"@langchain/weaviate@^0.2.0":
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@langchain/weaviate/-/weaviate-0.2.0.tgz#cc21452a14cf1ed3c533a74dae366ecb417a5480"
|
||||
integrity sha512-gAtTCxSllR8Z92qAuRn2ir0cop241VmftQHQN+UYtTeoLge8hvZT5k0j55PDVaXTVpjx0ecx6DKv5I/wLRQI+A==
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@langchain/weaviate/-/weaviate-0.2.1.tgz#51ad20cf6d40e63d6149e5d01f91597cdff66744"
|
||||
integrity sha512-rlfAKF+GB0A5MUrol34oDrBkl4q6AefARk9KDW+LfzhV/74pZZLZyIPYPxvE4XwI3gvpwp024DNsDxK/4UW0/g==
|
||||
dependencies:
|
||||
uuid "^10.0.0"
|
||||
weaviate-client "^3.5.2"
|
||||
@@ -1171,9 +1183,11 @@
|
||||
integrity sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==
|
||||
|
||||
"@types/minimatch@*":
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
|
||||
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-6.0.0.tgz#4d207b1cc941367bdcd195a3a781a7e4fc3b1e03"
|
||||
integrity sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==
|
||||
dependencies:
|
||||
minimatch "*"
|
||||
|
||||
"@types/mocha@>=9.1.0":
|
||||
version "10.0.10"
|
||||
@@ -1189,9 +1203,9 @@
|
||||
form-data "^4.0.0"
|
||||
|
||||
"@types/node@*", "@types/node@>=13.7.0":
|
||||
version "24.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-24.0.4.tgz#dbae889912bda33a7f57669fb8587c1a56bc0c1f"
|
||||
integrity sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==
|
||||
version "24.0.10"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-24.0.10.tgz#f65a169779bf0d70203183a1890be7bee8ca2ddb"
|
||||
integrity sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==
|
||||
dependencies:
|
||||
undici-types "~7.8.0"
|
||||
|
||||
@@ -1203,9 +1217,9 @@
|
||||
undici-types "~6.19.2"
|
||||
|
||||
"@types/node@^18.11.18":
|
||||
version "18.19.112"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.112.tgz#cd2aee9c075402e0e1942a44101428881dbeb110"
|
||||
integrity sha512-i+Vukt9POdS/MBI7YrrkkI5fMfwFtOjphSmt4WXYLfwqsfr6z/HdCx7LqT9M7JktGob8WNgj8nFB4TbGNE4Cog==
|
||||
version "18.19.115"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.115.tgz#cd94caf14472021b4443c99bcd7aac6bb5c4f672"
|
||||
integrity sha512-kNrFiTgG4a9JAn1LMQeLOv3MvXIPokzXziohMrMsvpYgLpdEt/mMiVYc4sGKtDfyxM5gIDF4VgrPRyCw4fHOYg==
|
||||
dependencies:
|
||||
undici-types "~5.26.4"
|
||||
|
||||
@@ -1628,9 +1642,9 @@ bare-events@^2.2.0, bare-events@^2.5.4:
|
||||
integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==
|
||||
|
||||
bare-fs@^4.0.1:
|
||||
version "4.1.5"
|
||||
resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.1.5.tgz#1d06c076e68cc8bf97010d29af9e3ac3808cdcf7"
|
||||
integrity sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==
|
||||
version "4.1.6"
|
||||
resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.1.6.tgz#0925521e7310f65cb1f154cab264f0b647a7cdef"
|
||||
integrity sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==
|
||||
dependencies:
|
||||
bare-events "^2.5.4"
|
||||
bare-path "^3.0.0"
|
||||
@@ -2040,19 +2054,6 @@ cliui@^8.0.1:
|
||||
strip-ansi "^6.0.1"
|
||||
wrap-ansi "^7.0.0"
|
||||
|
||||
cloudflare@^4.4.1:
|
||||
version "4.4.1"
|
||||
resolved "https://registry.yarnpkg.com/cloudflare/-/cloudflare-4.4.1.tgz#a3a395b2eed46e6b2e5175a62cc962267cef3981"
|
||||
integrity sha512-wrtQ9WMflnfRcmdQZf/XfVVkeucgwzzYeqFDfgbNdADTaexsPwrtt3etzUvPGvVUeEk9kOPfNkl8MSzObxrIsg==
|
||||
dependencies:
|
||||
"@types/node" "^18.11.18"
|
||||
"@types/node-fetch" "^2.6.4"
|
||||
abort-controller "^3.0.0"
|
||||
agentkeepalive "^4.2.1"
|
||||
form-data-encoder "1.7.2"
|
||||
formdata-node "^4.3.2"
|
||||
node-fetch "^2.6.7"
|
||||
|
||||
color-convert@^1.9.0, color-convert@^1.9.3:
|
||||
version "1.9.3"
|
||||
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
|
||||
@@ -2507,9 +2508,9 @@ domutils@^3.0.1:
|
||||
domhandler "^5.0.3"
|
||||
|
||||
dotenv@^16.0.3:
|
||||
version "16.5.0"
|
||||
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.5.0.tgz#092b49f25f808f020050051d1ff258e404c78692"
|
||||
integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==
|
||||
version "16.6.1"
|
||||
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020"
|
||||
integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==
|
||||
|
||||
dunder-proto@^1.0.0, dunder-proto@^1.0.1:
|
||||
version "1.0.1"
|
||||
@@ -2772,17 +2773,17 @@ eslint-visitor-keys@^4.2.1:
|
||||
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
|
||||
|
||||
eslint@^9.21.0:
|
||||
version "9.29.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.29.0.tgz#65e3db3b7e5a5b04a8af541741a0f3648d0a81a6"
|
||||
integrity sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==
|
||||
version "9.30.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.30.1.tgz#d4107b39964412acd9b5c0744f1c6df514fa1211"
|
||||
integrity sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils" "^4.2.0"
|
||||
"@eslint-community/regexpp" "^4.12.1"
|
||||
"@eslint/config-array" "^0.20.1"
|
||||
"@eslint/config-helpers" "^0.2.1"
|
||||
"@eslint/config-array" "^0.21.0"
|
||||
"@eslint/config-helpers" "^0.3.0"
|
||||
"@eslint/core" "^0.14.0"
|
||||
"@eslint/eslintrc" "^3.3.1"
|
||||
"@eslint/js" "9.29.0"
|
||||
"@eslint/js" "9.30.1"
|
||||
"@eslint/plugin-kit" "^0.3.1"
|
||||
"@humanfs/node" "^0.16.6"
|
||||
"@humanwhocodes/module-importer" "^1.0.1"
|
||||
@@ -2959,9 +2960,9 @@ ethers@6.13.5:
|
||||
ws "8.17.1"
|
||||
|
||||
ethers@^6.14.0:
|
||||
version "6.14.4"
|
||||
resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.14.4.tgz#0f6fbc562a8425c7c888da307fa71ef796be0c04"
|
||||
integrity sha512-Jm/dzRs2Z9iBrT6e9TvGxyb5YVKAPLlpna7hjxH7KH/++DSh2T/JVmQUv7iHI5E55hDbp/gEVvstWYXVxXFzsA==
|
||||
version "6.15.0"
|
||||
resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.15.0.tgz#2980f2a3baf0509749b7e21f8692fa8a8349c0e3"
|
||||
integrity sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==
|
||||
dependencies:
|
||||
"@adraffy/ens-normalize" "1.10.1"
|
||||
"@noble/curves" "1.2.0"
|
||||
@@ -3529,9 +3530,9 @@ globals@^14.0.0:
|
||||
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
|
||||
|
||||
globals@^16.0.0:
|
||||
version "16.2.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-16.2.0.tgz#19efcd1ddde2bd5efce128e5c2e441df1abc6f7c"
|
||||
integrity sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==
|
||||
version "16.3.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-16.3.0.tgz#66118e765ddaf9e2d880f7e17658543f93f1f667"
|
||||
integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==
|
||||
|
||||
globalthis@^1.0.4:
|
||||
version "1.0.4"
|
||||
@@ -4439,9 +4440,9 @@ langsmith@^0.1.43:
|
||||
uuid "^10.0.0"
|
||||
|
||||
langsmith@^0.3.33:
|
||||
version "0.3.33"
|
||||
resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.33.tgz#f6c56b338cd6a9aa139dbbafcf4b037320eb3041"
|
||||
integrity sha512-imNIaBL6+ElE5eMzNHYwFxo6W/6rHlqcaUjCYoIeGdCYWlARxE3CTGKul5DJnaUgGP2CTLFeNXyvRx5HWC/4KQ==
|
||||
version "0.3.39"
|
||||
resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.39.tgz#668918ad6a19e9772c7bbc551c03867ea48f07d0"
|
||||
integrity sha512-dzrsERzrDh/jSuhOACcZaZf3zENSROk+1XGWFdBxeBa/aFuV7sQzG+wYH+Pdr+VOw2RUoFzl+PHzkuWZw1zuRQ==
|
||||
dependencies:
|
||||
"@types/uuid" "^10.0.0"
|
||||
chalk "^4.1.2"
|
||||
@@ -4484,10 +4485,10 @@ libbase64@1.3.0:
|
||||
resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-1.3.0.tgz#053314755a05d2e5f08bbfc48d0290e9322f4406"
|
||||
integrity sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg==
|
||||
|
||||
libmime@5.3.6:
|
||||
version "5.3.6"
|
||||
resolved "https://registry.yarnpkg.com/libmime/-/libmime-5.3.6.tgz#e6dfc655b6b4614bad90e8e65817957903b56580"
|
||||
integrity sha512-j9mBC7eiqi6fgBPAGvKCXJKJSIASanYF4EeA4iBzSG0HxQxmXnR3KbyWqTn4CwsKSebqCv2f5XZfAO6sKzgvwA==
|
||||
libmime@5.3.7:
|
||||
version "5.3.7"
|
||||
resolved "https://registry.yarnpkg.com/libmime/-/libmime-5.3.7.tgz#3835b6443d982d5cd1ac32ee241adbbc11b34406"
|
||||
integrity sha512-FlDb3Wtha8P01kTL3P9M+ZDNDWPKPmKHWaU/cG/lg5pfuAwdflVpZE+wm9m7pKmC5ww6s+zTxBKS1p6yl3KpSw==
|
||||
dependencies:
|
||||
encoding-japanese "2.2.0"
|
||||
iconv-lite "0.6.3"
|
||||
@@ -4591,28 +4592,28 @@ luxon@~3.6.0:
|
||||
integrity sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==
|
||||
|
||||
mailparser@^3.7.2:
|
||||
version "3.7.3"
|
||||
resolved "https://registry.yarnpkg.com/mailparser/-/mailparser-3.7.3.tgz#3c718cd73539c0165be25317e3ffbe704adc444a"
|
||||
integrity sha512-0RM14cZF0gO1y2Q/82hhWranispZOUSYHwvQ21h12x90NwD6+D5q59S5nOLqCtCdYitHN58LJXWEHa4RWm7BYA==
|
||||
version "3.7.4"
|
||||
resolved "https://registry.yarnpkg.com/mailparser/-/mailparser-3.7.4.tgz#dd70550b066fdc35563eda94bee5ab7a8d0c2439"
|
||||
integrity sha512-Beh4yyR4jLq3CZZ32asajByrXnW8dLyKCAQD3WvtTiBnMtFWhxO+wa93F6sJNjDmfjxXs4NRNjw3XAGLqZR3Vg==
|
||||
dependencies:
|
||||
encoding-japanese "2.2.0"
|
||||
he "1.2.0"
|
||||
html-to-text "9.0.5"
|
||||
iconv-lite "0.6.3"
|
||||
libmime "5.3.6"
|
||||
libmime "5.3.7"
|
||||
linkify-it "5.0.0"
|
||||
mailsplit "5.4.3"
|
||||
nodemailer "7.0.3"
|
||||
mailsplit "5.4.5"
|
||||
nodemailer "7.0.4"
|
||||
punycode.js "2.3.1"
|
||||
tlds "1.259.0"
|
||||
|
||||
mailsplit@5.4.3:
|
||||
version "5.4.3"
|
||||
resolved "https://registry.yarnpkg.com/mailsplit/-/mailsplit-5.4.3.tgz#470ebca836d87bd8fa6a72d36536238b85921765"
|
||||
integrity sha512-PFV0BBh4Tv7Omui5FtXXVtN4ExAxIi8Yvmb9JgBz+J6Hnnrv/YYXLlKKudLhXwd3/qWEATOslRsnzVCWDeCnmQ==
|
||||
mailsplit@5.4.5:
|
||||
version "5.4.5"
|
||||
resolved "https://registry.yarnpkg.com/mailsplit/-/mailsplit-5.4.5.tgz#dca1ea58419664fe01870ba8845773a048aa6384"
|
||||
integrity sha512-oMfhmvclR689IIaQmIcR5nODnZRRVwAKtqFT407TIvmhX2OLUBnshUTcxzQBt3+96sZVDud9NfSe1NxAkUNXEQ==
|
||||
dependencies:
|
||||
libbase64 "1.3.0"
|
||||
libmime "5.3.6"
|
||||
libmime "5.3.7"
|
||||
libqp "2.1.1"
|
||||
|
||||
make-error@^1.1.1:
|
||||
@@ -4706,6 +4707,13 @@ minimalistic-crypto-utils@^1.0.1:
|
||||
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
|
||||
integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
|
||||
|
||||
minimatch@*:
|
||||
version "10.0.3"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa"
|
||||
integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==
|
||||
dependencies:
|
||||
"@isaacs/brace-expansion" "^5.0.0"
|
||||
|
||||
"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
||||
@@ -4926,10 +4934,10 @@ node-telegram-bot-api@^0.66.0:
|
||||
mime "^1.6.0"
|
||||
pump "^2.0.0"
|
||||
|
||||
nodemailer@7.0.3:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-7.0.3.tgz#c098ce79ac60c7c111a86949eed2f99bd00cdac3"
|
||||
integrity sha512-Ajq6Sz1x7cIK3pN6KesGTah+1gnwMnx5gKl3piQlQQE/PwyJ4Mbc8is2psWYxK3RJTVeqsDaCv8ZzXLCDHMTZw==
|
||||
nodemailer@7.0.4:
|
||||
version "7.0.4"
|
||||
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-7.0.4.tgz#1204ca673026e93155d4a46eaa7c498a30fdd72a"
|
||||
integrity sha512-9O00Vh89/Ld2EcVCqJ/etd7u20UhME0f/NToPfArwPEe1Don1zy4mAIz6ariRr7mJ2RDxtaDzN0WJVdVXPtZaw==
|
||||
|
||||
nodemailer@^6.10.0:
|
||||
version "6.10.1"
|
||||
@@ -5056,9 +5064,9 @@ openai@^4.102.0:
|
||||
node-fetch "^2.6.7"
|
||||
|
||||
openai@^5.3.0:
|
||||
version "5.7.0"
|
||||
resolved "https://registry.yarnpkg.com/openai/-/openai-5.7.0.tgz#5f26b51c8348017f014db51795a983f495abac7c"
|
||||
integrity sha512-zXWawZl6J/P5Wz57/nKzVT3kJQZvogfuyuNVCdEp4/XU2UNrjL7SsuNpWAyLZbo6HVymwmnfno9toVzBhelygA==
|
||||
version "5.8.2"
|
||||
resolved "https://registry.yarnpkg.com/openai/-/openai-5.8.2.tgz#b12f968618deb87f6231b35a21b590d0b529d70b"
|
||||
integrity sha512-8C+nzoHYgyYOXhHGN6r0fcb4SznuEn1R7YZMvlqDbnCuE0FM2mm3T1HiYW6WIcMS/F1Of2up/cSPjLPaWt0X9Q==
|
||||
|
||||
openapi-types@^12.1.3:
|
||||
version "12.1.3"
|
||||
@@ -5271,10 +5279,10 @@ performance-now@^2.1.0:
|
||||
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
||||
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
|
||||
|
||||
pg-cloudflare@^1.2.6:
|
||||
version "1.2.6"
|
||||
resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.6.tgz#3f3afa99495492002d757df645b1be2b5aca099f"
|
||||
integrity sha512-uxmJAnmIgmYgnSFzgOf2cqGQBzwnRYcrEgXuFjJNEkpedEIPBSEzxY7ph4uA9k1mI+l/GR0HjPNS6FKNZe8SBQ==
|
||||
pg-cloudflare@^1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz#a1f3d226bab2c45ae75ea54d65ec05ac6cfafbef"
|
||||
integrity sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==
|
||||
|
||||
pg-connection-string@^2.9.1:
|
||||
version "2.9.1"
|
||||
@@ -5291,10 +5299,10 @@ pg-pool@^3.10.1:
|
||||
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.10.1.tgz#481047c720be2d624792100cac1816f8850d31b2"
|
||||
integrity sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==
|
||||
|
||||
pg-protocol@^1.10.2:
|
||||
version "1.10.2"
|
||||
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.2.tgz#76a07dd7f13ce67d7f9cf162dca181923b6641fa"
|
||||
integrity sha512-Ci7jy8PbaWxfsck2dwZdERcDG2A0MG8JoQILs+uZNjABFuBuItAZCWUNz8sXRDMoui24rJw7WlXqgpMdBSN/vQ==
|
||||
pg-protocol@^1.10.3:
|
||||
version "1.10.3"
|
||||
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.3.tgz#ac9e4778ad3f84d0c5670583bab976ea0a34f69f"
|
||||
integrity sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==
|
||||
|
||||
pg-types@2.2.0:
|
||||
version "2.2.0"
|
||||
@@ -5308,17 +5316,17 @@ pg-types@2.2.0:
|
||||
postgres-interval "^1.1.0"
|
||||
|
||||
pg@^8.10.0, pg@^8.12.0:
|
||||
version "8.16.2"
|
||||
resolved "https://registry.yarnpkg.com/pg/-/pg-8.16.2.tgz#1b3744531abe86ce80209ac560fb6f0e8e15f943"
|
||||
integrity sha512-OtLWF0mKLmpxelOt9BqVq83QV6bTfsS0XLegIeAKqKjurRnRKie1Dc1iL89MugmSLhftxw6NNCyZhm1yQFLMEQ==
|
||||
version "8.16.3"
|
||||
resolved "https://registry.yarnpkg.com/pg/-/pg-8.16.3.tgz#160741d0b44fdf64680e45374b06d632e86c99fd"
|
||||
integrity sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==
|
||||
dependencies:
|
||||
pg-connection-string "^2.9.1"
|
||||
pg-pool "^3.10.1"
|
||||
pg-protocol "^1.10.2"
|
||||
pg-protocol "^1.10.3"
|
||||
pg-types "2.2.0"
|
||||
pgpass "1.0.5"
|
||||
optionalDependencies:
|
||||
pg-cloudflare "^1.2.6"
|
||||
pg-cloudflare "^1.2.7"
|
||||
|
||||
pgpass@1.0.5:
|
||||
version "1.0.5"
|
||||
@@ -5390,9 +5398,9 @@ prettier@^2.3.1:
|
||||
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
|
||||
|
||||
prettier@^3.5.3:
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.1.tgz#cc3bce21c09a477b1e987b76ce9663925d86ae44"
|
||||
integrity sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A==
|
||||
version "3.6.2"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393"
|
||||
integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
|
||||
|
||||
process-nextick-args@~2.0.0:
|
||||
version "2.0.1"
|
||||
@@ -5943,12 +5951,13 @@ setprototypeof@1.2.0:
|
||||
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
|
||||
|
||||
sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8:
|
||||
version "2.4.11"
|
||||
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
|
||||
integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
|
||||
version "2.4.12"
|
||||
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f"
|
||||
integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==
|
||||
dependencies:
|
||||
inherits "^2.0.1"
|
||||
safe-buffer "^5.0.1"
|
||||
inherits "^2.0.4"
|
||||
safe-buffer "^5.2.1"
|
||||
to-buffer "^1.2.0"
|
||||
|
||||
sha1@^1.1.1:
|
||||
version "1.1.1"
|
||||
@@ -6388,9 +6397,9 @@ table@^6.8.0:
|
||||
strip-ansi "^6.0.1"
|
||||
|
||||
tar-fs@^3.0.0:
|
||||
version "3.0.10"
|
||||
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.10.tgz#60f8ccd60fe30164bdd3d6606619650236ed38f7"
|
||||
integrity sha512-C1SwlQGNLe/jPNqapK8epDsXME7CAJR5RL3GcE6KWx1d9OUByzoHVcbu1VPI8tevg9H8Alae0AApHHFGzrD5zA==
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.1.0.tgz#4675e2254d81410e609d91581a762608de999d25"
|
||||
integrity sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==
|
||||
dependencies:
|
||||
pump "^3.0.0"
|
||||
tar-stream "^3.1.5"
|
||||
@@ -6892,9 +6901,9 @@ verror@1.10.0:
|
||||
extsprintf "^1.2.0"
|
||||
|
||||
viem@^2.23.15, viem@^2.27.0:
|
||||
version "2.31.4"
|
||||
resolved "https://registry.yarnpkg.com/viem/-/viem-2.31.4.tgz#a8cce5579cc495a2586a16dd4062deecc0f53f1d"
|
||||
integrity sha512-0UZ/asvzl6p44CIBRDbwEcn3HXIQQurBZcMo5qmLhQ8s27Ockk+RYohgTLlpLvkYs8/t4UUEREAbHLuek1kXcw==
|
||||
version "2.31.7"
|
||||
resolved "https://registry.yarnpkg.com/viem/-/viem-2.31.7.tgz#1b8afa221a96a98edf9349760c6925f67c123dd6"
|
||||
integrity sha512-mpB8Hp6xK77E/b/yJmpAIQcxcOfpbrwWNItjnXaIA8lxZYt4JS433Pge2gg6Hp3PwyFtaUMh01j5L8EXnLTjQQ==
|
||||
dependencies:
|
||||
"@noble/curves" "1.9.2"
|
||||
"@noble/hashes" "1.8.0"
|
||||
@@ -7122,9 +7131,9 @@ write-file-atomic@3.0.3:
|
||||
typedarray-to-buffer "^3.1.5"
|
||||
|
||||
ws@8.17.1, ws@8.18.2, ws@^7.4.6, ws@^8.18.0, ws@^8.18.1:
|
||||
version "8.18.2"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.2.tgz#42738b2be57ced85f46154320aabb51ab003705a"
|
||||
integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==
|
||||
version "8.18.3"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472"
|
||||
integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==
|
||||
|
||||
xtend@^4.0.0, xtend@^4.0.2:
|
||||
version "4.0.2"
|
||||
@@ -7212,6 +7221,6 @@ zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.4:
|
||||
integrity sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==
|
||||
|
||||
zod@^3.22.4, zod@^3.25.32:
|
||||
version "3.25.67"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.67.tgz#62987e4078e2ab0f63b491ef0c4f33df24236da8"
|
||||
integrity sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==
|
||||
version "3.25.74"
|
||||
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.74.tgz#9368a3986fe756bd94b9a5baad9919660ff3f250"
|
||||
integrity sha512-J8poo92VuhKjNknViHRAIuuN6li/EwFbAC8OedzI8uxpEPGiXHGQu9wemIAioIpqgfB4SySaJhdk0mH5Y4ICBg==
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
const express = require('express');
|
||||
const { exec } = require('child_process');
|
||||
const app = express();
|
||||
app.use(express.json());
|
||||
|
||||
app.post('/cloudflared/restart', (req, res) => {
|
||||
exec('docker-compose up -d cloudflared', (err, stdout, stderr) => {
|
||||
if (err) {
|
||||
return res.status(500).json({ success: false, message: stderr || err.message });
|
||||
}
|
||||
res.json({ success: true, message: 'cloudflared перезапущен', output: stdout });
|
||||
});
|
||||
});
|
||||
|
||||
app.listen(9000, '0.0.0.0', () => {
|
||||
console.log('Cloudflared agent listening on 0.0.0.0:9000');
|
||||
});
|
||||
@@ -1,2 +0,0 @@
|
||||
TUNNEL_TOKEN=eyJhIjoiYTY3ODYxMDcyYTE0NGNkZDc0NmU5YzliZGQ4NDc2ZmUiLCJ0IjoiMjc2NGQyOTgtNjZiZC00NDVmLTg1NGQtOWJjYThjNDgxOGNjIiwicyI6IjlCMit6UVJEMmtLeEdWb1YxWGcxMFhSKzk0WUFPazRmalVxNXliNFkzb3R3cHFsL0U3RFM4RGdMdXNZenRIemt2a2dCb3ZRdEdkOFJMdXhFSkp1VUdRPT0ifQ==
|
||||
DOMAIN=hb3-accelerator.com
|
||||
@@ -81,7 +81,6 @@ services:
|
||||
volumes:
|
||||
- ./backend:/app
|
||||
- ./frontend/dist:/app/frontend_dist:ro
|
||||
- ./cloudflared.env:/cloudflared.env
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- NODE_ENV=${NODE_ENV:-development}
|
||||
@@ -142,11 +141,8 @@ services:
|
||||
curl -X POST http://ollama:11434/api/pull -d '{\"name\":\"${OLLAMA_MODEL:-qwen2.5:7b}\"}' -H 'Content-Type: application/json'
|
||||
echo 'Done!'
|
||||
"
|
||||
# cloudflared теперь запускается на хосте через start-dapp.sh
|
||||
# Это решает проблемы с Docker networking + v2rayN в WSL2
|
||||
# Чтобы запустить только Docker сервисы: docker compose up postgres backend frontend
|
||||
# Чтобы запустить весь стек: make up или ./start-dapp.sh
|
||||
# Туннельные сервисы удалены - переход на Pinata IPFS для Web3 хостинга
|
||||
|
||||
|
||||
volumes:
|
||||
postgres_data: null
|
||||
ollama_data: null
|
||||
|
||||
@@ -1,559 +0,0 @@
|
||||
<template>
|
||||
<div class="dns-manager">
|
||||
<h3>Управление DNS записями</h3>
|
||||
|
||||
<!-- Индикатор загрузки -->
|
||||
<div v-if="isLoading" class="loading-section">
|
||||
<div class="loading-spinner"></div>
|
||||
<span>Загрузка DNS записей...</span>
|
||||
</div>
|
||||
|
||||
<!-- Сообщения об ошибках -->
|
||||
<div v-if="errorMessage" class="error-message">
|
||||
{{ errorMessage }}
|
||||
</div>
|
||||
|
||||
<!-- Сообщения об успехе -->
|
||||
<div v-if="successMessage" class="success-message">
|
||||
{{ successMessage }}
|
||||
</div>
|
||||
|
||||
<!-- Таблица DNS записей -->
|
||||
<div v-if="!isLoading && records.length > 0" class="dns-records-table">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Тип</th>
|
||||
<th>Имя</th>
|
||||
<th>Содержимое</th>
|
||||
<th>TTL</th>
|
||||
<th>Прокси</th>
|
||||
<th>Действия</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="record in records" :key="record.id">
|
||||
<td>{{ record.type }}</td>
|
||||
<td>{{ record.name }}</td>
|
||||
<td class="content-cell">{{ record.content }}</td>
|
||||
<td>{{ record.ttl === 1 ? 'Auto' : record.ttl }}</td>
|
||||
<td>
|
||||
<span v-if="['A', 'AAAA', 'CNAME'].includes(record.type)"
|
||||
:class="['proxy-status', record.proxied ? 'proxied' : 'not-proxied']">
|
||||
{{ record.proxied ? 'Да' : 'Нет' }}
|
||||
</span>
|
||||
<span v-else>-</span>
|
||||
</td>
|
||||
<td class="actions-cell">
|
||||
<button class="btn-edit" @click="editRecord(record)">
|
||||
<i class="fas fa-edit"></i>
|
||||
</button>
|
||||
<button class="btn-delete" @click="deleteRecord(record.id)"
|
||||
:disabled="isDeletingRecord === record.id">
|
||||
<i class="fas fa-trash"></i>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Пустое состояние -->
|
||||
<div v-if="!isLoading && records.length === 0 && !errorMessage" class="empty-state">
|
||||
<p>DNS записи не найдены</p>
|
||||
</div>
|
||||
|
||||
<!-- Кнопка добавления новой записи -->
|
||||
<div class="add-record-section" v-if="!isLoading && !errorMessage">
|
||||
<button class="btn-primary" @click="showAddForm = true" v-if="!showAddForm">
|
||||
<i class="fas fa-plus"></i> Добавить DNS запись
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Форма создания/редактирования DNS записи -->
|
||||
<div v-if="showAddForm || editingRecord" class="dns-form">
|
||||
<h4>{{ editingRecord ? 'Редактирование DNS записи' : 'Добавление DNS записи' }}</h4>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label>Тип записи:</label>
|
||||
<select v-model="formData.type" class="form-control">
|
||||
<option value="A">A</option>
|
||||
<option value="AAAA">AAAA</option>
|
||||
<option value="CNAME">CNAME</option>
|
||||
<option value="MX">MX</option>
|
||||
<option value="TXT">TXT</option>
|
||||
<option value="SRV">SRV</option>
|
||||
<option value="NS">NS</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Имя:</label>
|
||||
<input v-model="formData.name" type="text" class="form-control"
|
||||
placeholder="example.com или @" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Содержимое:</label>
|
||||
<input v-model="formData.content" type="text" class="form-control"
|
||||
:placeholder="getContentPlaceholder(formData.type)" />
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label>TTL:</label>
|
||||
<select v-model="formData.ttl" class="form-control">
|
||||
<option value="1">Auto</option>
|
||||
<option value="300">5 минут</option>
|
||||
<option value="1800">30 минут</option>
|
||||
<option value="3600">1 час</option>
|
||||
<option value="14400">4 часа</option>
|
||||
<option value="86400">1 день</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group" v-if="['A', 'AAAA', 'CNAME'].includes(formData.type)">
|
||||
<label>
|
||||
<input type="checkbox" v-model="formData.proxied" />
|
||||
Проксировать через Cloudflare
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-actions">
|
||||
<button class="btn-primary" @click="saveRecord" :disabled="isSavingRecord">
|
||||
{{ isSavingRecord ? 'Сохранение...' : (editingRecord ? 'Обновить' : 'Создать') }}
|
||||
</button>
|
||||
<button class="btn-secondary" @click="cancelForm">Отмена</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted, watch } from 'vue';
|
||||
|
||||
const emit = defineEmits(['dns-updated']);
|
||||
|
||||
const records = ref([]);
|
||||
const isLoading = ref(false);
|
||||
const errorMessage = ref('');
|
||||
const successMessage = ref('');
|
||||
const showAddForm = ref(false);
|
||||
const editingRecord = ref(null);
|
||||
const isSavingRecord = ref(false);
|
||||
const isDeletingRecord = ref(null);
|
||||
|
||||
const formData = ref({
|
||||
type: 'A',
|
||||
name: '',
|
||||
content: '',
|
||||
ttl: 1,
|
||||
proxied: false
|
||||
});
|
||||
|
||||
// Загрузка DNS записей
|
||||
async function loadDnsRecords() {
|
||||
isLoading.value = true;
|
||||
errorMessage.value = '';
|
||||
try {
|
||||
const response = await fetch('/api/cloudflare/dns-records');
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
records.value = data.records || [];
|
||||
} else {
|
||||
errorMessage.value = data.message || 'Ошибка загрузки DNS записей';
|
||||
}
|
||||
} catch (e) {
|
||||
errorMessage.value = 'Ошибка соединения: ' + e.message;
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Получение placeholder для поля content в зависимости от типа записи
|
||||
function getContentPlaceholder(type) {
|
||||
const placeholders = {
|
||||
A: '192.168.1.1',
|
||||
AAAA: '2001:db8::1',
|
||||
CNAME: 'example.com',
|
||||
MX: '10 mail.example.com',
|
||||
TXT: 'v=spf1 include:_spf.google.com ~all',
|
||||
SRV: '10 5 443 target.example.com',
|
||||
NS: 'ns1.example.com'
|
||||
};
|
||||
return placeholders[type] || 'Введите значение';
|
||||
}
|
||||
|
||||
// Начало редактирования записи
|
||||
function editRecord(record) {
|
||||
editingRecord.value = record;
|
||||
formData.value = {
|
||||
type: record.type,
|
||||
name: record.name,
|
||||
content: record.content,
|
||||
ttl: record.ttl,
|
||||
proxied: record.proxied || false
|
||||
};
|
||||
showAddForm.value = false;
|
||||
}
|
||||
|
||||
// Сохранение записи (создание или обновление)
|
||||
async function saveRecord() {
|
||||
if (!formData.value.name || !formData.value.content) {
|
||||
errorMessage.value = 'Заполните все обязательные поля';
|
||||
return;
|
||||
}
|
||||
|
||||
isSavingRecord.value = true;
|
||||
errorMessage.value = '';
|
||||
successMessage.value = '';
|
||||
|
||||
try {
|
||||
const body = {
|
||||
type: formData.value.type,
|
||||
name: formData.value.name,
|
||||
content: formData.value.content,
|
||||
ttl: parseInt(formData.value.ttl),
|
||||
proxied: formData.value.proxied
|
||||
};
|
||||
|
||||
if (editingRecord.value) {
|
||||
body.recordId = editingRecord.value.id;
|
||||
}
|
||||
|
||||
const response = await fetch('/api/cloudflare/dns-records', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(body)
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
successMessage.value = data.message || 'DNS запись сохранена';
|
||||
cancelForm();
|
||||
await loadDnsRecords();
|
||||
emit('dns-updated');
|
||||
|
||||
// Очищаем сообщение об успехе через 3 секунды
|
||||
setTimeout(() => {
|
||||
successMessage.value = '';
|
||||
}, 3000);
|
||||
} else {
|
||||
errorMessage.value = data.message || 'Ошибка сохранения DNS записи';
|
||||
}
|
||||
} catch (e) {
|
||||
errorMessage.value = 'Ошибка соединения: ' + e.message;
|
||||
} finally {
|
||||
isSavingRecord.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Удаление записи
|
||||
async function deleteRecord(recordId) {
|
||||
if (!confirm('Вы уверены, что хотите удалить эту DNS запись?')) {
|
||||
return;
|
||||
}
|
||||
|
||||
isDeletingRecord.value = recordId;
|
||||
errorMessage.value = '';
|
||||
successMessage.value = '';
|
||||
|
||||
try {
|
||||
const response = await fetch(`/api/cloudflare/dns-records/${recordId}`, {
|
||||
method: 'DELETE'
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
successMessage.value = data.message || 'DNS запись удалена';
|
||||
await loadDnsRecords();
|
||||
emit('dns-updated');
|
||||
|
||||
// Очищаем сообщение об успехе через 3 секунды
|
||||
setTimeout(() => {
|
||||
successMessage.value = '';
|
||||
}, 3000);
|
||||
} else {
|
||||
errorMessage.value = data.message || 'Ошибка удаления DNS записи';
|
||||
}
|
||||
} catch (e) {
|
||||
errorMessage.value = 'Ошибка соединения: ' + e.message;
|
||||
} finally {
|
||||
isDeletingRecord.value = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Отмена формы
|
||||
function cancelForm() {
|
||||
showAddForm.value = false;
|
||||
editingRecord.value = null;
|
||||
formData.value = {
|
||||
type: 'A',
|
||||
name: '',
|
||||
content: '',
|
||||
ttl: 1,
|
||||
proxied: false
|
||||
};
|
||||
}
|
||||
|
||||
// Очистка сообщений при изменении формы
|
||||
watch([() => formData.value.type, () => formData.value.name, () => formData.value.content], () => {
|
||||
errorMessage.value = '';
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
loadDnsRecords();
|
||||
});
|
||||
|
||||
defineExpose({
|
||||
loadDnsRecords
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.dns-manager {
|
||||
margin-top: 2rem;
|
||||
padding: 1.5rem;
|
||||
border: 1px solid #e1e5e9;
|
||||
border-radius: 8px;
|
||||
background: #f8f9fa;
|
||||
}
|
||||
|
||||
.loading-section {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 1rem;
|
||||
background: #fff;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #e1e5e9;
|
||||
}
|
||||
|
||||
.loading-spinner {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border: 2px solid #f3f3f3;
|
||||
border-top: 2px solid var(--color-primary);
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% { transform: rotate(0deg); }
|
||||
100% { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
.error-message {
|
||||
padding: 0.75rem 1rem;
|
||||
background: #f8d7da;
|
||||
color: #721c24;
|
||||
border: 1px solid #f5c6cb;
|
||||
border-radius: 6px;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.success-message {
|
||||
padding: 0.75rem 1rem;
|
||||
background: #d4edda;
|
||||
color: #155724;
|
||||
border: 1px solid #c3e6cb;
|
||||
border-radius: 6px;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.dns-records-table {
|
||||
background: #fff;
|
||||
border-radius: 6px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.dns-records-table table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.dns-records-table th,
|
||||
.dns-records-table td {
|
||||
padding: 0.75rem;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid #e1e5e9;
|
||||
}
|
||||
|
||||
.dns-records-table th {
|
||||
background: #f8f9fa;
|
||||
font-weight: 600;
|
||||
color: #495057;
|
||||
}
|
||||
|
||||
.content-cell {
|
||||
max-width: 200px;
|
||||
word-break: break-all;
|
||||
font-family: monospace;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.proxy-status.proxied {
|
||||
color: #28a745;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.proxy-status.not-proxied {
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
.actions-cell {
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.btn-edit,
|
||||
.btn-delete {
|
||||
background: none;
|
||||
border: none;
|
||||
padding: 0.25rem 0.5rem;
|
||||
margin: 0 0.25rem;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.btn-edit {
|
||||
color: #007bff;
|
||||
}
|
||||
|
||||
.btn-edit:hover {
|
||||
background: #e3f2fd;
|
||||
}
|
||||
|
||||
.btn-delete {
|
||||
color: #dc3545;
|
||||
}
|
||||
|
||||
.btn-delete:hover {
|
||||
background: #fdeaea;
|
||||
}
|
||||
|
||||
.btn-delete:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 2rem;
|
||||
color: #6c757d;
|
||||
background: #fff;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.add-record-section {
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.dns-form {
|
||||
margin-top: 1.5rem;
|
||||
padding: 1.5rem;
|
||||
background: #fff;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #e1e5e9;
|
||||
}
|
||||
|
||||
.dns-form h4 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1.5rem;
|
||||
color: #495057;
|
||||
}
|
||||
|
||||
.form-row {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.form-group {
|
||||
flex: 1;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.form-group label {
|
||||
display: block;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
color: #495057;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
width: 100%;
|
||||
padding: 0.5rem 0.75rem;
|
||||
border: 1px solid #ced4da;
|
||||
border-radius: 4px;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.form-control:focus {
|
||||
outline: none;
|
||||
border-color: var(--color-primary);
|
||||
box-shadow: 0 0 0 2px rgba(0,123,255,0.25);
|
||||
}
|
||||
|
||||
.form-actions {
|
||||
display: flex;
|
||||
gap: 0.75rem;
|
||||
margin-top: 1.5rem;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: var(--color-primary);
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
padding: 0.5rem 1rem;
|
||||
cursor: pointer;
|
||||
font-size: 0.9rem;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background: var(--color-primary-dark);
|
||||
}
|
||||
|
||||
.btn-primary:disabled {
|
||||
opacity: 0.65;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
background: #6c757d;
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
padding: 0.5rem 1rem;
|
||||
cursor: pointer;
|
||||
font-size: 0.9rem;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.btn-secondary:hover {
|
||||
background: #5a6268;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.form-row {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.dns-records-table {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.content-cell {
|
||||
max-width: 120px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -5,7 +5,7 @@ const SettingsAiView = () => import('../views/settings/AiSettingsView.vue');
|
||||
const SettingsBlockchainView = () => import('../views/settings/BlockchainSettingsView.vue');
|
||||
const SettingsSecurityView = () => import('../views/settings/SecuritySettingsView.vue');
|
||||
const SettingsInterfaceView = () => import('../views/settings/Interface/InterfaceSettingsView.vue');
|
||||
const SettingsInterfaceCloudflareDetailsView = () => import('../views/settings/Interface/CloudflareDetailsView.vue');
|
||||
|
||||
import axios from 'axios';
|
||||
import { setToStorage } from '../utils/storage.js';
|
||||
|
||||
@@ -53,11 +53,7 @@ const routes = [
|
||||
name: 'settings-interface',
|
||||
component: SettingsInterfaceView,
|
||||
},
|
||||
{
|
||||
path: 'interface/cloudflare-details',
|
||||
name: 'settings-interface-cloudflare-details',
|
||||
component: SettingsInterfaceCloudflareDetailsView,
|
||||
},
|
||||
|
||||
{
|
||||
path: 'telegram',
|
||||
name: 'settings-telegram',
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
<template>
|
||||
<div class="domain-block">
|
||||
<h3>Подключение домена</h3>
|
||||
<p>Укажите свой домен, чтобы привязать его к опубликованному в IPFS фронтенду. Следуйте инструкции ниже для настройки DNS.</p>
|
||||
<div class="form-group">
|
||||
<input v-model="domain" class="form-control" placeholder="example.com" />
|
||||
<button class="btn-primary" :disabled="loading || !domain" @click="checkDomain">
|
||||
{{ loading ? 'Проверка...' : 'Проверить' }}
|
||||
</button>
|
||||
</div>
|
||||
<div v-if="error" class="error">Ошибка: {{ error }}</div>
|
||||
<div v-if="success" class="success">DNS-записи найдены: <pre>{{ records }}</pre></div>
|
||||
<div class="instruction">
|
||||
<b>Инструкция по подключению:</b>
|
||||
<ol>
|
||||
<li>Опубликуйте фронтенд в IPFS и получите CID.</li>
|
||||
<li>В панели управления доменом создайте DNS-запись типа <b>CNAME</b> или <b>TXT</b> (или используйте IPFS gateway).</li>
|
||||
<li>Для CNAME: укажите <code>yourdomain.com CNAME gateway.ipfs.io</code> или аналогичный шлюз.</li>
|
||||
<li>Для TXT: <code>_dnslink.yourdomain.com TXT dnslink=/ipfs/<ваш CID></code></li>
|
||||
<li>Дождитесь обновления DNS и проверьте домен через эту форму.</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue';
|
||||
import axios from '../../api/axios';
|
||||
|
||||
const domain = ref('');
|
||||
const loading = ref(false);
|
||||
const error = ref('');
|
||||
const success = ref(false);
|
||||
const records = ref('');
|
||||
|
||||
async function checkDomain() {
|
||||
loading.value = true;
|
||||
error.value = '';
|
||||
success.value = false;
|
||||
records.value = '';
|
||||
try {
|
||||
const { data } = await axios.post('/api/settings/interface/check-domain', { domain: domain.value });
|
||||
if (data.success && data.records) {
|
||||
records.value = JSON.stringify(data.records, null, 2);
|
||||
success.value = true;
|
||||
} else {
|
||||
error.value = data.error || 'DNS-записи не найдены';
|
||||
}
|
||||
} catch (e) {
|
||||
error.value = e.response?.data?.error || e.message || 'Ошибка запроса';
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.domain-block {
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
|
||||
padding: 2rem;
|
||||
margin-bottom: 2rem;
|
||||
max-width: 500px;
|
||||
}
|
||||
.form-group {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
.form-control {
|
||||
flex: 1;
|
||||
padding: 0.5rem 1rem;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #ccc;
|
||||
font-size: 1rem;
|
||||
}
|
||||
.btn-primary {
|
||||
background: var(--color-primary);
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
padding: 0.5rem 1.5rem;
|
||||
cursor: pointer;
|
||||
font-size: 1rem;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
.btn-primary:disabled {
|
||||
background: #ccc;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.success {
|
||||
margin-top: 1rem;
|
||||
color: var(--color-success, #2e7d32);
|
||||
}
|
||||
.error {
|
||||
margin-top: 1rem;
|
||||
color: var(--color-danger, #c62828);
|
||||
}
|
||||
.instruction {
|
||||
margin-top: 1.5rem;
|
||||
font-size: 0.95em;
|
||||
color: #555;
|
||||
background: #f8f8f8;
|
||||
border-radius: 8px;
|
||||
padding: 1rem;
|
||||
}
|
||||
pre {
|
||||
background: #f4f4f4;
|
||||
border-radius: 6px;
|
||||
padding: 0.5rem;
|
||||
font-size: 0.95em;
|
||||
margin: 0.5rem 0 0 0;
|
||||
}
|
||||
</style>
|
||||
@@ -1,346 +0,0 @@
|
||||
<template>
|
||||
<div class="cloudflare-details settings-panel">
|
||||
<button class="close-btn" @click="goBack">×</button>
|
||||
<h2>Настройка Cloudflare и подключение домена</h2>
|
||||
<ol class="instruction-block">
|
||||
<li>Зайдите в свой аккаунт <a href="https://dash.cloudflare.com/" target="_blank">Cloudflare</a> и добавьте ваш домен.</li>
|
||||
<li>Смените NS-записи у регистратора домена на те, что выдаст Cloudflare (см. <a href="https://developers.cloudflare.com/fundamentals/setup/add-site/ns/" target="_blank">инструкцию</a>).</li>
|
||||
<li>Дождитесь, когда домен будет обслуживаться Cloudflare (обычно 5-30 минут).</li>
|
||||
<li>Сгенерируйте <a href="https://dash.cloudflare.com/profile/api-tokens" target="_blank">API Token</a> с правами управления DNS и туннелями.</li>
|
||||
<li>Введите API Token и домен ниже для автоматической настройки туннеля и DNS.</li>
|
||||
<li><b>Один раз выполните в терминале WSL2:</b>
|
||||
<pre style="white-space:pre-line;font-size:0.95em;">curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
|
||||
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared noble main' | sudo tee /etc/apt/sources.list.d/cloudflared.list
|
||||
sudo apt update
|
||||
sudo apt install cloudflared</pre>
|
||||
</li>
|
||||
<li>Нажмите кнопку <b>Автоматически настроить и открыть приложение</b> и дождитесь появления ссылки.</li>
|
||||
</ol>
|
||||
<form class="form-block" @submit.prevent="saveToken">
|
||||
<label>Cloudflare API Token:</label>
|
||||
<input v-model="apiToken" type="text" class="form-control" placeholder="Введите API Token" />
|
||||
<button class="btn-primary" type="submit">Сохранить токен</button>
|
||||
</form>
|
||||
<div v-if="accounts.length" class="form-block">
|
||||
<label>Выберите аккаунт Cloudflare:</label>
|
||||
<select v-model="selectedAccountId" class="form-control">
|
||||
<option v-for="acc in accounts" :key="acc.id" :value="acc.id">
|
||||
{{ acc.name }} ({{ acc.id }})
|
||||
</option>
|
||||
</select>
|
||||
<button class="btn-primary" @click="saveAccountId">Сохранить аккаунт</button>
|
||||
<div v-if="accountStatusMsg" class="status-block">{{ accountStatusMsg }}</div>
|
||||
</div>
|
||||
<form class="form-block" @submit.prevent="connectDomain">
|
||||
<label>Домен для туннеля:</label>
|
||||
<input v-model="domain" type="text" class="form-control" placeholder="example.com" />
|
||||
<button class="btn-primary" type="submit">Проверить и подключить домен</button>
|
||||
</form>
|
||||
<div class="status-block">
|
||||
<b>Статус Cloudflared:</b> {{ tunnelStatus }}<br>
|
||||
<b>Статус домена:</b> {{ domainStatusMsg }}<br>
|
||||
<b>Статус туннеля:</b> {{ tunnelStatusMsg }}<br>
|
||||
<span v-if="statusMsg">{{ statusMsg }}</span>
|
||||
</div>
|
||||
<div v-if="appUrl" class="app-link-block">
|
||||
<a :href="appUrl" target="_blank" class="btn-primary open-app-btn">
|
||||
Открыть приложение
|
||||
</a>
|
||||
</div>
|
||||
<div v-if="autoSetupSteps.length" class="auto-setup-steps">
|
||||
<div v-for="step in autoSetupSteps" :key="step.step" :class="['auto-setup-step', step.status]">
|
||||
{{ step.message }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Кнопка управления DNS записями -->
|
||||
<div v-if="appUrl || (accounts.length && selectedAccountId && domain)" class="dns-management-section">
|
||||
<button class="btn-primary" @click="showDnsManager = !showDnsManager">
|
||||
<i class="fas fa-cog"></i> {{ showDnsManager ? 'Скрыть' : 'Управлять' }} DNS записями
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Компонент управления DNS записями -->
|
||||
<CloudflareDnsManager
|
||||
v-if="showDnsManager"
|
||||
@dns-updated="onDnsUpdated"
|
||||
ref="dnsManager"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import CloudflareDnsManager from '@/components/CloudflareDnsManager.vue';
|
||||
|
||||
const router = useRouter();
|
||||
const goBack = () => router.push('/settings/interface');
|
||||
|
||||
const apiToken = ref('');
|
||||
const domain = ref('');
|
||||
const statusMsg = ref('');
|
||||
const tunnelStatus = ref('');
|
||||
const domainStatusMsg = ref('');
|
||||
const tunnelStatusMsg = ref('');
|
||||
const appUrl = ref('');
|
||||
const autoSetupSteps = ref([]);
|
||||
const accounts = ref([]);
|
||||
const selectedAccountId = ref('');
|
||||
const accountStatusMsg = ref('');
|
||||
const showDnsManager = ref(false);
|
||||
const dnsManager = ref(null);
|
||||
|
||||
async function loadSettings() {
|
||||
try {
|
||||
console.log('[CloudflareDetails] loadSettings: start');
|
||||
const res = await fetch('/api/cloudflare/settings');
|
||||
const data = await res.json();
|
||||
console.log('[CloudflareDetails] loadSettings: data', data);
|
||||
if (data.success && data.settings) {
|
||||
apiToken.value = data.settings.api_token || '';
|
||||
domain.value = data.settings.domain || '';
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('[CloudflareDetails] loadSettings: error', e);
|
||||
}
|
||||
}
|
||||
|
||||
async function saveToken() {
|
||||
try {
|
||||
console.log('[CloudflareDetails] saveToken: start', apiToken.value);
|
||||
const res = await fetch('/api/cloudflare/token', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ token: apiToken.value })
|
||||
});
|
||||
const data = await res.json();
|
||||
console.log('[CloudflareDetails] saveToken: data', data);
|
||||
statusMsg.value = data.message || 'Токен сохранён!';
|
||||
// Получить список аккаунтов
|
||||
const accRes = await fetch('/api/cloudflare/accounts', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ api_token: apiToken.value })
|
||||
});
|
||||
const accData = await accRes.json();
|
||||
if (accData.success && accData.accounts) {
|
||||
accounts.value = accData.accounts;
|
||||
accountStatusMsg.value = 'Выберите аккаунт и сохраните.';
|
||||
} else {
|
||||
accountStatusMsg.value = accData.message || 'Ошибка получения аккаунтов';
|
||||
}
|
||||
getStatus();
|
||||
} catch (e) {
|
||||
console.error('[CloudflareDetails] saveToken: error', e);
|
||||
statusMsg.value = 'Ошибка при сохранении токена';
|
||||
accountStatusMsg.value = 'Ошибка получения аккаунтов';
|
||||
}
|
||||
}
|
||||
|
||||
async function saveAccountId() {
|
||||
try {
|
||||
const res = await fetch('/api/cloudflare/account-id', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ account_id: selectedAccountId.value })
|
||||
});
|
||||
const data = await res.json();
|
||||
accountStatusMsg.value = data.message || 'Account ID сохранён!';
|
||||
getStatus();
|
||||
} catch (e) {
|
||||
accountStatusMsg.value = 'Ошибка при сохранении Account ID';
|
||||
}
|
||||
}
|
||||
|
||||
async function connectDomain() {
|
||||
try {
|
||||
statusMsg.value = 'Выполняется автоматическая настройка...';
|
||||
appUrl.value = '';
|
||||
autoSetupSteps.value = [];
|
||||
const res = await fetch('/api/cloudflare/domain', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ domain: domain.value })
|
||||
});
|
||||
const data = await res.json();
|
||||
if (data.success) {
|
||||
statusMsg.value = data.message || 'Готово!';
|
||||
appUrl.value = data.app_url || '';
|
||||
autoSetupSteps.value = data.steps || [];
|
||||
|
||||
// Автоматически показываем DNS менеджер после успешного создания туннеля
|
||||
showDnsManager.value = true;
|
||||
|
||||
// Обновляем DNS записи в менеджере, если он уже загружен
|
||||
setTimeout(() => {
|
||||
if (dnsManager.value && dnsManager.value.loadDnsRecords) {
|
||||
dnsManager.value.loadDnsRecords();
|
||||
}
|
||||
}, 1000);
|
||||
} else {
|
||||
statusMsg.value = data.error || 'Ошибка автоматической настройки';
|
||||
autoSetupSteps.value = data.steps || [];
|
||||
}
|
||||
getStatus();
|
||||
} catch (e) {
|
||||
statusMsg.value = 'Ошибка автоматической настройки: ' + e.message;
|
||||
}
|
||||
}
|
||||
|
||||
async function getStatus() {
|
||||
try {
|
||||
console.log('[CloudflareDetails] getStatus: start');
|
||||
const res = await fetch('/api/cloudflare/status');
|
||||
const data = await res.json();
|
||||
console.log('[CloudflareDetails] getStatus: data', data);
|
||||
tunnelStatus.value = data.status || '';
|
||||
domainStatusMsg.value = data.domainMsg || '';
|
||||
tunnelStatusMsg.value = data.tunnelMsg || '';
|
||||
} catch (e) {
|
||||
console.error('[CloudflareDetails] getStatus: error', e);
|
||||
tunnelStatus.value = 'Ошибка';
|
||||
domainStatusMsg.value = 'Ошибка';
|
||||
tunnelStatusMsg.value = 'Ошибка';
|
||||
}
|
||||
}
|
||||
|
||||
function onDnsUpdated() {
|
||||
console.log('[CloudflareDetails] DNS records updated');
|
||||
// Обновляем статус после изменения DNS
|
||||
getStatus();
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
loadSettings();
|
||||
getStatus();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.cloudflare-details.settings-panel {
|
||||
padding: var(--block-padding);
|
||||
background-color: var(--color-light);
|
||||
border-radius: var(--radius-md);
|
||||
margin-top: var(--spacing-lg);
|
||||
animation: fadeIn var(--transition-normal);
|
||||
min-height: 200px;
|
||||
position: relative;
|
||||
}
|
||||
h2 {
|
||||
margin-bottom: var(--spacing-lg);
|
||||
border-bottom: 1px solid var(--color-grey-light);
|
||||
padding-bottom: var(--spacing-md);
|
||||
}
|
||||
.instruction-block {
|
||||
background: #f8f8f8;
|
||||
border-radius: 8px;
|
||||
padding: 1rem 1.5rem;
|
||||
margin-bottom: 2rem;
|
||||
font-size: 1rem;
|
||||
}
|
||||
.form-block {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
margin-bottom: 1.5rem;
|
||||
max-width: 400px;
|
||||
}
|
||||
.form-control {
|
||||
padding: 0.5rem 1rem;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #ccc;
|
||||
font-size: 1rem;
|
||||
}
|
||||
.btn-primary {
|
||||
background: var(--color-primary);
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
padding: 0.5rem 1.5rem;
|
||||
cursor: pointer;
|
||||
font-size: 1rem;
|
||||
transition: background 0.2s;
|
||||
margin-top: 0.5rem;
|
||||
align-self: flex-start;
|
||||
}
|
||||
.btn-primary:hover {
|
||||
background: var(--color-primary-dark);
|
||||
}
|
||||
.btn-primary.install-btn {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
.status-block {
|
||||
margin: 1.5rem 0 0.5rem 0;
|
||||
font-size: 1.05rem;
|
||||
color: #555;
|
||||
}
|
||||
.close-btn {
|
||||
position: absolute;
|
||||
top: 18px;
|
||||
right: 18px;
|
||||
background: none;
|
||||
border: none;
|
||||
font-size: 2rem;
|
||||
cursor: pointer;
|
||||
color: #bbb;
|
||||
transition: color 0.2s;
|
||||
z-index: 10;
|
||||
}
|
||||
.close-btn:hover {
|
||||
color: #333;
|
||||
}
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; }
|
||||
to { opacity: 1; }
|
||||
}
|
||||
.app-link-block {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
.open-app-btn {
|
||||
display: inline-block;
|
||||
padding: 0.7rem 2rem;
|
||||
font-size: 1.1rem;
|
||||
background: var(--color-success, #2cae4f);
|
||||
color: #fff;
|
||||
border-radius: 8px;
|
||||
text-decoration: none;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
.open-app-btn:hover {
|
||||
background: var(--color-success-dark, #1e7d32);
|
||||
}
|
||||
.auto-setup-btn {
|
||||
margin-top: 1.5rem;
|
||||
background: var(--color-primary);
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
padding: 0.5rem 1.5rem;
|
||||
cursor: pointer;
|
||||
font-size: 1rem;
|
||||
transition: background 0.2s;
|
||||
display: block;
|
||||
}
|
||||
.auto-setup-steps {
|
||||
margin-top: 1.5rem;
|
||||
}
|
||||
.auto-setup-step {
|
||||
margin-bottom: 0.5rem;
|
||||
padding: 0.5rem 1rem;
|
||||
border-radius: 6px;
|
||||
background: #f8f8f8;
|
||||
font-size: 1rem;
|
||||
}
|
||||
.auto-setup-step.ok {
|
||||
color: #2cae4f;
|
||||
}
|
||||
.auto-setup-step.error {
|
||||
color: #c62828;
|
||||
}
|
||||
.dns-management-section {
|
||||
margin-top: 2rem;
|
||||
padding-top: 1.5rem;
|
||||
border-top: 1px solid var(--color-grey-light);
|
||||
}
|
||||
</style>
|
||||
@@ -1,51 +1,11 @@
|
||||
<template>
|
||||
<div class="interface-settings settings-panel" style="position:relative;min-height:120px">
|
||||
<button class="close-btn" @click="goBack">×</button>
|
||||
<h2>Традиционный хостинг</h2>
|
||||
|
||||
<!-- Cloudflare -->
|
||||
<div class="web3-service-block">
|
||||
<div class="service-header">
|
||||
<h3>Cloudflare</h3>
|
||||
<span class="service-badge cloudflare">Туннели и CDN</span>
|
||||
</div>
|
||||
<p>Подключите ваш локальный DApp к интернету через Cloudflare Tunnels. Быстрый доступ и защита от DDoS атак.</p>
|
||||
<div class="service-features">
|
||||
<span class="feature">✓ Cloudflare Tunnels</span>
|
||||
<span class="feature">✓ Защита от DDoS</span>
|
||||
<span class="feature">✓ Глобальная CDN</span>
|
||||
</div>
|
||||
<button
|
||||
class="btn-primary"
|
||||
@click="isAdmin ? goToCloudflareDetails() : null"
|
||||
:disabled="!isAdmin"
|
||||
>
|
||||
Подробнее
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h2>Web3 Хостинг</h2>
|
||||
|
||||
<!-- Pinata IPFS -->
|
||||
<div class="web3-service-block">
|
||||
<div class="service-header">
|
||||
<h3>Pinata IPFS</h3>
|
||||
<span class="service-badge">Децентрализованное хранение</span>
|
||||
</div>
|
||||
<p>Разместите ваш DApp на IPFS с помощью Pinata. Поддержка пользовательских доменов, CDN и автоматические деплои.</p>
|
||||
<div class="service-features">
|
||||
<span class="feature">✓ IPFS хостинг</span>
|
||||
<span class="feature">✓ CDN глобально</span>
|
||||
<span class="feature">✓ Домен</span>
|
||||
</div>
|
||||
<button
|
||||
class="btn-primary"
|
||||
@click="isAdmin ? goToPinataDetails() : null"
|
||||
:disabled="!isAdmin"
|
||||
>
|
||||
Подробнее
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Akash Network -->
|
||||
<div class="web3-service-block">
|
||||
@@ -97,13 +57,8 @@ import { useAuthContext } from '@/composables/useAuth';
|
||||
const router = useRouter();
|
||||
const { isAdmin } = useAuthContext();
|
||||
const goBack = () => router.push('/settings');
|
||||
const goToCloudflareDetails = () => router.push('/settings/interface/cloudflare-details');
|
||||
|
||||
// Web3 сервисы
|
||||
const goToPinataDetails = () => {
|
||||
// Пока открываем в новой вкладке, позже можно создать отдельные страницы
|
||||
window.open('https://pinata.cloud/pricing', '_blank');
|
||||
};
|
||||
|
||||
|
||||
const goToAkashDetails = () => {
|
||||
window.open('https://akash.network/', '_blank');
|
||||
@@ -174,10 +129,6 @@ h2:first-of-type {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.service-badge.cloudflare {
|
||||
background: linear-gradient(135deg, #f38020, #f5af19);
|
||||
}
|
||||
|
||||
.service-badge.akash {
|
||||
background: linear-gradient(135deg, #ff6b6b, #ee5a52);
|
||||
}
|
||||
|
||||
@@ -27,16 +27,16 @@
|
||||
integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==
|
||||
|
||||
"@babel/parser@^7.27.5":
|
||||
version "7.27.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.5.tgz#ed22f871f110aa285a6fd934a0efed621d118826"
|
||||
integrity sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==
|
||||
version "7.28.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e"
|
||||
integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==
|
||||
dependencies:
|
||||
"@babel/types" "^7.27.3"
|
||||
"@babel/types" "^7.28.0"
|
||||
|
||||
"@babel/types@^7.27.3":
|
||||
version "7.27.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.6.tgz#a434ca7add514d4e646c80f7375c0aa2befc5535"
|
||||
integrity sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==
|
||||
"@babel/types@^7.28.0":
|
||||
version "7.28.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.0.tgz#2fd0159a6dc7353933920c43136335a9b264d950"
|
||||
integrity sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==
|
||||
dependencies:
|
||||
"@babel/helper-string-parser" "^7.27.1"
|
||||
"@babel/helper-validator-identifier" "^7.27.1"
|
||||
@@ -193,19 +193,19 @@
|
||||
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
|
||||
integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
|
||||
|
||||
"@eslint/config-array@^0.20.1":
|
||||
version "0.20.1"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.1.tgz#454f89be82b0e5b1ae872c154c7e2f3dd42c3979"
|
||||
integrity sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==
|
||||
"@eslint/config-array@^0.21.0":
|
||||
version "0.21.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.0.tgz#abdbcbd16b124c638081766392a4d6b509f72636"
|
||||
integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==
|
||||
dependencies:
|
||||
"@eslint/object-schema" "^2.1.6"
|
||||
debug "^4.3.1"
|
||||
minimatch "^3.1.2"
|
||||
|
||||
"@eslint/config-helpers@^0.2.1":
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.3.tgz#39d6da64ed05d7662659aa7035b54cd55a9f3672"
|
||||
integrity sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==
|
||||
"@eslint/config-helpers@^0.3.0":
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.0.tgz#3e09a90dfb87e0005c7694791e58e97077271286"
|
||||
integrity sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==
|
||||
|
||||
"@eslint/core@^0.14.0":
|
||||
version "0.14.0"
|
||||
@@ -214,10 +214,10 @@
|
||||
dependencies:
|
||||
"@types/json-schema" "^7.0.15"
|
||||
|
||||
"@eslint/core@^0.15.0":
|
||||
version "0.15.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.0.tgz#8fc04709a7b9a179d9f7d93068fc000cb8c5603d"
|
||||
integrity sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==
|
||||
"@eslint/core@^0.15.1":
|
||||
version "0.15.1"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.1.tgz#d530d44209cbfe2f82ef86d6ba08760196dd3b60"
|
||||
integrity sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==
|
||||
dependencies:
|
||||
"@types/json-schema" "^7.0.15"
|
||||
|
||||
@@ -236,10 +236,10 @@
|
||||
minimatch "^3.1.2"
|
||||
strip-json-comments "^3.1.1"
|
||||
|
||||
"@eslint/js@9.29.0":
|
||||
version "9.29.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.29.0.tgz#dc6fd117c19825f8430867a662531da36320fe56"
|
||||
integrity sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==
|
||||
"@eslint/js@9.30.1":
|
||||
version "9.30.1"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.30.1.tgz#ebe9dd52a38345784c486300175a28c6013c088d"
|
||||
integrity sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==
|
||||
|
||||
"@eslint/object-schema@^2.1.6":
|
||||
version "2.1.6"
|
||||
@@ -247,32 +247,32 @@
|
||||
integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==
|
||||
|
||||
"@eslint/plugin-kit@^0.3.1":
|
||||
version "0.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz#0cad96b134d23a653348e3342f485636b5ef4732"
|
||||
integrity sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==
|
||||
version "0.3.3"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz#32926b59bd407d58d817941e48b2a7049359b1fd"
|
||||
integrity sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==
|
||||
dependencies:
|
||||
"@eslint/core" "^0.15.0"
|
||||
"@eslint/core" "^0.15.1"
|
||||
levn "^0.4.1"
|
||||
|
||||
"@floating-ui/core@^1.7.1":
|
||||
version "1.7.1"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.1.tgz#1abc6b157d4a936174f9dbd078278c3a81c8bc6b"
|
||||
integrity sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==
|
||||
"@floating-ui/core@^1.7.2":
|
||||
version "1.7.2"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.2.tgz#3d1c35263950b314b6d5a72c8bfb9e3c1551aefd"
|
||||
integrity sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==
|
||||
dependencies:
|
||||
"@floating-ui/utils" "^0.2.9"
|
||||
"@floating-ui/utils" "^0.2.10"
|
||||
|
||||
"@floating-ui/dom@^1.0.1":
|
||||
version "1.7.1"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.1.tgz#76a4e3cbf7a08edf40c34711cf64e0cc8053d912"
|
||||
integrity sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==
|
||||
version "1.7.2"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.2.tgz#3540b051cf5ce0d4f4db5fb2507a76e8ea5b4a45"
|
||||
integrity sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==
|
||||
dependencies:
|
||||
"@floating-ui/core" "^1.7.1"
|
||||
"@floating-ui/utils" "^0.2.9"
|
||||
"@floating-ui/core" "^1.7.2"
|
||||
"@floating-ui/utils" "^0.2.10"
|
||||
|
||||
"@floating-ui/utils@^0.2.9":
|
||||
version "0.2.9"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429"
|
||||
integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==
|
||||
"@floating-ui/utils@^0.2.10":
|
||||
version "0.2.10"
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.10.tgz#a2a1e3812d14525f725d011a73eceb41fef5bc1c"
|
||||
integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==
|
||||
|
||||
"@humanfs/core@^0.19.1":
|
||||
version "0.19.1"
|
||||
@@ -302,31 +302,31 @@
|
||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba"
|
||||
integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
|
||||
|
||||
"@intlify/core-base@11.1.7":
|
||||
version "11.1.7"
|
||||
resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-11.1.7.tgz#497280e4774011cf0d42eaedb20e9cd4594c0a3f"
|
||||
integrity sha512-gYiGnQeJVp3kNBeXQ73m1uFOak0ry4av8pn+IkEWigyyPWEMGzB+xFeQdmGMFn49V+oox6294oGVff8bYOhtOw==
|
||||
"@intlify/core-base@11.1.9":
|
||||
version "11.1.9"
|
||||
resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-11.1.9.tgz#54201e7985d52240627b9c327a4d57c08a96cd39"
|
||||
integrity sha512-Lrdi4wp3XnGhWmB/mMD/XtfGUw1Jt+PGpZI/M63X1ZqhTDjNHRVCs/i8vv8U1cwaj1A9fb0bkCQHLSL0SK+pIQ==
|
||||
dependencies:
|
||||
"@intlify/message-compiler" "11.1.7"
|
||||
"@intlify/shared" "11.1.7"
|
||||
"@intlify/message-compiler" "11.1.9"
|
||||
"@intlify/shared" "11.1.9"
|
||||
|
||||
"@intlify/message-compiler@11.1.7":
|
||||
version "11.1.7"
|
||||
resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-11.1.7.tgz#047ba659cfd34b0f630dddf73c3f9224bd3af7f8"
|
||||
integrity sha512-0ezkep1AT30NyuKj8QbRlmvMORCCRlOIIu9v8RNU8SwDjjTiFCZzczCORMns2mCH4HZ1nXgrfkKzYUbfjNRmng==
|
||||
"@intlify/message-compiler@11.1.9":
|
||||
version "11.1.9"
|
||||
resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-11.1.9.tgz#c84a3a2777b0d95342348d1bf95669329d71e10c"
|
||||
integrity sha512-84SNs3Ikjg0rD1bOuchzb3iK1vR2/8nxrkyccIl5DjFTeMzE/Fxv6X+A7RN5ZXjEWelc1p5D4kHA6HEOhlKL5Q==
|
||||
dependencies:
|
||||
"@intlify/shared" "11.1.7"
|
||||
"@intlify/shared" "11.1.9"
|
||||
source-map-js "^1.0.2"
|
||||
|
||||
"@intlify/shared@11.1.7":
|
||||
version "11.1.7"
|
||||
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-11.1.7.tgz#54e60d52b73fb25019e2689d6531a54928b40194"
|
||||
integrity sha512-4yZeMt2Aa/7n5Ehy4KalUlvt3iRLcg1tq9IBVfOgkyWFArN4oygn6WxgGIFibP3svpaH8DarbNaottq+p0gUZQ==
|
||||
"@intlify/shared@11.1.9":
|
||||
version "11.1.9"
|
||||
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-11.1.9.tgz#20244e53322ba01233df7ddb6dc677561b3c7e0b"
|
||||
integrity sha512-H/83xgU1l8ox+qG305p6ucmoy93qyjIPnvxGWRA7YdOoHe1tIiW9IlEu4lTdsOR7cfP1ecrwyflQSqXdXBacXA==
|
||||
|
||||
"@jridgewell/sourcemap-codec@^1.5.0":
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
|
||||
integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
|
||||
version "1.5.4"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7"
|
||||
integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==
|
||||
|
||||
"@noble/curves@1.2.0":
|
||||
version "1.2.0"
|
||||
@@ -394,105 +394,105 @@
|
||||
estree-walker "^2.0.2"
|
||||
picomatch "^4.0.2"
|
||||
|
||||
"@rollup/rollup-android-arm-eabi@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz#a3e4e4b2baf0bade6918cf5135c3ef7eee653196"
|
||||
integrity sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==
|
||||
"@rollup/rollup-android-arm-eabi@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.2.tgz#6819b7f1e41a49af566f629a1556eaeea774d043"
|
||||
integrity sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==
|
||||
|
||||
"@rollup/rollup-android-arm64@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz#63566b0e76c62d4f96d44448f38a290562280200"
|
||||
integrity sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==
|
||||
"@rollup/rollup-android-arm64@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.2.tgz#7bd5591af68c64a75be1779e2b20f187878daba9"
|
||||
integrity sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==
|
||||
|
||||
"@rollup/rollup-darwin-arm64@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz#60a51a61b22b1f4fdf97b4adf5f0f447f492759d"
|
||||
integrity sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==
|
||||
"@rollup/rollup-darwin-arm64@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.2.tgz#e216c333e448c67973386e46dbfe8e381aafb055"
|
||||
integrity sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==
|
||||
|
||||
"@rollup/rollup-darwin-x64@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz#bfe3059440f7032de11e749ece868cd7f232e609"
|
||||
integrity sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==
|
||||
"@rollup/rollup-darwin-x64@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.2.tgz#202f80eea3acfe3f67496fedffa006a5f1ce7f5a"
|
||||
integrity sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==
|
||||
|
||||
"@rollup/rollup-freebsd-arm64@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz#d5d4c6cd3b8acb7493b76227d8b2b4a2d732a37b"
|
||||
integrity sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==
|
||||
"@rollup/rollup-freebsd-arm64@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.2.tgz#4880f9769f1a7eec436b9c146e1d714338c26567"
|
||||
integrity sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==
|
||||
|
||||
"@rollup/rollup-freebsd-x64@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz#cb4e1547b572cd0144c5fbd6c4a0edfed5fe6024"
|
||||
integrity sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==
|
||||
"@rollup/rollup-freebsd-x64@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.2.tgz#647d6e333349b1c0fb322c2827ba1a53a0f10301"
|
||||
integrity sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==
|
||||
|
||||
"@rollup/rollup-linux-arm-gnueabihf@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz#feb81bd086f6a469777f75bec07e1bdf93352e69"
|
||||
integrity sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==
|
||||
"@rollup/rollup-linux-arm-gnueabihf@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.2.tgz#7ba5c97a7224f49618861d093c4a7b40fa50867b"
|
||||
integrity sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==
|
||||
|
||||
"@rollup/rollup-linux-arm-musleabihf@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz#68bff1c6620c155c9d8f5ee6a83c46eb50486f18"
|
||||
integrity sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==
|
||||
"@rollup/rollup-linux-arm-musleabihf@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.2.tgz#f858dcf498299d6c625ec697a5191e0e41423905"
|
||||
integrity sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==
|
||||
|
||||
"@rollup/rollup-linux-arm64-gnu@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz#dbc5036a85e3ca3349887c8bdbebcfd011e460b0"
|
||||
integrity sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==
|
||||
"@rollup/rollup-linux-arm64-gnu@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.2.tgz#c0f1fc20c50666c61f574536a00cdd486b6aaae1"
|
||||
integrity sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==
|
||||
|
||||
"@rollup/rollup-linux-arm64-musl@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz#72efc633aa0b93531bdfc69d70bcafa88e6152fc"
|
||||
integrity sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==
|
||||
"@rollup/rollup-linux-arm64-musl@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.2.tgz#0214efc3e404ddf108e946ad5f7e4ee2792a155a"
|
||||
integrity sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==
|
||||
|
||||
"@rollup/rollup-linux-loongarch64-gnu@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz#9b6a49afde86c8f57ca11efdf8fd8d7c52048817"
|
||||
integrity sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==
|
||||
"@rollup/rollup-linux-loongarch64-gnu@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.2.tgz#8303c4ea2ae7bcbb96b2c77cfb53527d964bfceb"
|
||||
integrity sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==
|
||||
|
||||
"@rollup/rollup-linux-powerpc64le-gnu@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz#93cb96073efab0cdbf419c8dfc44b5e2bd815139"
|
||||
integrity sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==
|
||||
"@rollup/rollup-linux-powerpc64le-gnu@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.2.tgz#4197ffbc61809629094c0fccf825e43a40fbc0ca"
|
||||
integrity sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==
|
||||
|
||||
"@rollup/rollup-linux-riscv64-gnu@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz#028708f73c8130ae924e5c3755de50fe93687249"
|
||||
integrity sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==
|
||||
"@rollup/rollup-linux-riscv64-gnu@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.2.tgz#bcb99c9004c9b91e3704a6a70c892cb0599b1f42"
|
||||
integrity sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==
|
||||
|
||||
"@rollup/rollup-linux-riscv64-musl@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz#878bfb158b2cf6671b7611fd58e5c80d9144ac6c"
|
||||
integrity sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==
|
||||
"@rollup/rollup-linux-riscv64-musl@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.2.tgz#3e943bae9b8b4637c573c1922392beb8a5e81acb"
|
||||
integrity sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==
|
||||
|
||||
"@rollup/rollup-linux-s390x-gnu@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz#59b4ebb2129d34b7807ed8c462ff0baaefca9ad4"
|
||||
integrity sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==
|
||||
"@rollup/rollup-linux-s390x-gnu@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.2.tgz#dc43fb467bff9547f5b9937f38668da07fa8fa9f"
|
||||
integrity sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==
|
||||
|
||||
"@rollup/rollup-linux-x64-gnu@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz#597d40f60d4b15bedbbacf2491a69c5b67a58e93"
|
||||
integrity sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==
|
||||
"@rollup/rollup-linux-x64-gnu@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.2.tgz#0699c560fa6ce6b846581a7e6c30c85c22a3f0da"
|
||||
integrity sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==
|
||||
|
||||
"@rollup/rollup-linux-x64-musl@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz#0a062d6fee35ec4fbb607b2a9d933a9372ccf63a"
|
||||
integrity sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==
|
||||
"@rollup/rollup-linux-x64-musl@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.2.tgz#9fb1becedcdc9e227d4748576eb8ba2fad8d2e29"
|
||||
integrity sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==
|
||||
|
||||
"@rollup/rollup-win32-arm64-msvc@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz#41ffab489857987c75385b0fc8cccf97f7e69d0a"
|
||||
integrity sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==
|
||||
"@rollup/rollup-win32-arm64-msvc@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.2.tgz#fcf3e62edd76c560252b819f69627685f65887d7"
|
||||
integrity sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==
|
||||
|
||||
"@rollup/rollup-win32-ia32-msvc@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz#d9fb61d98eedfa52720b6ed9f31442b3ef4b839f"
|
||||
integrity sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==
|
||||
"@rollup/rollup-win32-ia32-msvc@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.2.tgz#45a5304491d6da4666f6159be4f739d4d43a283f"
|
||||
integrity sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==
|
||||
|
||||
"@rollup/rollup-win32-x64-msvc@4.44.0":
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz#a36e79b6ccece1533f777a1bca1f89c13f0c5f62"
|
||||
integrity sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==
|
||||
"@rollup/rollup-win32-x64-msvc@4.44.2":
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.2.tgz#660018c9696ad4f48abe8c5d56db53c81aadba25"
|
||||
integrity sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==
|
||||
|
||||
"@spruceid/siwe-parser@^2.1.2":
|
||||
version "2.1.2"
|
||||
@@ -547,9 +547,9 @@
|
||||
"@types/lodash" "*"
|
||||
|
||||
"@types/lodash@*", "@types/lodash@^4.14.182":
|
||||
version "4.17.18"
|
||||
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.18.tgz#4710e7db5b3857103764bf7b7b666414e6141baf"
|
||||
integrity sha512-KJ65INaxqxmU6EoCiJmRPZC9H9RVWCRd349tXM2M3O5NA7cY6YL7c0bHAHQ93NOfTObEQ004kd2QVHs/r0+m4g==
|
||||
version "4.17.20"
|
||||
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.20.tgz#1ca77361d7363432d29f5e55950d9ec1e1c6ea93"
|
||||
integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==
|
||||
|
||||
"@types/minimist@^1.2.0":
|
||||
version "1.2.5"
|
||||
@@ -1040,9 +1040,9 @@ dunder-proto@^1.0.1:
|
||||
gopd "^1.2.0"
|
||||
|
||||
element-plus@^2.9.11:
|
||||
version "2.10.2"
|
||||
resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.10.2.tgz#5eb8ea6aa54cfdd88b903d7d65b623bdaeaf899d"
|
||||
integrity sha512-p2KiAa0jEGXrzdlTAfpiS7HQFAhla4gvx6H7RuDf+OO0uC3DGpolxvdHjFR8gt7+vaWyxQNcHa1sAdBkmjqlgA==
|
||||
version "2.10.3"
|
||||
resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.10.3.tgz#82a4454d76b2104f71a46f49b02fba9650d1f33f"
|
||||
integrity sha512-OLpf0iekuvWJrz1+H9ybvem6TYTKSNk6L1QDA3tYq2YWbogKXJnWpHG1UAGKR1B7gx+vUH7M15VIH3EijE9Kgw==
|
||||
dependencies:
|
||||
"@ctrl/tinycolor" "^3.4.1"
|
||||
"@element-plus/icons-vue" "^2.3.1"
|
||||
@@ -1150,15 +1150,7 @@ eslint-config-prettier@^10.0.1, eslint-config-prettier@^10.0.2:
|
||||
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz#00c18d7225043b6fbce6a665697377998d453782"
|
||||
integrity sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==
|
||||
|
||||
eslint-plugin-prettier@^5.2.2:
|
||||
version "5.4.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz#54d4748904e58eaf1ffe26c4bffa4986ca7f952b"
|
||||
integrity sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==
|
||||
dependencies:
|
||||
prettier-linter-helpers "^1.0.0"
|
||||
synckit "^0.11.0"
|
||||
|
||||
eslint-plugin-prettier@^5.2.3:
|
||||
eslint-plugin-prettier@^5.2.2, eslint-plugin-prettier@^5.2.3:
|
||||
version "5.5.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.1.tgz#470820964de9aedb37e9ce62c3266d2d26d08d15"
|
||||
integrity sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==
|
||||
@@ -1207,17 +1199,17 @@ eslint-visitor-keys@^4.2.1:
|
||||
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
|
||||
|
||||
eslint@^9.21.0:
|
||||
version "9.29.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.29.0.tgz#65e3db3b7e5a5b04a8af541741a0f3648d0a81a6"
|
||||
integrity sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==
|
||||
version "9.30.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.30.1.tgz#d4107b39964412acd9b5c0744f1c6df514fa1211"
|
||||
integrity sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils" "^4.2.0"
|
||||
"@eslint-community/regexpp" "^4.12.1"
|
||||
"@eslint/config-array" "^0.20.1"
|
||||
"@eslint/config-helpers" "^0.2.1"
|
||||
"@eslint/config-array" "^0.21.0"
|
||||
"@eslint/config-helpers" "^0.3.0"
|
||||
"@eslint/core" "^0.14.0"
|
||||
"@eslint/eslintrc" "^3.3.1"
|
||||
"@eslint/js" "9.29.0"
|
||||
"@eslint/js" "9.30.1"
|
||||
"@eslint/plugin-kit" "^0.3.1"
|
||||
"@humanfs/node" "^0.16.6"
|
||||
"@humanwhocodes/module-importer" "^1.0.1"
|
||||
@@ -1529,9 +1521,9 @@ globals@^14.0.0:
|
||||
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
|
||||
|
||||
globals@^16.0.0:
|
||||
version "16.2.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-16.2.0.tgz#19efcd1ddde2bd5efce128e5c2e441df1abc6f7c"
|
||||
integrity sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==
|
||||
version "16.3.0"
|
||||
resolved "https://registry.yarnpkg.com/globals/-/globals-16.3.0.tgz#66118e765ddaf9e2d880f7e17658543f93f1f667"
|
||||
integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==
|
||||
|
||||
globby@^11.1.0:
|
||||
version "11.1.0"
|
||||
@@ -1940,7 +1932,7 @@ ms@^2.1.3:
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
|
||||
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
|
||||
|
||||
nanoid@^3.3.11, nanoid@^3.3.8:
|
||||
nanoid@^3.3.11:
|
||||
version "3.3.11"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
|
||||
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
|
||||
@@ -2086,32 +2078,32 @@ path-type@^4.0.0:
|
||||
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
|
||||
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
|
||||
|
||||
pg-cloudflare@^1.2.5:
|
||||
version "1.2.5"
|
||||
resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.5.tgz#2e3649c38a7a9c74a7e5327c8098a2fd9af595bd"
|
||||
integrity sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==
|
||||
pg-cloudflare@^1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz#a1f3d226bab2c45ae75ea54d65ec05ac6cfafbef"
|
||||
integrity sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==
|
||||
|
||||
pg-connection-string@^2.8.5:
|
||||
version "2.8.5"
|
||||
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.8.5.tgz#82cefd0269cb64a09603342d9b69e8392e6eb6cd"
|
||||
integrity sha512-Ni8FuZ8yAF+sWZzojvtLE2b03cqjO5jNULcHFfM9ZZ0/JXrgom5pBREbtnAw7oxsxJqHw9Nz/XWORUEL3/IFow==
|
||||
pg-connection-string@^2.9.1:
|
||||
version "2.9.1"
|
||||
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.9.1.tgz#bb1fd0011e2eb76ac17360dc8fa183b2d3465238"
|
||||
integrity sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==
|
||||
|
||||
pg-int8@1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
|
||||
integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
|
||||
|
||||
pg-pool@^3.9.6:
|
||||
version "3.9.6"
|
||||
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.9.6.tgz#c6fde89dee615d6c262724e68a3a37e9593157fc"
|
||||
integrity sha512-rFen0G7adh1YmgvrmE5IPIqbb+IgEzENUm+tzm6MLLDSlPRoZVhzU1WdML9PV2W5GOdRA9qBKURlbt1OsXOsPw==
|
||||
pg-pool@^3.10.1:
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.10.1.tgz#481047c720be2d624792100cac1816f8850d31b2"
|
||||
integrity sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==
|
||||
|
||||
pg-protocol@^1.9.5:
|
||||
version "1.9.5"
|
||||
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.9.5.tgz#e544eff37d6ab79c26281d7c0b59ac9be4862686"
|
||||
integrity sha512-DYTWtWpfd5FOro3UnAfwvhD8jh59r2ig8bPtc9H8Ds7MscE/9NYruUQWFAOuraRl29jwcT2kyMFQ3MxeaVjUhg==
|
||||
pg-protocol@^1.10.3:
|
||||
version "1.10.3"
|
||||
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.3.tgz#ac9e4778ad3f84d0c5670583bab976ea0a34f69f"
|
||||
integrity sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==
|
||||
|
||||
pg-types@^2.1.0:
|
||||
pg-types@2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
|
||||
integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==
|
||||
@@ -2123,19 +2115,19 @@ pg-types@^2.1.0:
|
||||
postgres-interval "^1.1.0"
|
||||
|
||||
pg@^8.12.0:
|
||||
version "8.15.6"
|
||||
resolved "https://registry.yarnpkg.com/pg/-/pg-8.15.6.tgz#2a28e98fb6cab18b886ce58b2c184d712a94880a"
|
||||
integrity sha512-yvao7YI3GdmmrslNVsZgx9PfntfWrnXwtR+K/DjI0I/sTKif4Z623um+sjVZ1hk5670B+ODjvHDAckKdjmPTsg==
|
||||
version "8.16.3"
|
||||
resolved "https://registry.yarnpkg.com/pg/-/pg-8.16.3.tgz#160741d0b44fdf64680e45374b06d632e86c99fd"
|
||||
integrity sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==
|
||||
dependencies:
|
||||
pg-connection-string "^2.8.5"
|
||||
pg-pool "^3.9.6"
|
||||
pg-protocol "^1.9.5"
|
||||
pg-types "^2.1.0"
|
||||
pgpass "1.x"
|
||||
pg-connection-string "^2.9.1"
|
||||
pg-pool "^3.10.1"
|
||||
pg-protocol "^1.10.3"
|
||||
pg-types "2.2.0"
|
||||
pgpass "1.0.5"
|
||||
optionalDependencies:
|
||||
pg-cloudflare "^1.2.5"
|
||||
pg-cloudflare "^1.2.7"
|
||||
|
||||
pgpass@1.x:
|
||||
pgpass@1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d"
|
||||
integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==
|
||||
@@ -2195,7 +2187,7 @@ postcss-value-parser@^4.2.0:
|
||||
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
|
||||
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
|
||||
|
||||
postcss@^8.4.19, postcss@^8.5.3, postcss@^8.5.6:
|
||||
postcss@^8.4.19, postcss@^8.5.0, postcss@^8.5.3, postcss@^8.5.6:
|
||||
version "8.5.6"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c"
|
||||
integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
|
||||
@@ -2204,15 +2196,6 @@ postcss@^8.4.19, postcss@^8.5.3, postcss@^8.5.6:
|
||||
picocolors "^1.1.1"
|
||||
source-map-js "^1.2.1"
|
||||
|
||||
postcss@^8.5.0:
|
||||
version "8.5.3"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb"
|
||||
integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==
|
||||
dependencies:
|
||||
nanoid "^3.3.8"
|
||||
picocolors "^1.1.1"
|
||||
source-map-js "^1.2.1"
|
||||
|
||||
postgres-array@~2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
|
||||
@@ -2248,9 +2231,9 @@ prettier-linter-helpers@^1.0.0:
|
||||
fast-diff "^1.1.2"
|
||||
|
||||
prettier@^3.5.3:
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.1.tgz#cc3bce21c09a477b1e987b76ce9663925d86ae44"
|
||||
integrity sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A==
|
||||
version "3.6.2"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393"
|
||||
integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
|
||||
|
||||
proxy-from-env@^1.1.0:
|
||||
version "1.1.0"
|
||||
@@ -2350,32 +2333,32 @@ rollup@^3.29.4:
|
||||
fsevents "~2.3.2"
|
||||
|
||||
rollup@^4.34.9:
|
||||
version "4.44.0"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.44.0.tgz#0e10b98339b306edad1e612f1e5590a79aef521c"
|
||||
integrity sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==
|
||||
version "4.44.2"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.44.2.tgz#faedb27cb2aa6742530c39668092eecbaf78c488"
|
||||
integrity sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==
|
||||
dependencies:
|
||||
"@types/estree" "1.0.8"
|
||||
optionalDependencies:
|
||||
"@rollup/rollup-android-arm-eabi" "4.44.0"
|
||||
"@rollup/rollup-android-arm64" "4.44.0"
|
||||
"@rollup/rollup-darwin-arm64" "4.44.0"
|
||||
"@rollup/rollup-darwin-x64" "4.44.0"
|
||||
"@rollup/rollup-freebsd-arm64" "4.44.0"
|
||||
"@rollup/rollup-freebsd-x64" "4.44.0"
|
||||
"@rollup/rollup-linux-arm-gnueabihf" "4.44.0"
|
||||
"@rollup/rollup-linux-arm-musleabihf" "4.44.0"
|
||||
"@rollup/rollup-linux-arm64-gnu" "4.44.0"
|
||||
"@rollup/rollup-linux-arm64-musl" "4.44.0"
|
||||
"@rollup/rollup-linux-loongarch64-gnu" "4.44.0"
|
||||
"@rollup/rollup-linux-powerpc64le-gnu" "4.44.0"
|
||||
"@rollup/rollup-linux-riscv64-gnu" "4.44.0"
|
||||
"@rollup/rollup-linux-riscv64-musl" "4.44.0"
|
||||
"@rollup/rollup-linux-s390x-gnu" "4.44.0"
|
||||
"@rollup/rollup-linux-x64-gnu" "4.44.0"
|
||||
"@rollup/rollup-linux-x64-musl" "4.44.0"
|
||||
"@rollup/rollup-win32-arm64-msvc" "4.44.0"
|
||||
"@rollup/rollup-win32-ia32-msvc" "4.44.0"
|
||||
"@rollup/rollup-win32-x64-msvc" "4.44.0"
|
||||
"@rollup/rollup-android-arm-eabi" "4.44.2"
|
||||
"@rollup/rollup-android-arm64" "4.44.2"
|
||||
"@rollup/rollup-darwin-arm64" "4.44.2"
|
||||
"@rollup/rollup-darwin-x64" "4.44.2"
|
||||
"@rollup/rollup-freebsd-arm64" "4.44.2"
|
||||
"@rollup/rollup-freebsd-x64" "4.44.2"
|
||||
"@rollup/rollup-linux-arm-gnueabihf" "4.44.2"
|
||||
"@rollup/rollup-linux-arm-musleabihf" "4.44.2"
|
||||
"@rollup/rollup-linux-arm64-gnu" "4.44.2"
|
||||
"@rollup/rollup-linux-arm64-musl" "4.44.2"
|
||||
"@rollup/rollup-linux-loongarch64-gnu" "4.44.2"
|
||||
"@rollup/rollup-linux-powerpc64le-gnu" "4.44.2"
|
||||
"@rollup/rollup-linux-riscv64-gnu" "4.44.2"
|
||||
"@rollup/rollup-linux-riscv64-musl" "4.44.2"
|
||||
"@rollup/rollup-linux-s390x-gnu" "4.44.2"
|
||||
"@rollup/rollup-linux-x64-gnu" "4.44.2"
|
||||
"@rollup/rollup-linux-x64-musl" "4.44.2"
|
||||
"@rollup/rollup-win32-arm64-msvc" "4.44.2"
|
||||
"@rollup/rollup-win32-ia32-msvc" "4.44.2"
|
||||
"@rollup/rollup-win32-x64-msvc" "4.44.2"
|
||||
fsevents "~2.3.2"
|
||||
|
||||
run-parallel@^1.1.9:
|
||||
@@ -2390,16 +2373,11 @@ run-parallel@^1.1.9:
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
|
||||
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
|
||||
|
||||
semver@^7.3.4, semver@^7.3.6, semver@^7.6.3:
|
||||
semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.6.3:
|
||||
version "7.7.2"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58"
|
||||
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
|
||||
|
||||
semver@^7.3.5:
|
||||
version "7.7.1"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
|
||||
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
|
||||
|
||||
shebang-command@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
|
||||
@@ -2526,9 +2504,9 @@ stylelint-config-prettier@^9.0.5:
|
||||
integrity sha512-U44lELgLZhbAD/xy/vncZ2Pq8sh2TnpiPvo38Ifg9+zeioR+LAkHu0i6YORIOxFafZoVg0xqQwex6e6F25S5XA==
|
||||
|
||||
stylelint-config-recommended-vue@>=1.1.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.6.0.tgz#e5d34d9f11417922a24dbd21438c6c058843fa20"
|
||||
integrity sha512-syk1adIHvbH2T1OiR/spUK4oQy35PZIDw8Zmc7E0+eVK9Z9SK3tdMpGRT/bgGnAPpMt/WaL9K1u0tlF6xM0sMQ==
|
||||
version "1.6.1"
|
||||
resolved "https://registry.yarnpkg.com/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.6.1.tgz#6a93082ce4a5c1f64793b789175a833c57ce8309"
|
||||
integrity sha512-lLW7hTIMBiTfjenGuDq2kyHA6fBWd/+Df7MO4/AWOxiFeXP9clbpKgg27kHfwA3H7UNMGC7aeP3mNlZB5LMmEQ==
|
||||
dependencies:
|
||||
semver "^7.3.5"
|
||||
stylelint-config-html ">=1.0.0"
|
||||
@@ -2624,7 +2602,7 @@ svg-tags@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
|
||||
integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==
|
||||
|
||||
synckit@^0.11.0, synckit@^0.11.7:
|
||||
synckit@^0.11.7:
|
||||
version "0.11.8"
|
||||
resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.8.tgz#b2aaae998a4ef47ded60773ad06e7cb821f55457"
|
||||
integrity sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==
|
||||
@@ -2762,12 +2740,12 @@ vue-eslint-parser@^9.4.3:
|
||||
semver "^7.3.6"
|
||||
|
||||
vue-i18n@^11.1.2:
|
||||
version "11.1.7"
|
||||
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-11.1.7.tgz#a26c0224d1311ac89b82ff6d0ee45f68b5099237"
|
||||
integrity sha512-CDrU7Cmyh1AxJjerQmipV9nVa//exVBdhTcWGlbfcDCN8bKp/uAe7Le6IoN4//5emIikbsSKe9Uofmf/xXkhOA==
|
||||
version "11.1.9"
|
||||
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-11.1.9.tgz#214816d3a5461a3169ee1eb507cac045a03a15d8"
|
||||
integrity sha512-N9ZTsXdRmX38AwS9F6Rh93RtPkvZTkSy/zNv63FTIwZCUbLwwrpqlKz9YQuzFLdlvRdZTnWAUE5jMxr8exdl7g==
|
||||
dependencies:
|
||||
"@intlify/core-base" "11.1.7"
|
||||
"@intlify/shared" "11.1.7"
|
||||
"@intlify/core-base" "11.1.9"
|
||||
"@intlify/shared" "11.1.9"
|
||||
"@vue/devtools-api" "^6.5.0"
|
||||
|
||||
vue-router@^4.1.6:
|
||||
|
||||
@@ -1,839 +0,0 @@
|
||||
# Cloudflared Tunnel Troubleshooting
|
||||
|
||||
## Проблема
|
||||
Cloudflared туннель не может подключиться к Cloudflare edge серверам, выдавая ошибки:
|
||||
- `TLS handshake with edge error: read tcp 172.18.0.6:xxxxx->198.41.xxx.xxx:7844: i/o timeout`
|
||||
- `failed to dial to edge with quic: timeout: no recent network activity`
|
||||
|
||||
## Исследование
|
||||
|
||||
### 1. Проверка блокировки портов ❌
|
||||
**Предположение:** Корпоративный файрвол блокирует порт 7844
|
||||
|
||||
**Тесты:**
|
||||
```bash
|
||||
# TCP порт 7844
|
||||
nc -zv 198.41.192.227 7844 # ✅ Connection succeeded
|
||||
nc -zv 198.41.192.77 7844 # ✅ Connection succeeded
|
||||
|
||||
# UDP порт 7844 (для QUIC)
|
||||
timeout 5 nc -u -zv 198.41.192.167 7844 # ✅ Connection succeeded
|
||||
|
||||
# SSL handshake
|
||||
openssl s_client -connect 198.41.192.227:7844 -servername cloudflare.com
|
||||
# ✅ TLS handshake successful
|
||||
```
|
||||
|
||||
**Результат:** Порты НЕ блокируются, проблема не в сети
|
||||
|
||||
### 2. Переключение протокола с QUIC на HTTP/2 ✅
|
||||
**Проблема:** Cloudflared по умолчанию использует QUIC (UDP), который может блокироваться на уровне DPI
|
||||
|
||||
**Исправление:**
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
cloudflared:
|
||||
command: tunnel --no-autoupdate --protocol http2 run
|
||||
```
|
||||
|
||||
**Проверка в логах:**
|
||||
```
|
||||
INF Settings: map[no-autoupdate:true p:http2 protocol:http2]
|
||||
INF Initial protocol http2
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
- ✅ Протокол успешно изменился с QUIC на HTTP/2 over TCP
|
||||
- ❌ TLS handshake timeout ошибки остались на порту 7844
|
||||
- ❌ Cloudflared всё ещё не может подключиться к edge серверам
|
||||
|
||||
### 3. Исправление конфигурации туннеля ✅
|
||||
**Проблема:** В Cloudflare Dashboard Routes показывает `--` (пустые маршруты)
|
||||
|
||||
**Исправление через API:**
|
||||
```javascript
|
||||
// backend/fix-tunnel.js
|
||||
const config = {
|
||||
config: {
|
||||
ingress: [
|
||||
{ hostname: domain, service: 'http://dapp-frontend:5173' },
|
||||
{ service: 'http_status:404' }
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
await axios.put(
|
||||
`https://api.cloudflare.com/client/v4/accounts/${account_id}/cfd_tunnel/${tunnel_id}/configurations`,
|
||||
config,
|
||||
{ headers: { Authorization: `Bearer ${api_token}` } }
|
||||
);
|
||||
```
|
||||
|
||||
**Результат:** Routes успешно настроены, но cloudflared всё ещё не подключается
|
||||
|
||||
### 4. Настройка прокси через переменные окружения ❌
|
||||
**Попытка:** Использование v2rayN прокси через environment variables
|
||||
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
cloudflared:
|
||||
environment:
|
||||
- HTTP_PROXY=http://host.docker.internal:10809
|
||||
- HTTPS_PROXY=http://host.docker.internal:10809
|
||||
- ALL_PROXY=socks5://host.docker.internal:10808
|
||||
extra_hosts:
|
||||
- host.docker.internal:host-gateway
|
||||
```
|
||||
|
||||
**Проверка доступности прокси:**
|
||||
```bash
|
||||
# Тест HTTP прокси
|
||||
docker run --rm --add-host=host.docker.internal:host-gateway alpine /bin/sh -c "nc -zv host.docker.internal 10809"
|
||||
# ✅ host.docker.internal (192.168.65.254:10809) open
|
||||
|
||||
# Тест SOCKS5 прокси
|
||||
docker run --rm --add-host=host.docker.internal:host-gateway alpine /bin/sh -c "nc -zv host.docker.internal 10808"
|
||||
# ✅ host.docker.internal (192.168.65.254:10808) open
|
||||
```
|
||||
|
||||
**Результат:** Прокси доступны, но cloudflared игнорирует переменные окружения
|
||||
|
||||
### 5. Альтернативные методы проксирования ❌
|
||||
|
||||
### 5.1. Redsocks (transparent proxy) - пробовали ранее ❌
|
||||
**Подход:** Transparent proxy с iptables для принудительного перехвата трафика
|
||||
|
||||
**Реализация:**
|
||||
```dockerfile
|
||||
# Предыдущая попытка с redsocks
|
||||
FROM alpine:latest
|
||||
RUN apk add --no-cache redsocks iptables
|
||||
|
||||
# Конфигурация redsocks
|
||||
RUN echo "base {" > /etc/redsocks.conf && \
|
||||
echo " log_debug = on;" >> /etc/redsocks.conf && \
|
||||
echo " log_info = on;" >> /etc/redsocks.conf && \
|
||||
echo " daemon = off;" >> /etc/redsocks.conf && \
|
||||
echo "}" >> /etc/redsocks.conf && \
|
||||
echo "redsocks {" >> /etc/redsocks.conf && \
|
||||
echo " local_ip = 0.0.0.0;" >> /etc/redsocks.conf && \
|
||||
echo " local_port = 12345;" >> /etc/redsocks.conf && \
|
||||
echo " ip = host.docker.internal;" >> /etc/redsocks.conf && \
|
||||
echo " port = 10808;" >> /etc/redsocks.conf && \
|
||||
echo " type = socks5;" >> /etc/redsocks.conf && \
|
||||
echo "}" >> /etc/redsocks.conf
|
||||
|
||||
# iptables rules для перехвата трафика на порты 443 и 7844
|
||||
RUN echo '#!/bin/sh' > /start.sh && \
|
||||
echo 'iptables -t nat -A OUTPUT -p tcp --dport 7844 -j REDIRECT --to-ports 12345' >> /start.sh && \
|
||||
echo 'iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 12345' >> /start.sh && \
|
||||
echo 'redsocks -c /etc/redsocks.conf &' >> /start.sh && \
|
||||
echo 'cloudflared "$@"' >> /start.sh && \
|
||||
chmod +x /start.sh
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
- ✅ Redsocks успешно перехватывал соединения: `redsocks_accept_client [172.18.0.6:xxx->198.41.xxx.xxx:7844]: accepted`
|
||||
- ❌ Ошибки изменились с `i/o timeout` на `TLS handshake with edge error: EOF`
|
||||
- ❌ Подключение всё равно не устанавливалось
|
||||
|
||||
### 5.2. Кастомный Dockerfile с proxychains ⏳
|
||||
**Подход:** Принудительная маршрутизация через SOCKS5 прокси с помощью proxychains
|
||||
|
||||
**Первая попытка (провал):**
|
||||
```dockerfile
|
||||
FROM cloudflare/cloudflared:latest
|
||||
# ❌ Cloudflared использует distroless образ без shell
|
||||
RUN apk add --no-cache proxychains-ng # ERROR: /bin/sh not found
|
||||
```
|
||||
|
||||
**Вторая попытка (текущая):**
|
||||
```dockerfile
|
||||
FROM alpine:latest
|
||||
|
||||
# Скачиваем cloudflared binary
|
||||
RUN curl -L --output cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 && \
|
||||
chmod +x cloudflared && \
|
||||
mv cloudflared /usr/local/bin/
|
||||
|
||||
# Устанавливаем proxychains
|
||||
RUN apk add --no-cache curl proxychains-ng
|
||||
|
||||
# Конфигурация proxychains
|
||||
RUN echo "strict_chain" > /etc/proxychains.conf && \
|
||||
echo "proxy_dns" >> /etc/proxychains.conf && \
|
||||
echo "remote_dns_subnet 224" >> /etc/proxychains.conf && \
|
||||
echo "tcp_read_time_out 15000" >> /etc/proxychains.conf && \
|
||||
echo "tcp_connect_time_out 8000" >> /etc/proxychains.conf && \
|
||||
echo "[ProxyList]" >> /etc/proxychains.conf && \
|
||||
echo "socks5 host.docker.internal 10808" >> /etc/proxychains.conf
|
||||
|
||||
# Entrypoint с proxychains
|
||||
ENTRYPOINT ["proxychains4", "-f", "/etc/proxychains.conf", "cloudflared"]
|
||||
```
|
||||
|
||||
**Статус:** В процессе тестирования
|
||||
|
||||
### 6. Проверка всех переменных и DNS настроек ✅
|
||||
**Подход:** Полная верификация конфигурации туннеля и DNS записей
|
||||
|
||||
**Проверка базы данных:**
|
||||
```sql
|
||||
SELECT * FROM cloudflare_settings ORDER BY id DESC LIMIT 1;
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
- ✅ `api_token`: C3D4cDmjciiXlfvqGNIXKGlxKsRi8RiN1aTy3Zl1
|
||||
- ✅ `account_id`: a67861072a144cdd746e9c9bdd8476fe
|
||||
- ✅ `tunnel_id`: 1fed7200-6590-450f-8914-71c3546ed09c
|
||||
- ✅ `tunnel_token`: JWT токен корректно установлен
|
||||
- ✅ `domain`: hb3-accelerator.com
|
||||
|
||||
**Проверка DNS записей через API:**
|
||||
```bash
|
||||
curl -X GET "https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records" \
|
||||
-H "Authorization: Bearer {api_token}" | jq '.result[]'
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
- ✅ `hb3-accelerator.com` CNAME → `1fed7200-6590-450f-8914-71c3546ed09c.cfargotunnel.com` (проксирована)
|
||||
- ✅ `www.hb3-accelerator.com` CNAME → `1fed7200-6590-450f-8914-71c3546ed09c.cfargotunnel.com` (проксирована)
|
||||
- ✅ CAA запись для letsencrypt.org установлена
|
||||
- ✅ Все необходимые MX, NS, TXT записи присутствуют
|
||||
|
||||
**Проверка конфигурации туннеля:**
|
||||
```bash
|
||||
curl -X GET "https://api.cloudflare.com/client/v4/accounts/{account_id}/cfd_tunnel/{tunnel_id}/configurations" \
|
||||
-H "Authorization: Bearer {api_token}"
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
```json
|
||||
{
|
||||
"config": {
|
||||
"ingress": [
|
||||
{
|
||||
"service": "http://dapp-frontend:5173",
|
||||
"hostname": "hb3-accelerator.com"
|
||||
},
|
||||
{
|
||||
"service": "http_status:404"
|
||||
}
|
||||
],
|
||||
"warp-routing": {
|
||||
"enabled": false
|
||||
}
|
||||
},
|
||||
"version": 4
|
||||
}
|
||||
```
|
||||
- ✅ Ingress маршрут: `hb3-accelerator.com` → `http://dapp-frontend:5173`
|
||||
- ✅ Catch-all маршрут: `http_status:404`
|
||||
- ✅ Версия конфигурации: 4 (актуальная)
|
||||
|
||||
**Проверка файла cloudflared.env:**
|
||||
```bash
|
||||
cat cloudflared.env
|
||||
```
|
||||
- ✅ `TUNNEL_TOKEN` установлен корректно
|
||||
- ✅ `DOMAIN=hb3-accelerator.com`
|
||||
|
||||
**Статус туннеля в Cloudflare:**
|
||||
```json
|
||||
{
|
||||
"name": "dapp-tunnel-hb3-accelerator.com",
|
||||
"status": "inactive",
|
||||
"created_at": "2025-07-02T17:23:01.029198Z"
|
||||
}
|
||||
```
|
||||
- ❌ **Status: "inactive"** - туннель неактивен из-за отсутствия подключения cloudflared
|
||||
|
||||
**Заключение по проверке:**
|
||||
**ВСЕ ПЕРЕМЕННЫЕ И DNS НАСТРОЙКИ КОРРЕКТНЫ!** Проблема **НЕ в конфигурации**, а в невозможности cloudflared подключиться к Cloudflare edge серверам из-за DPI фильтрации TLS трафика.
|
||||
|
||||
### 7. Тестирование на хосте (исключаем Docker) ✅
|
||||
**Подход:** Запуск cloudflared напрямую на хост-системе для исключения проблем Docker
|
||||
|
||||
**Проверка DPI фильтрации:**
|
||||
```bash
|
||||
# Проверка HTTPS к Cloudflare
|
||||
curl -I https://cloudflare.com
|
||||
# ✅ HTTP/2 301 - успешно
|
||||
|
||||
# Проверка TLS к edge серверам
|
||||
timeout 5 openssl s_client -connect 198.41.192.227:7844 -servername cloudflare.com
|
||||
# ✅ CONNECTED(00000003) - TLS handshake успешен
|
||||
```
|
||||
|
||||
**Результат DPI проверки:**
|
||||
- ✅ **DPI НЕ блокирует TLS трафик** к Cloudflare
|
||||
- ✅ HTTPS соединения к cloudflare.com работают
|
||||
- ✅ TLS handshake к edge серверам на порту 7844 проходит успешно
|
||||
|
||||
**Тестирование cloudflared на хосте:**
|
||||
```bash
|
||||
# Скачивание cloudflared binary
|
||||
curl -L -o cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
|
||||
chmod +x cloudflared
|
||||
|
||||
# Запуск с нашим туннелем
|
||||
TUNNEL_TOKEN="..." ./cloudflared --protocol http2 tunnel run
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
```
|
||||
INF Starting tunnel tunnelID=1fed7200-6590-450f-8914-71c3546ed09c
|
||||
INF Version 2025.6.1
|
||||
INF Settings: map[p:http2 protocol:http2]
|
||||
INF Generated Connector ID: 540bf383-0d42-456e-9814-3c73b161a809
|
||||
INF Initial protocol http2
|
||||
INF Starting metrics server on 127.0.0.1:20241/metrics
|
||||
```
|
||||
|
||||
- ✅ **Cloudflared успешно запускается на хосте**
|
||||
- ✅ **НЕТ ошибок подключения** к edge серверам
|
||||
- ✅ Туннель корректно инициализируется
|
||||
- ✅ Metrics сервер запускается
|
||||
|
||||
**Заключение критическое:**
|
||||
🎯 **Проблема НЕ в сети, DPI или блокировках!** Cloudflared **работает на хосте** через v2rayN без проблем. **Проблема в Docker сети** или настройках прокси для контейнеров.
|
||||
|
||||
### 8. Исправление Docker networking с WSL2 + v2rayN ⏳
|
||||
**Подход:** Различные способы обхода проблем Docker сети с v2rayN прокси
|
||||
|
||||
#### 8.1. Network Host Mode ⏳
|
||||
**Решение:** Использование сети хоста вместо bridge networking
|
||||
|
||||
**Реализация:**
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
cloudflared:
|
||||
image: cloudflare/cloudflared:latest
|
||||
restart: unless-stopped
|
||||
network_mode: host # Контейнер использует сеть хоста напрямую
|
||||
command: tunnel --no-autoupdate --protocol http2 run
|
||||
environment:
|
||||
- TUNNEL_TOKEN=...
|
||||
- TUNNEL_METRICS=0.0.0.0:39693
|
||||
depends_on:
|
||||
- backend
|
||||
- frontend
|
||||
```
|
||||
|
||||
**Преимущества:**
|
||||
- ✅ Контейнер получает прямой доступ к сети хоста
|
||||
- ✅ v2rayN прокси должен работать так же как на хосте
|
||||
- ✅ Нет проблем с host.docker.internal маршрутизацией
|
||||
- ✅ Упрощенная сетевая конфигурация
|
||||
|
||||
**Недостатки:**
|
||||
- ⚠️ Контейнер получает доступ ко всем портам хоста
|
||||
- ⚠️ Могут быть конфликты портов с другими сервисами
|
||||
- ⚠️ Менее изолированное окружение
|
||||
|
||||
**Результат тестирования:**
|
||||
```
|
||||
cloudflared-1 | 2025-07-02T20:05:56Z ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: read tcp 192.168.65.3:59272->198.41.192.7:7844: i/o timeout" connIndex=0 event=0 ip=198.41.192.7
|
||||
cloudflared-1 | 2025-07-02T20:05:56Z ERR Serve tunnel error error="TLS handshake with edge error: read tcp 192.168.65.3:59272->198.41.192.7:7844: i/o timeout" connIndex=0 event=0 ip=198.41.192.7
|
||||
cloudflared-1 | 2025-07-02T20:05:56Z INF Retrying connection in up to 1m4s connIndex=0 event=0 ip=198.41.192.7
|
||||
```
|
||||
|
||||
**Анализ:**
|
||||
- ❌ **Network host mode НЕ решил проблему**
|
||||
- 🔍 **IP изменился** с `172.18.0.6` (Docker bridge) на `192.168.65.3` (host network)
|
||||
- ❌ **TLS handshake timeout остался** - та же ошибка
|
||||
- 🤔 **Даже с host network v2rayN прокси не работает в контейнере**
|
||||
|
||||
**Вывод:** Host network не решает проблему. Возможно, нужны **переменные окружения прокси** даже с host network.
|
||||
|
||||
**Статус:** ❌ Провал
|
||||
|
||||
#### 8.1.1. Network Host Mode + Proxy Env Variables ⏳
|
||||
**Решение:** Комбинация host network с переменными окружения прокси
|
||||
|
||||
**Реализация:**
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
cloudflared:
|
||||
image: cloudflare/cloudflared:latest
|
||||
restart: unless-stopped
|
||||
network_mode: host
|
||||
command: tunnel --no-autoupdate --protocol http2 run
|
||||
environment:
|
||||
- TUNNEL_TOKEN=...
|
||||
- TUNNEL_METRICS=0.0.0.0:39693
|
||||
- HTTP_PROXY=http://127.0.0.1:10809 # localhost в host network
|
||||
- HTTPS_PROXY=http://127.0.0.1:10809
|
||||
- ALL_PROXY=socks5://127.0.0.1:10808
|
||||
```
|
||||
|
||||
**Логика:**
|
||||
- Используем host network для прямого доступа к сети
|
||||
- Добавляем переменные прокси с `127.0.0.1` (поскольку в host network это localhost хоста)
|
||||
- v2rayN прокси доступен через localhost
|
||||
|
||||
**Результат тестирования:**
|
||||
```
|
||||
2025-07-02T20:07:54Z INF Environmental variables map[TUNNEL_METRICS:0.0.0.0:39693]
|
||||
2025-07-02T20:08:10Z ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: read tcp 192.168.65.3:45402->198.41.200.73:7844: i/o timeout" connIndex=0 event=0 ip=198.41.200.73
|
||||
2025-07-02T20:08:10Z ERR Serve tunnel error error="TLS handshake with edge error: read tcp 192.168.65.3:45402->198.41.200.73:7844: i/o timeout" connIndex=0 event=0 ip=198.41.200.73
|
||||
```
|
||||
|
||||
**Анализ:**
|
||||
- ❌ **Host network + proxy переменные НЕ помогли**
|
||||
- 🔍 **В логах видны ТОЛЬКО TUNNEL_METRICS**, переменные HTTP_PROXY/HTTPS_PROXY/ALL_PROXY **игнорируются**
|
||||
- ❌ **Cloudflared НЕ использует стандартные переменные прокси**
|
||||
- ❌ **TLS timeout остался** на том же IP 192.168.65.3
|
||||
|
||||
**Вывод:** Cloudflared игнорирует стандартные proxy environment variables.
|
||||
|
||||
**Статус:** ❌ Провал
|
||||
|
||||
#### 8.2. Privileged Container ❓
|
||||
**Решение:** Запуск контейнера с полными привилегиями
|
||||
|
||||
**Реализация:**
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
cloudflared:
|
||||
image: cloudflare/cloudflared:latest
|
||||
restart: unless-stopped
|
||||
privileged: true # Полные привилегии контейнера
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_ADMIN
|
||||
command: tunnel --no-autoupdate --protocol http2 run
|
||||
environment:
|
||||
- TUNNEL_TOKEN=...
|
||||
- HTTP_PROXY=http://host.docker.internal:10809
|
||||
- HTTPS_PROXY=http://host.docker.internal:10809
|
||||
extra_hosts:
|
||||
- host.docker.internal:host-gateway
|
||||
```
|
||||
|
||||
**Статус:** Не тестировалось
|
||||
|
||||
#### 8.3. Custom Network Bridge ❓
|
||||
**Решение:** Создание кастомной Docker сети с настройками
|
||||
|
||||
**Реализация:**
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
networks:
|
||||
cloudflared_net:
|
||||
driver: bridge
|
||||
driver_opts:
|
||||
com.docker.network.bridge.host_binding_ipv4: "0.0.0.0"
|
||||
com.docker.network.bridge.enable_icc: "true"
|
||||
com.docker.network.bridge.enable_ip_masquerade: "true"
|
||||
|
||||
services:
|
||||
cloudflared:
|
||||
networks:
|
||||
- cloudflared_net
|
||||
sysctls:
|
||||
- net.ipv4.ip_forward=1
|
||||
```
|
||||
|
||||
**Статус:** Не тестировалось
|
||||
|
||||
#### 8.4. Sidecar Container with Proxy ❓
|
||||
**Решение:** Отдельный контейнер-прокси для маршрутизации
|
||||
|
||||
**Реализация:**
|
||||
```yaml
|
||||
# Контейнер с socat для проксирования
|
||||
proxy-sidecar:
|
||||
image: alpine/socat
|
||||
command: >
|
||||
sh -c "
|
||||
socat TCP-LISTEN:7844,fork,reuseaddr
|
||||
SOCKS5:host.docker.internal:198.41.192.227:7844,socksport=10808
|
||||
"
|
||||
extra_hosts:
|
||||
- host.docker.internal:host-gateway
|
||||
|
||||
cloudflared:
|
||||
environment:
|
||||
- TUNNEL_EDGE_IP=proxy-sidecar:7844
|
||||
depends_on:
|
||||
- proxy-sidecar
|
||||
```
|
||||
|
||||
**Статус:** Не тестировалось
|
||||
|
||||
## Возможные причины проблемы
|
||||
|
||||
### 1. ❌ DPI (Deep Packet Inspection) блокировка - ИСКЛЮЧЕНО
|
||||
- **Проверено:** TLS соединения к Cloudflare edge серверам работают на хосте
|
||||
- **Проверено:** HTTPS к cloudflare.com работает
|
||||
- **Проверено:** openssl s_client успешно подключается к edge серверам на порту 7844
|
||||
- **Вывод:** DPI НЕ блокирует трафик
|
||||
|
||||
### 2. ❌ Блокировка портов - ИСКЛЮЧЕНО
|
||||
- **Проверено:** Порты 7844 TCP/UDP доступны
|
||||
- **Проверено:** Cloudflared работает на хосте через те же порты
|
||||
- **Вывод:** Порты НЕ блокируются
|
||||
|
||||
### 3. ❌ Неправильная конфигурация DNS/туннеля - ИСКЛЮЧЕНО
|
||||
- **Проверено:** DNS записи настроены правильно
|
||||
- **Проверено:** Ingress конфигурация применена
|
||||
- **Проверено:** Все токены и переменные корректны
|
||||
- **Вывод:** Конфигурация правильная
|
||||
|
||||
### 4. ✅ Проблемы с Docker сетью - ОСНОВНАЯ ПРИЧИНА
|
||||
- **Проблема:** Cloudflared работает на хосте, но не в Docker контейнере
|
||||
- **Симптомы:** TLS handshake timeout только в Docker
|
||||
- **Возможные причины:**
|
||||
- Docker не может правильно использовать v2rayN прокси с хоста
|
||||
- Проблемы с host.docker.internal маршрутизацией в proxychains
|
||||
- MTU или сетевые настройки Docker vs WSL2
|
||||
- Недостаточные привилегии контейнера для сетевых операций
|
||||
|
||||
## Рекомендации
|
||||
|
||||
### ✅ Рабочее решение
|
||||
1. **Запуск cloudflared на хосте:** Cloudflared работает стабильно на хост-системе через v2rayN
|
||||
```bash
|
||||
# Установка на хосте
|
||||
curl -L -o cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
|
||||
chmod +x cloudflared
|
||||
sudo mv cloudflared /usr/local/bin/
|
||||
|
||||
# Запуск как systemd сервис
|
||||
sudo cloudflared service install $(cat cloudflared.env | grep TUNNEL_TOKEN | cut -d= -f2)
|
||||
```
|
||||
|
||||
### Альтернативные подходы для Docker
|
||||
1. ❌ **Network host mode** - Запуск с `network_mode: host` (НЕ помог)
|
||||
2. ❓ **Privileged container** - Полные привилегии + `NET_ADMIN/SYS_ADMIN`
|
||||
3. ❓ **Custom bridge network** - Кастомная сеть с настройками маршрутизации
|
||||
4. ❓ **Sidecar proxy container** - Отдельный контейнер для проксирования трафика
|
||||
5. 📋 **Подробные варианты смотри в разделе 8** документа
|
||||
|
||||
### Долгосрочные варианты
|
||||
1. **VPS решение:** Развернуть cloudflared на внешнем сервере
|
||||
2. **Альтернативные туннели:** Tailscale, WireGuard
|
||||
3. **Изучение Docker networking:** Глубокий анализ проблем с Docker + WSL2 + v2rayN
|
||||
|
||||
## Логи и диагностика
|
||||
|
||||
### Типичные ошибки cloudflared:
|
||||
```
|
||||
ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: read tcp 172.18.0.6:xxxxx->198.41.xxx.xxx:7844: i/o timeout"
|
||||
ERR Failed to dial a quic connection error="failed to dial to edge with quic: timeout: no recent network activity"
|
||||
```
|
||||
|
||||
### Успешные проверки:
|
||||
- ✅ Порты 7844 TCP/UDP доступны
|
||||
- ✅ DNS записи настроены правильно
|
||||
- ✅ Tunnel configuration применена
|
||||
- ✅ v2rayN прокси работает
|
||||
- ✅ **DPI НЕ блокирует TLS трафик**
|
||||
- ✅ **Cloudflared работает на хосте**
|
||||
- ✅ TLS handshake к edge серверам успешен
|
||||
- ✅ Все переменные и токены корректны
|
||||
|
||||
### Проверки для диагностики:
|
||||
```bash
|
||||
# Проверка доступности edge серверов
|
||||
nc -zv 198.41.192.227 7844
|
||||
nc -u -zv 198.41.192.227 7844
|
||||
|
||||
# Проверка SSL handshake
|
||||
openssl s_client -connect 198.41.192.227:7844
|
||||
|
||||
# Проверка через сайт
|
||||
curl -I https://hb3-accelerator.com
|
||||
# Ожидаем: HTTP/2 530 (origin недоступен, но DNS работает)
|
||||
|
||||
# Логи cloudflared
|
||||
docker logs dapp-for-business-cloudflared-1 --tail 20
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
Основная проблема **НЕ в блокировке портов**, а в **DPI фильтрации TLS трафика** к Cloudflare edge серверам.
|
||||
|
||||
### Краткое резюме попыток:
|
||||
1. ❌ **Проверка портов** - порты 7844 TCP/UDP доступны, проблема не в сети
|
||||
2. ✅ **HTTP/2 протокол** - успешно переключили с QUIC на HTTP/2, но проблема осталась
|
||||
3. ✅ **Конфигурация туннеля** - исправили Routes в Dashboard через API
|
||||
4. ❌ **Переменные окружения** - cloudflared игнорирует HTTP_PROXY/HTTPS_PROXY/ALL_PROXY
|
||||
5. ❌ **Redsocks (transparent proxy)** - перехватывал трафик, но TLS handshake всё равно падал с EOF
|
||||
6. ❌ **Proxychains** - собрали кастомный образ, но проблема осталась
|
||||
7. ✅ **Верификация настроек** - все переменные и DNS записи корректны
|
||||
8. ✅ **Тестирование на хосте** - cloudflared работает идеально через v2rayN
|
||||
9. ❌ **Docker networking исправления** - ни host network, ни proxy переменные не помогли, cloudflared игнорирует прокси
|
||||
|
||||
**Вывод:** После тестирования на хосте выяснилось, что **проблема НЕ в сети, DPI или блокировках**. Cloudflared **работает корректно на хосте** через v2rayN без каких-либо проблем.
|
||||
|
||||
🎯 **ОСНОВНАЯ ПРОБЛЕМА: Docker сеть** не может правильно использовать v2rayN прокси с хоста или имеет другие сетевые ограничения.
|
||||
|
||||
**Рекомендуемое решение:** Запуск cloudflared **на хосте** вместо Docker контейнера, так как на хосте туннель работает стабильно через v2rayN.
|
||||
|
||||
## ✅ ФИНАЛЬНОЕ РАБОЧЕЕ РЕШЕНИЕ
|
||||
|
||||
**Статус:** ✅ **CLOUDFLARED УСПЕШНО РАБОТАЕТ НА ХОСТЕ**
|
||||
|
||||
### Реализация:
|
||||
|
||||
1. **Скачиваем cloudflared binary:**
|
||||
```bash
|
||||
curl -L -o cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
|
||||
chmod +x cloudflared
|
||||
```
|
||||
|
||||
2. **Останавливаем Docker версию:**
|
||||
```bash
|
||||
docker compose stop cloudflared
|
||||
```
|
||||
|
||||
3. **Обновляем конфигурацию для localhost:**
|
||||
```yaml
|
||||
# .cloudflared/config.yml
|
||||
ingress:
|
||||
- hostname: hb3-accelerator.com
|
||||
service: http://127.0.0.1:5173 # localhost вместо docker контейнеров
|
||||
- service: http_status:404
|
||||
```
|
||||
|
||||
4. **Запускаем на хосте:**
|
||||
```bash
|
||||
TUNNEL_TOKEN="eyJh..." ./cloudflared --protocol http2 tunnel run
|
||||
```
|
||||
|
||||
5. **Обновляем туннель через API:**
|
||||
```javascript
|
||||
// Применили конфигурацию с localhost через fix-tunnel.js
|
||||
{
|
||||
"config": {
|
||||
"ingress": [
|
||||
{"hostname": "hb3-accelerator.com", "service": "http://127.0.0.1:5173"},
|
||||
{"service": "http_status:404"}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Результаты тестирования:
|
||||
|
||||
**✅ Cloudflared на хосте:**
|
||||
- ✅ Процесс запущен без ошибок TLS timeout
|
||||
- ✅ Metrics доступны на `127.0.0.1:20241/metrics`
|
||||
- ✅ Стабильная работа через v2rayN прокси
|
||||
- ✅ Cloudflare tunnel version: 6 (конфигурация обновлена)
|
||||
|
||||
**✅ Сетевые проверки:**
|
||||
- ✅ `localhost:5173` - frontend отвечает HTTP/1.1 200 OK
|
||||
- ✅ `localhost:8000` - backend доступен
|
||||
- ✅ Domain `https://hb3-accelerator.com` - проходит через Cloudflare
|
||||
|
||||
**⚠️ Текущий статус домена:**
|
||||
- Домен отвечает HTTP/2 530 (может потребоваться время на распространение конфигурации)
|
||||
- Присутствует CF-Ray заголовок (трафик идет через Cloudflare)
|
||||
- Туннель активен и стабильно работает
|
||||
|
||||
### Вывод:
|
||||
🎯 **ПРОБЛЕМА РЕШЕНА** - cloudflared стабильно работает на хосте через v2rayN без каких-либо ошибок timeout.
|
||||
|
||||
**ОСНОВНАЯ ПРИЧИНА:** Docker networking в WSL2 не совместим с v2rayN прокси для cloudflared соединений.
|
||||
|
||||
**РЕКОМЕНДАЦИЯ:** Использовать cloudflared на хосте вместо Docker для максимальной стабильности.
|
||||
|
||||
## 9. Детальная диагностика host-based решения ✅
|
||||
|
||||
### 9.1. Обновление конфигурации туннеля для API поддомена
|
||||
**Проблема:** В ingress правилах отсутствовал маршрут для `api.hb3-accelerator.com`
|
||||
|
||||
**Исправление:**
|
||||
```javascript
|
||||
// fix-tunnel.js - обновленная конфигурация
|
||||
const data = JSON.stringify({
|
||||
config: {
|
||||
ingress: [
|
||||
{
|
||||
hostname: "hb3-accelerator.com",
|
||||
service: "http://127.0.0.1:5173"
|
||||
},
|
||||
{
|
||||
hostname: "api.hb3-accelerator.com",
|
||||
service: "http://127.0.0.1:8000"
|
||||
},
|
||||
{
|
||||
service: "http_status:404"
|
||||
}
|
||||
]
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"result": {
|
||||
"tunnel_id": "1fed7200-6590-450f-8914-71c3546ed09c",
|
||||
"version": 11,
|
||||
"config": {
|
||||
"ingress": [
|
||||
{"service": "http://127.0.0.1:5173", "hostname": "hb3-accelerator.com"},
|
||||
{"service": "http://127.0.0.1:8000", "hostname": "api.hb3-accelerator.com"},
|
||||
{"service": "http_status:404"}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
- ✅ Конфигурация обновлена до версии 11
|
||||
- ✅ Добавлен маршрут для API поддомена
|
||||
|
||||
### 9.2. Решение проблемы с credentials файлом
|
||||
**Проблема:** `tunnel credentials file not found`
|
||||
|
||||
**Ошибка в логах:**
|
||||
```
|
||||
2025-07-02T20:57:37Z ERR Cannot determine default origin certificate path. No file cert.pem in [~/.cloudflared ~/.cloudflare-warp ~/cloudflare-warp /etc/cloudflared /usr/local/etc/cloudflared]. You need to specify the origin certificate path by specifying the origincert option in the configuration file, or set TUNNEL_ORIGIN_CERT environment variable originCertPath=
|
||||
tunnel credentials file not found
|
||||
```
|
||||
|
||||
**Исправление:**
|
||||
```bash
|
||||
# Копирование конфигурации в домашнюю папку
|
||||
mkdir -p ~/.cloudflared
|
||||
cp .cloudflared/* ~/.cloudflared/
|
||||
|
||||
# Проверка
|
||||
ls -la ~/.cloudflared/
|
||||
# ✅ 1fed7200-6590-450f-8914-71c3546ed09c.json
|
||||
# ✅ config.yml
|
||||
```
|
||||
|
||||
**Результат:** ✅ Cloudflared успешно находит credentials файл
|
||||
|
||||
### 9.3. Детальные логи инициализации cloudflared
|
||||
**Успешный запуск после исправления credentials:**
|
||||
```
|
||||
2025-07-02T20:58:15Z DBG Loading configuration from /home/alex/.cloudflared/config.yml
|
||||
2025-07-02T20:58:15Z INF Starting tunnel tunnelID=1fed7200-6590-450f-8914-71c3546ed09c
|
||||
2025-07-02T20:58:15Z INF Version 2025.6.1 (Checksum 103ff020ffcc4ad6b542948b95ecff417150c70a17bff3a39ac2670b4159c9bb)
|
||||
2025-07-02T20:58:15Z INF GOOS: linux, GOVersion: go1.24.2, GoArch: amd64
|
||||
2025-07-02T20:58:15Z INF Generated Connector ID: 2268dabb-bbaf-45b2-b7aa-6178aa72b9f6
|
||||
2025-07-02T20:58:15Z DBG Fetched protocol: quic
|
||||
2025-07-02T20:58:15Z INF Initial protocol http2
|
||||
2025-07-02T20:58:15Z INF ICMP proxy will use 172.22.49.60 as source for IPv4
|
||||
2025-07-02T20:58:15Z INF ICMP proxy will use fe80::215:5dff:fee6:bf00 in zone eth0 as source for IPv6
|
||||
2025-07-02T20:58:15Z INF Starting metrics server on 127.0.0.1:20241/metrics
|
||||
2025-07-02T20:58:15Z INF You requested 4 HA connections but I can give you at most 2.
|
||||
```
|
||||
|
||||
**Анализ успешной инициализации:**
|
||||
- ✅ Конфигурация загружена из `~/.cloudflared/config.yml`
|
||||
- ✅ Версия cloudflared: 2025.6.1 (актуальная)
|
||||
- ✅ Протокол: HTTP/2 (переключен с QUIC)
|
||||
- ✅ IP адрес WSL2: 172.22.49.60
|
||||
- ✅ Metrics сервер запущен на 127.0.0.1:20241
|
||||
|
||||
### 9.4. Критичное открытие: TLS timeout без прокси
|
||||
**Тест cloudflared БЕЗ proxy переменных:**
|
||||
```bash
|
||||
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
|
||||
timeout 30 ./cloudflared --protocol http2 --loglevel debug tunnel run 1fed7200-6590-450f-8914-71c3546ed09c
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
```
|
||||
2025-07-02T21:01:31Z ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: read tcp 172.22.49.60:33538->198.41.192.227:7844: i/o timeout" connIndex=0 event=0 ip=198.41.192.227
|
||||
2025-07-02T21:01:31Z ERR Serve tunnel error error="TLS handshake with edge error: read tcp 172.22.49.60:33538->198.41.192.227:7844: i/o timeout" connIndex=0 event=0 ip=198.41.192.227
|
||||
```
|
||||
|
||||
**🚨 КРИТИЧНОЕ ОТКРЫТИЕ:**
|
||||
- ❌ Даже **БЕЗ proxy переменных** cloudflared получает TLS handshake timeout
|
||||
- ❌ Проблема **НЕ в v2rayN proxy** как изначально предполагалось
|
||||
- 🎯 **Реальная причина: WSL2 сетевая совместимость** с TLS handshake к Cloudflare edge серверам
|
||||
|
||||
### 9.5. Подтверждение доступности TCP портов
|
||||
**Прямая проверка TCP подключения:**
|
||||
```bash
|
||||
nc -w 5 -v 198.41.200.43 7844
|
||||
# ✅ Connection to 198.41.200.43 7844 port [tcp/*] succeeded!
|
||||
```
|
||||
|
||||
**Проверка через SOCKS5 proxy:**
|
||||
```bash
|
||||
curl --connect-timeout 10 -I --proxy socks5://172.22.48.1:10808 https://198.41.200.43:7844/
|
||||
# ❌ SSL certificate problem (ожидаемо для edge сервера)
|
||||
```
|
||||
|
||||
**Анализ:**
|
||||
- ✅ **TCP подключения к порту 7844 работают** - порты НЕ блокируются
|
||||
- ✅ **SOCKS5 proxy функционален** - v2rayN работает корректно
|
||||
- ❌ **TLS handshake timeout** происходит на уровне WSL2 networking
|
||||
|
||||
### 9.6. Проверка доступности origin сервисов
|
||||
**Frontend (127.0.0.1:5173):**
|
||||
```bash
|
||||
curl -I http://127.0.0.1:5173
|
||||
# ✅ HTTP/1.1 200 OK
|
||||
# ✅ Content-Type: text/html
|
||||
```
|
||||
|
||||
**Backend (127.0.0.1:8000):**
|
||||
```bash
|
||||
curl -I http://127.0.0.1:8000
|
||||
# ✅ HTTP/1.1 404 Not Found (нормально для корневого пути)
|
||||
# ✅ Cookie установлен корректно
|
||||
```
|
||||
|
||||
**Проверка через WSL2 IP:**
|
||||
```bash
|
||||
curl -I http://172.22.49.60:5173
|
||||
# ❌ HTTP/1.1 503 Service Unavailable (идет через proxy)
|
||||
# ❌ Proxy-Connection: close (v2rayN обрабатывает запросы к WSL2 IP)
|
||||
```
|
||||
|
||||
**Исправление NO_PROXY:**
|
||||
```bash
|
||||
# Обновленные переменные окружения в start-cloudflared-final.sh
|
||||
export NO_PROXY="localhost,127.0.0.1,0.0.0.0,::1,172.22.49.60"
|
||||
```
|
||||
|
||||
### 9.7. Тестирование домена после обновления конфигурации
|
||||
**Основной домен:**
|
||||
```bash
|
||||
curl -I https://hb3-accelerator.com
|
||||
# HTTP/2 530 - origin connection error (туннель работает, но origin недоступен)
|
||||
# server: cloudflare - трафик проходит через Cloudflare
|
||||
# cf-ray: 959108e9ca1bc630-MXP - запрос обработан edge сервером
|
||||
```
|
||||
|
||||
**API поддомен:**
|
||||
```bash
|
||||
curl -I https://api.hb3-accelerator.com
|
||||
# curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL - SSL ошибка подключения
|
||||
```
|
||||
|
||||
**Анализ результатов:**
|
||||
- ✅ **Cloudflare принимает запросы** - DNS и routing работают
|
||||
- ❌ **HTTP 530 origin error** - туннель не может подключиться к localhost origin
|
||||
- ❌ **SSL error для API поддомена** - возможно, DNS не распространился
|
||||
|
||||
### 9.8. Финальная диагностика: WSL2 vs Host networking
|
||||
|
||||
**Выводы по тестированию:**
|
||||
1. **❌ DPI/Firewall НЕ блокирует** - TCP подключения к порту 7844 успешны
|
||||
2. **❌ v2rayN proxy НЕ причина** - timeout происходит даже без proxy переменных
|
||||
3. **❌ Конфигурация туннеля НЕ проблема** - все настройки корректны
|
||||
4. **✅ WSL2 networking incompatibility** - TLS handshake не работает только в WSL2
|
||||
|
||||
**🎯 ОСНОВНАЯ ПРИЧИНА:**
|
||||
**WSL2 сетевое окружение несовместимо с Cloudflare edge TLS handshake протоколом.** Проблема НЕ в proxy, блокировках или конфигурации.
|
||||
|
||||
**✅ РЕКОМЕНДУЕМОЕ РЕШЕНИЕ:**
|
||||
Запуск cloudflared на **Windows хосте** или **внешнем VPS**, где сетевое окружение полностью совместимо с Cloudflare edge серверами.
|
||||
|
||||
**Альтернативные решения:**
|
||||
1. **Windows хост cloudflared** - максимальная совместимость
|
||||
2. **External VPS** - cloudflared на DigitalOcean/AWS
|
||||
3. **Alternative tunneling** - Tailscale, WireGuard, ngrok
|
||||
4. **MTU optimization** - попытка исправить пакеты в WSL2
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"papaparse": "^5.5.3"
|
||||
}
|
||||
},
|
||||
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
||||
}
|
||||
|
||||
247
scripts/README.md
Normal file
247
scripts/README.md
Normal file
@@ -0,0 +1,247 @@
|
||||
# Скрипты миграции приложения
|
||||
|
||||
Этот набор скриптов позволяет полностью перенести приложение с базами данных между различными провайдерами.
|
||||
|
||||
## Файлы
|
||||
|
||||
- `migrate-app.sh` - Основной скрипт миграции приложения
|
||||
- `update-dns.sh` - Скрипт обновления DNS записей
|
||||
- `README.md` - Эта инструкция
|
||||
|
||||
## Что мигрируется
|
||||
|
||||
Скрипт переносит **всё приложение**:
|
||||
|
||||
### ✅ **Контейнеры:**
|
||||
- Frontend (Vue.js)
|
||||
- Backend (Node.js)
|
||||
- PostgreSQL (база данных)
|
||||
- Ollama (AI модели)
|
||||
- Vector Search
|
||||
|
||||
### ✅ **Данные:**
|
||||
- PostgreSQL база данных (полный дамп)
|
||||
- Ollama модели (список для восстановления)
|
||||
- Переменные окружения
|
||||
- Конфигурационные файлы
|
||||
|
||||
### ❌ **Исключается:**
|
||||
- `node_modules/` (пересобирается)
|
||||
- `.git/` (не нужен на продакшене)
|
||||
- `*.log` (логи)
|
||||
- `temp/` (временные файлы)
|
||||
- `sessions/` (сессии)
|
||||
|
||||
## Требования
|
||||
|
||||
### На исходном сервере:
|
||||
- Docker и Docker Compose
|
||||
- SSH доступ
|
||||
- Достаточно места для бэкапа
|
||||
|
||||
### На целевом сервере:
|
||||
- Docker и Docker Compose
|
||||
- SSH доступ
|
||||
- Достаточно места для приложения
|
||||
|
||||
### На локальной машине:
|
||||
- SSH ключи настроены для обоих серверов
|
||||
- `dig` (для проверки DNS)
|
||||
- `curl` (для API запросов)
|
||||
- `jq` (для работы с JSON)
|
||||
|
||||
## Использование
|
||||
|
||||
### 1. Миграция приложения
|
||||
|
||||
```bash
|
||||
# Сделать скрипт исполняемым
|
||||
chmod +x scripts/migrate-app.sh
|
||||
|
||||
# Запустить миграцию
|
||||
./scripts/migrate-app.sh source-server target-server app-path
|
||||
```
|
||||
|
||||
**Пример:**
|
||||
```bash
|
||||
./scripts/migrate-app.sh user@hostland-server.com user@aws-server.com /home/user/dapp
|
||||
```
|
||||
|
||||
### 2. Обновление DNS записей
|
||||
|
||||
```bash
|
||||
# Сделать скрипт исполняемым
|
||||
chmod +x scripts/update-dns.sh
|
||||
|
||||
# Запустить обновление DNS
|
||||
./scripts/update-dns.sh domain new-server-ip
|
||||
```
|
||||
|
||||
**Пример:**
|
||||
```bash
|
||||
./scripts/update-dns.sh mydapp.site 123.456.789.10
|
||||
```
|
||||
|
||||
## Автоматическое обновление DNS
|
||||
|
||||
Скрипт поддерживает автоматическое обновление DNS через API:
|
||||
|
||||
### Cloudflare
|
||||
```bash
|
||||
export CLOUDFLARE_API_TOKEN="your-api-token"
|
||||
./scripts/update-dns.sh mydapp.site 123.456.789.10
|
||||
```
|
||||
|
||||
### GoDaddy
|
||||
```bash
|
||||
export GODADDY_API_KEY="your-api-key"
|
||||
export GODADDY_API_SECRET="your-api-secret"
|
||||
./scripts/update-dns.sh mydapp.site 123.456.789.10
|
||||
```
|
||||
|
||||
### Namecheap
|
||||
```bash
|
||||
export NAMECHEAP_API_USER="your-username"
|
||||
export NAMECHEAP_API_KEY="your-api-key"
|
||||
./scripts/update-dns.sh mydapp.site 123.456.789.10
|
||||
```
|
||||
|
||||
## Процесс миграции
|
||||
|
||||
### 1. Подготовка
|
||||
- Проверка подключений к серверам
|
||||
- Проверка установки Docker
|
||||
- Создание временных файлов
|
||||
|
||||
### 2. Создание бэкапа
|
||||
- Остановка приложения
|
||||
- Создание дампа PostgreSQL
|
||||
- Сохранение списка Ollama моделей
|
||||
- Создание полного архива
|
||||
|
||||
### 3. Восстановление
|
||||
- Копирование архива на целевой сервер
|
||||
- Распаковка файлов
|
||||
- Восстановление PostgreSQL
|
||||
- Восстановление Ollama моделей
|
||||
- Запуск приложения
|
||||
|
||||
### 4. Проверка
|
||||
- Проверка статуса контейнеров
|
||||
- Проверка логов
|
||||
- Проверка доступности портов
|
||||
- Очистка временных файлов
|
||||
|
||||
## Примеры использования
|
||||
|
||||
### Миграция с Hostland на AWS
|
||||
|
||||
```bash
|
||||
# 1. Мигрируем приложение
|
||||
./scripts/migrate-app.sh user@hostland.com ec2-user@aws-server.com /home/ec2-user/dapp
|
||||
|
||||
# 2. Получаем новый IP
|
||||
NEW_IP=$(ssh ec2-user@aws-server.com "curl -s ifconfig.me")
|
||||
|
||||
# 3. Обновляем DNS
|
||||
./scripts/update-dns.sh mydapp.site $NEW_IP
|
||||
```
|
||||
|
||||
### Миграция с AWS на DigitalOcean
|
||||
|
||||
```bash
|
||||
# 1. Мигрируем приложение
|
||||
./scripts/migrate-app.sh ec2-user@aws-server.com root@digitalocean.com /root/dapp
|
||||
|
||||
# 2. Получаем новый IP
|
||||
NEW_IP=$(ssh root@digitalocean.com "curl -s ifconfig.me")
|
||||
|
||||
# 3. Обновляем DNS
|
||||
./scripts/update-dns.sh mydapp.site $NEW_IP
|
||||
```
|
||||
|
||||
## Мониторинг процесса
|
||||
|
||||
Скрипты выводят подробную информацию о процессе:
|
||||
|
||||
- `[INFO]` - Информационные сообщения
|
||||
- `[SUCCESS]` - Успешные операции
|
||||
- `[WARNING]` - Предупреждения
|
||||
- `[ERROR]` - Ошибки
|
||||
|
||||
## Устранение неполадок
|
||||
|
||||
### Ошибка подключения SSH
|
||||
```bash
|
||||
# Проверьте SSH ключи
|
||||
ssh -T user@server.com
|
||||
|
||||
# Добавьте ключ в ssh-agent
|
||||
ssh-add ~/.ssh/id_rsa
|
||||
```
|
||||
|
||||
### Ошибка Docker
|
||||
```bash
|
||||
# Установите Docker на сервере
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
sudo usermod -aG docker $USER
|
||||
```
|
||||
|
||||
### Ошибка DNS
|
||||
```bash
|
||||
# Проверьте DNS записи
|
||||
dig mydapp.site
|
||||
|
||||
# Обновите вручную в панели управления доменом
|
||||
```
|
||||
|
||||
### Ошибка восстановления PostgreSQL
|
||||
```bash
|
||||
# Проверьте логи PostgreSQL
|
||||
docker compose logs postgres
|
||||
|
||||
# Создайте базу вручную
|
||||
docker compose exec postgres createdb -U dapp_user dapp_db
|
||||
```
|
||||
|
||||
## Безопасность
|
||||
|
||||
### SSH ключи
|
||||
- Используйте SSH ключи вместо паролей
|
||||
- Ограничьте доступ к серверам
|
||||
- Регулярно обновляйте ключи
|
||||
|
||||
### API ключи
|
||||
- Храните API ключи в переменных окружения
|
||||
- Не коммитьте ключи в репозиторий
|
||||
- Используйте минимальные права доступа
|
||||
|
||||
### Данные
|
||||
- Бэкапы содержат чувствительные данные
|
||||
- Удаляйте временные файлы после миграции
|
||||
- Шифруйте бэкапы при необходимости
|
||||
|
||||
## Резервное копирование
|
||||
|
||||
Рекомендуется создавать резервные копии перед миграцией:
|
||||
|
||||
```bash
|
||||
# Создать бэкап вручную
|
||||
cd /path/to/app
|
||||
docker compose down
|
||||
tar -czf backup-$(date +%Y%m%d).tar.gz .
|
||||
```
|
||||
|
||||
## Поддержка
|
||||
|
||||
При возникновении проблем:
|
||||
|
||||
1. Проверьте логи скриптов
|
||||
2. Проверьте статус контейнеров
|
||||
3. Проверьте подключения к серверам
|
||||
4. Проверьте DNS записи
|
||||
5. Обратитесь к документации провайдера
|
||||
|
||||
## Лицензия
|
||||
|
||||
Эти скрипты распространяются под MIT лицензией.
|
||||
245
scripts/migrate-app.sh
Executable file
245
scripts/migrate-app.sh
Executable file
@@ -0,0 +1,245 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт для полной миграции приложения между провайдерами
|
||||
# Использование: ./migrate-app.sh source-server target-server app-path
|
||||
|
||||
set -e # Остановка при ошибке
|
||||
|
||||
# Цвета для вывода
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Функции для логирования
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# Проверка аргументов
|
||||
if [ $# -ne 3 ]; then
|
||||
echo "Использование: $0 <source-server> <target-server> <app-path>"
|
||||
echo "Пример: $0 user@hostland-server.com user@aws-server.com /home/user/dapp"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SOURCE_SERVER=$1
|
||||
TARGET_SERVER=$2
|
||||
APP_PATH=$3
|
||||
BACKUP_NAME="app-migration-$(date +%Y%m%d-%H%M%S)"
|
||||
|
||||
log_info "Начинаем миграцию приложения"
|
||||
log_info "Источник: $SOURCE_SERVER:$APP_PATH"
|
||||
log_info "Цель: $TARGET_SERVER:$APP_PATH"
|
||||
log_info "Резервная копия: $BACKUP_NAME"
|
||||
|
||||
# Функция для проверки подключения к серверу
|
||||
check_connection() {
|
||||
local server=$1
|
||||
log_info "Проверяем подключение к $server..."
|
||||
if ! ssh -o ConnectTimeout=10 -o BatchMode=yes "$server" "echo 'Connection OK'" 2>/dev/null; then
|
||||
log_error "Не удалось подключиться к $server"
|
||||
log_error "Убедитесь, что SSH ключи настроены правильно"
|
||||
exit 1
|
||||
fi
|
||||
log_success "Подключение к $server установлено"
|
||||
}
|
||||
|
||||
# Функция для проверки Docker на сервере
|
||||
check_docker() {
|
||||
local server=$1
|
||||
log_info "Проверяем Docker на $server..."
|
||||
if ! ssh "$server" "docker --version" >/dev/null 2>&1; then
|
||||
log_error "Docker не установлен на $server"
|
||||
log_error "Установите Docker: curl -fsSL https://get.docker.com | sh"
|
||||
exit 1
|
||||
fi
|
||||
log_success "Docker установлен на $server"
|
||||
}
|
||||
|
||||
# Функция для создания полного бэкапа
|
||||
create_backup() {
|
||||
local server=$1
|
||||
local path=$2
|
||||
local backup_name=$3
|
||||
|
||||
log_info "Создаём полный бэкап на $server..."
|
||||
|
||||
# Останавливаем приложение
|
||||
log_info "Останавливаем приложение..."
|
||||
ssh "$server" "cd $path && docker compose down" || log_warning "Приложение уже остановлено"
|
||||
|
||||
# Создаём бэкап базы данных
|
||||
log_info "Создаём бэкап PostgreSQL..."
|
||||
ssh "$server" "cd $path && docker compose up -d postgres" || true
|
||||
sleep 5 # Ждём запуска PostgreSQL
|
||||
|
||||
# Бэкап PostgreSQL
|
||||
ssh "$server" "cd $path && docker compose exec -T postgres pg_dump -U dapp_user dapp_db > postgres-backup.sql" || {
|
||||
log_warning "Не удалось создать бэкап PostgreSQL, продолжаем без него"
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Бэкап Ollama моделей
|
||||
log_info "Создаём бэкап Ollama моделей..."
|
||||
ssh "$server" "cd $path && docker compose exec -T ollama ollama list > ollama-models.txt" || log_warning "Ollama не найден"
|
||||
|
||||
# Создаём полный архив
|
||||
log_info "Создаём полный архив приложения..."
|
||||
ssh "$server" "cd $path && tar -czf $backup_name.tar.gz \
|
||||
. \
|
||||
postgres-backup.sql \
|
||||
ollama-models.txt \
|
||||
--exclude='node_modules' \
|
||||
--exclude='.git' \
|
||||
--exclude='*.log' \
|
||||
--exclude='temp' \
|
||||
--exclude='sessions'"
|
||||
|
||||
log_success "Бэкап создан: $backup_name.tar.gz"
|
||||
}
|
||||
|
||||
# Функция для восстановления на целевом сервере
|
||||
restore_backup() {
|
||||
local server=$1
|
||||
local path=$2
|
||||
local backup_name=$3
|
||||
|
||||
log_info "Восстанавливаем приложение на $server..."
|
||||
|
||||
# Создаём директорию если не существует
|
||||
ssh "$server" "mkdir -p $path"
|
||||
|
||||
# Копируем архив
|
||||
log_info "Копируем архив на целевой сервер..."
|
||||
scp "$SOURCE_SERVER:$APP_PATH/$backup_name.tar.gz" "$server:/tmp/"
|
||||
|
||||
# Распаковываем
|
||||
log_info "Распаковываем архив..."
|
||||
ssh "$server" "cd $path && tar -xzf /tmp/$backup_name.tar.gz"
|
||||
|
||||
# Восстанавливаем PostgreSQL
|
||||
if ssh "$server" "test -f $path/postgres-backup.sql"; then
|
||||
log_info "Восстанавливаем PostgreSQL..."
|
||||
ssh "$server" "cd $path && docker compose up -d postgres"
|
||||
sleep 10 # Ждём запуска PostgreSQL
|
||||
ssh "$server" "cd $path && docker compose exec -T postgres psql -U dapp_user -d dapp_db < postgres-backup.sql" || {
|
||||
log_warning "Не удалось восстановить PostgreSQL, создаём новую БД"
|
||||
ssh "$server" "cd $path && docker compose exec -T postgres createdb -U dapp_user dapp_db 2>/dev/null || true"
|
||||
}
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Восстанавливаем Ollama модели
|
||||
if ssh "$server" "test -f $path/ollama-models.txt"; then
|
||||
log_info "Восстанавливаем Ollama модели..."
|
||||
ssh "$server" "cd $path && docker compose up -d ollama"
|
||||
sleep 10 # Ждём запуска Ollama
|
||||
ssh "$server" "cd $path && cat ollama-models.txt | grep -v 'NAME' | awk '{print \$1}' | xargs -I {} docker compose exec -T ollama ollama pull {}" || {
|
||||
log_warning "Не удалось восстановить все Ollama модели"
|
||||
}
|
||||
fi
|
||||
|
||||
# Запускаем приложение
|
||||
log_info "Запускаем приложение..."
|
||||
ssh "$server" "cd $path && docker compose up -d"
|
||||
|
||||
log_success "Приложение восстановлено на $server"
|
||||
}
|
||||
|
||||
# Функция для проверки статуса приложения
|
||||
check_app_status() {
|
||||
local server=$1
|
||||
local path=$2
|
||||
|
||||
log_info "Проверяем статус приложения на $server..."
|
||||
|
||||
# Проверяем контейнеры
|
||||
ssh "$server" "cd $path && docker compose ps"
|
||||
|
||||
# Проверяем логи
|
||||
log_info "Последние логи приложения:"
|
||||
ssh "$server" "cd $path && docker compose logs --tail=20"
|
||||
|
||||
# Проверяем доступность сервисов
|
||||
log_info "Проверяем доступность сервисов..."
|
||||
|
||||
# Получаем IP сервера
|
||||
SERVER_IP=$(ssh "$server" "curl -s ifconfig.me")
|
||||
|
||||
# Проверяем порты
|
||||
for port in 80 443 8000 5173; do
|
||||
if ssh "$server" "netstat -tlnp | grep :$port" >/dev/null 2>&1; then
|
||||
log_success "Порт $port доступен"
|
||||
else
|
||||
log_warning "Порт $port недоступен"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Функция для очистки временных файлов
|
||||
cleanup() {
|
||||
local server=$1
|
||||
local backup_name=$2
|
||||
|
||||
log_info "Очищаем временные файлы..."
|
||||
ssh "$server" "rm -f $APP_PATH/$backup_name.tar.gz"
|
||||
ssh "$server" "rm -f $APP_PATH/postgres-backup.sql"
|
||||
ssh "$server" "rm -f $APP_PATH/ollama-models.txt"
|
||||
ssh "$server" "rm -f /tmp/$backup_name.tar.gz"
|
||||
}
|
||||
|
||||
# Основной процесс миграции
|
||||
main() {
|
||||
log_info "=== НАЧАЛО МИГРАЦИИ ПРИЛОЖЕНИЯ ==="
|
||||
|
||||
# Проверяем подключения
|
||||
check_connection "$SOURCE_SERVER"
|
||||
check_connection "$TARGET_SERVER"
|
||||
|
||||
# Проверяем Docker
|
||||
check_docker "$SOURCE_SERVER"
|
||||
check_docker "$TARGET_SERVER"
|
||||
|
||||
# Создаём бэкап на исходном сервере
|
||||
create_backup "$SOURCE_SERVER" "$APP_PATH" "$BACKUP_NAME"
|
||||
|
||||
# Восстанавливаем на целевом сервере
|
||||
restore_backup "$TARGET_SERVER" "$APP_PATH" "$BACKUP_NAME"
|
||||
|
||||
# Проверяем статус
|
||||
check_app_status "$TARGET_SERVER" "$APP_PATH"
|
||||
|
||||
# Очищаем временные файлы
|
||||
cleanup "$SOURCE_SERVER" "$BACKUP_NAME"
|
||||
cleanup "$TARGET_SERVER" "$BACKUP_NAME"
|
||||
|
||||
log_success "=== МИГРАЦИЯ ЗАВЕРШЕНА УСПЕШНО ==="
|
||||
log_info "Приложение перенесено с $SOURCE_SERVER на $TARGET_SERVER"
|
||||
log_info "Не забудьте обновить DNS записи на новый IP сервера"
|
||||
|
||||
# Показываем новый IP
|
||||
NEW_IP=$(ssh "$TARGET_SERVER" "curl -s ifconfig.me")
|
||||
log_info "Новый IP сервера: $NEW_IP"
|
||||
}
|
||||
|
||||
# Обработка ошибок
|
||||
trap 'log_error "Миграция прервана из-за ошибки"; exit 1' ERR
|
||||
|
||||
# Запуск основной функции
|
||||
main "$@"
|
||||
250
scripts/update-dns.sh
Executable file
250
scripts/update-dns.sh
Executable file
@@ -0,0 +1,250 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт для обновления DNS записей после миграции
|
||||
# Использование: ./update-dns.sh domain new-server-ip
|
||||
|
||||
set -e
|
||||
|
||||
# Цвета для вывода
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# Проверка аргументов
|
||||
if [ $# -ne 2 ]; then
|
||||
echo "Использование: $0 <domain> <new-server-ip>"
|
||||
echo "Пример: $0 mydapp.site 123.456.789.10"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DOMAIN=$1
|
||||
NEW_IP=$2
|
||||
|
||||
log_info "Обновляем DNS записи для домена $DOMAIN на IP $NEW_IP"
|
||||
|
||||
# Функция для проверки DNS
|
||||
check_dns() {
|
||||
local domain=$1
|
||||
local expected_ip=$2
|
||||
|
||||
log_info "Проверяем DNS записи для $domain..."
|
||||
|
||||
# Получаем A запись
|
||||
local dns_ip=$(dig +short A "$domain" | head -1)
|
||||
|
||||
if [ "$dns_ip" = "$expected_ip" ]; then
|
||||
log_success "DNS A запись корректна: $domain -> $dns_ip"
|
||||
return 0
|
||||
else
|
||||
log_warning "DNS A запись не совпадает: ожидается $expected_ip, получено $dns_ip"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Функция для проверки доступности сайта
|
||||
check_site_availability() {
|
||||
local domain=$1
|
||||
local max_attempts=30
|
||||
local attempt=1
|
||||
|
||||
log_info "Проверяем доступность сайта $domain..."
|
||||
|
||||
while [ $attempt -le $max_attempts ]; do
|
||||
if curl -s --max-time 10 "https://$domain" >/dev/null 2>&1; then
|
||||
log_success "Сайт $domain доступен!"
|
||||
return 0
|
||||
else
|
||||
log_info "Попытка $attempt/$max_attempts: сайт пока недоступен..."
|
||||
sleep 10
|
||||
attempt=$((attempt + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
log_error "Сайт $domain недоступен после $max_attempts попыток"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Функция для автоматического обновления DNS через API
|
||||
update_dns_api() {
|
||||
local domain=$1
|
||||
local new_ip=$2
|
||||
|
||||
log_info "Пытаемся автоматически обновить DNS через API..."
|
||||
|
||||
# Проверяем различные DNS провайдеров
|
||||
if [ -n "$CLOUDFLARE_API_TOKEN" ]; then
|
||||
log_info "Пробуем Cloudflare API..."
|
||||
update_cloudflare_dns "$domain" "$new_ip"
|
||||
elif [ -n "$GODADDY_API_KEY" ]; then
|
||||
log_info "Пробуем GoDaddy API..."
|
||||
update_godaddy_dns "$domain" "$new_ip"
|
||||
elif [ -n "$NAMECHEAP_API_KEY" ]; then
|
||||
log_info "Пробуем Namecheap API..."
|
||||
update_namecheap_dns "$domain" "$new_ip"
|
||||
else
|
||||
log_warning "API ключи не настроены, требуется ручное обновление DNS"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Функция для обновления DNS через Cloudflare API
|
||||
update_cloudflare_dns() {
|
||||
local domain=$1
|
||||
local new_ip=$2
|
||||
|
||||
# Получаем zone ID
|
||||
local zone_id=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
|
||||
"https://api.cloudflare.com/client/v4/zones?name=$domain" | \
|
||||
jq -r '.result[0].id')
|
||||
|
||||
if [ "$zone_id" = "null" ]; then
|
||||
log_error "Не удалось найти zone ID для домена $domain"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Получаем record ID для A записи
|
||||
local record_id=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
|
||||
"https://api.cloudflare.com/client/v4/zones/$zone_id/dns_records?type=A&name=$domain" | \
|
||||
jq -r '.result[0].id')
|
||||
|
||||
if [ "$record_id" = "null" ]; then
|
||||
log_error "Не удалось найти A запись для домена $domain"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Обновляем A запись
|
||||
local response=$(curl -s -X PUT \
|
||||
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"type\":\"A\",\"name\":\"$domain\",\"content\":\"$new_ip\",\"ttl\":1}" \
|
||||
"https://api.cloudflare.com/client/v4/zones/$zone_id/dns_records/$record_id")
|
||||
|
||||
if echo "$response" | jq -e '.success' >/dev/null; then
|
||||
log_success "DNS обновлён через Cloudflare API"
|
||||
return 0
|
||||
else
|
||||
log_error "Ошибка обновления DNS через Cloudflare API"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Функция для обновления DNS через GoDaddy API
|
||||
update_godaddy_dns() {
|
||||
local domain=$1
|
||||
local new_ip=$2
|
||||
|
||||
local response=$(curl -s -X PUT \
|
||||
-H "Authorization: sso-key $GODADDY_API_KEY:$GODADDY_API_SECRET" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "[{\"data\":\"$new_ip\",\"ttl\":600}]" \
|
||||
"https://api.godaddy.com/v1/domains/$domain/records/A/@")
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
log_success "DNS обновлён через GoDaddy API"
|
||||
return 0
|
||||
else
|
||||
log_error "Ошибка обновления DNS через GoDaddy API"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Функция для обновления DNS через Namecheap API
|
||||
update_namecheap_dns() {
|
||||
local domain=$1
|
||||
local new_ip=$2
|
||||
|
||||
local response=$(curl -s "https://api.sandbox.namecheap.com/xml.response" \
|
||||
-d "ApiUser=$NAMECHEAP_API_USER" \
|
||||
-d "ApiKey=$NAMECHEAP_API_KEY" \
|
||||
-d "UserName=$NAMECHEAP_API_USER" \
|
||||
-d "Command=namecheap.domains.dns.setHosts" \
|
||||
-d "ClientIp=$new_ip" \
|
||||
-d "SLD=$(echo $domain | cut -d. -f1)" \
|
||||
-d "TLD=$(echo $domain | cut -d. -f2)" \
|
||||
-d "HostName1=@" \
|
||||
-d "RecordType1=A" \
|
||||
-d "Address1=$new_ip" \
|
||||
-d "TTL1=600")
|
||||
|
||||
if echo "$response" | grep -q "Status=\"OK\""; then
|
||||
log_success "DNS обновлён через Namecheap API"
|
||||
return 0
|
||||
else
|
||||
log_error "Ошибка обновления DNS через Namecheap API"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Основная функция
|
||||
main() {
|
||||
log_info "=== ОБНОВЛЕНИЕ DNS ЗАПИСЕЙ ==="
|
||||
|
||||
# Пытаемся автоматически обновить DNS
|
||||
if update_dns_api "$DOMAIN" "$NEW_IP"; then
|
||||
log_success "DNS обновлён автоматически"
|
||||
else
|
||||
log_warning "Автоматическое обновление не удалось"
|
||||
log_info "Требуется ручное обновление DNS записей"
|
||||
log_info "Домен: $DOMAIN"
|
||||
log_info "Новый IP: $NEW_IP"
|
||||
log_info "Тип записи: A"
|
||||
log_info "TTL: 600 (или минимальное значение)"
|
||||
fi
|
||||
|
||||
# Ждём обновления DNS
|
||||
log_info "Ждём обновления DNS записей (может занять до 30 минут)..."
|
||||
|
||||
local max_wait=30
|
||||
local wait_count=0
|
||||
|
||||
while [ $wait_count -lt $max_wait ]; do
|
||||
if check_dns "$DOMAIN" "$NEW_IP"; then
|
||||
log_success "DNS записи обновлены!"
|
||||
break
|
||||
else
|
||||
log_info "Ожидание... ($((wait_count + 1))/$max_wait)"
|
||||
sleep 60
|
||||
wait_count=$((wait_count + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $wait_count -ge $max_wait ]; then
|
||||
log_warning "DNS записи не обновились в течение 30 минут"
|
||||
log_info "Проверьте настройки DNS в панели управления доменом"
|
||||
fi
|
||||
|
||||
# Проверяем доступность сайта
|
||||
if check_site_availability "$DOMAIN"; then
|
||||
log_success "=== САЙТ УСПЕШНО МИГРИРОВАН ==="
|
||||
log_info "Домен: $DOMAIN"
|
||||
log_info "IP: $NEW_IP"
|
||||
log_info "Статус: Доступен"
|
||||
else
|
||||
log_error "Сайт недоступен после миграции"
|
||||
log_info "Проверьте:"
|
||||
log_info "1. DNS записи обновлены"
|
||||
log_info "2. Приложение запущено на новом сервере"
|
||||
log_info "3. Файрволы настроены правильно"
|
||||
fi
|
||||
}
|
||||
|
||||
# Запуск основной функции
|
||||
main "$@"
|
||||
850
yarn.lock
850
yarn.lock
@@ -2,7 +2,857 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@chainsafe/is-ip@^2.0.1":
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@chainsafe/is-ip/-/is-ip-2.1.0.tgz#ba9ac32acd9027698e0b56b91c7af069d28d7931"
|
||||
integrity sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==
|
||||
|
||||
"@chainsafe/netmask@^2.0.0":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@chainsafe/netmask/-/netmask-2.0.0.tgz#0d4a75f47919f65011da4327a3845c9661f1038a"
|
||||
integrity sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==
|
||||
dependencies:
|
||||
"@chainsafe/is-ip" "^2.0.1"
|
||||
|
||||
"@fastify/busboy@^2.0.0":
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d"
|
||||
integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==
|
||||
|
||||
"@ipld/dag-cbor@^9.0.0":
|
||||
version "9.2.4"
|
||||
resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-9.2.4.tgz#64aba7060836af081debe87610cd1c915997ba6a"
|
||||
integrity sha512-GbDWYl2fdJgkYtIJN0HY9oO0o50d1nB4EQb7uYWKUd2ztxCjxiEW3PjwGG0nqUpN1G4Cug6LX8NzbA7fKT+zfA==
|
||||
dependencies:
|
||||
cborg "^4.0.0"
|
||||
multiformats "^13.1.0"
|
||||
|
||||
"@ipld/dag-json@^10.0.0":
|
||||
version "10.2.5"
|
||||
resolved "https://registry.yarnpkg.com/@ipld/dag-json/-/dag-json-10.2.5.tgz#a17e1c10ba58ea5bf43b6c7de8b73bb6461f6654"
|
||||
integrity sha512-Q4Fr3IBDEN8gkpgNefynJ4U/ZO5Kwr7WSUMBDbZx0c37t0+IwQCTM9yJh8l5L4SRFjm31MuHwniZ/kM+P7GQ3Q==
|
||||
dependencies:
|
||||
cborg "^4.0.0"
|
||||
multiformats "^13.1.0"
|
||||
|
||||
"@ipld/dag-pb@^4.0.0":
|
||||
version "4.1.5"
|
||||
resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-4.1.5.tgz#e3bdf11995e038877a737e3684d2382e481b60df"
|
||||
integrity sha512-w4PZ2yPqvNmlAir7/2hsCRMqny1EY5jj26iZcSgxREJexmbAc2FI21jp26MqiNdfgAxvkCnf2N/TJI18GaDNwA==
|
||||
dependencies:
|
||||
multiformats "^13.1.0"
|
||||
|
||||
"@leichtgewicht/ip-codec@^2.0.1":
|
||||
version "2.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1"
|
||||
integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==
|
||||
|
||||
"@libp2p/interface-connection@^4.0.0":
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@libp2p/interface-connection/-/interface-connection-4.0.0.tgz#fcc830ca891820fac89a4c6bd4fcc2df4874f49b"
|
||||
integrity sha512-6xx/NmEc84HX7QmsjSC3hHredQYjHv4Dkf4G27adAPf+qN+vnPxmQ7gaTnk243a0++DOFTbZ2gKX/15G2B6SRg==
|
||||
dependencies:
|
||||
"@libp2p/interface-peer-id" "^2.0.0"
|
||||
"@libp2p/interfaces" "^3.0.0"
|
||||
"@multiformats/multiaddr" "^12.0.0"
|
||||
it-stream-types "^1.0.4"
|
||||
uint8arraylist "^2.1.2"
|
||||
|
||||
"@libp2p/interface-keychain@^2.0.0":
|
||||
version "2.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@libp2p/interface-keychain/-/interface-keychain-2.0.5.tgz#6ce104f38cf07ad72c9dfbe471a689f4ea4b4687"
|
||||
integrity sha512-mb7QNgn9fIvC7CaJCi06GJ+a6DN6RVT9TmEi0NmedZGATeCArPeWWG7r7IfxNVXb9cVOOE1RzV1swK0ZxEJF9Q==
|
||||
dependencies:
|
||||
"@libp2p/interface-peer-id" "^2.0.0"
|
||||
multiformats "^11.0.0"
|
||||
|
||||
"@libp2p/interface-peer-id@^2.0.0", "@libp2p/interface-peer-id@^2.0.2":
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-id/-/interface-peer-id-2.0.2.tgz#6302e70b6fc17c451bc3daa11447d059357bcc32"
|
||||
integrity sha512-9pZp9zhTDoVwzRmp0Wtxw0Yfa//Yc0GqBCJi3EznBDE6HGIAVvppR91wSh2knt/0eYg0AQj7Y35VSesUTzMCUg==
|
||||
dependencies:
|
||||
multiformats "^11.0.0"
|
||||
|
||||
"@libp2p/interface-peer-info@^1.0.2":
|
||||
version "1.0.10"
|
||||
resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-info/-/interface-peer-info-1.0.10.tgz#566026de95a0817b9e853c982b313541b7960c0b"
|
||||
integrity sha512-HQlo8NwQjMyamCHJrnILEZz+YwEOXCB2sIIw3slIrhVUYeYlTaia1R6d9umaAeLHa255Zmdm4qGH8rJLRqhCcg==
|
||||
dependencies:
|
||||
"@libp2p/interface-peer-id" "^2.0.0"
|
||||
"@multiformats/multiaddr" "^12.0.0"
|
||||
|
||||
"@libp2p/interface-pubsub@^3.0.0":
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/@libp2p/interface-pubsub/-/interface-pubsub-3.0.7.tgz#cc1c7c47c883daddd2b84d83d719b3826943be3b"
|
||||
integrity sha512-+c74EVUBTfw2sx1GE/z/IjsYO6dhur+ukF0knAppeZsRQ1Kgg6K5R3eECtT28fC6dBWLjFpAvW/7QGfiDAL4RA==
|
||||
dependencies:
|
||||
"@libp2p/interface-connection" "^4.0.0"
|
||||
"@libp2p/interface-peer-id" "^2.0.0"
|
||||
"@libp2p/interfaces" "^3.0.0"
|
||||
it-pushable "^3.0.0"
|
||||
uint8arraylist "^2.1.2"
|
||||
|
||||
"@libp2p/interfaces@^3.0.0", "@libp2p/interfaces@^3.2.0":
|
||||
version "3.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@libp2p/interfaces/-/interfaces-3.3.2.tgz#5d8079be845b0960939b5b18880e785a4714465a"
|
||||
integrity sha512-p/M7plbrxLzuQchvNwww1Was7ZeGE2NaOFulMaZBYIihU8z3fhaV+a033OqnC/0NTX/yhfdNOG7znhYq3XoR/g==
|
||||
|
||||
"@libp2p/logger@^2.0.5":
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@libp2p/logger/-/logger-2.1.1.tgz#e12e6c320ea64252af954bcec996895098d1cd36"
|
||||
integrity sha512-2UbzDPctg3cPupF6jrv6abQnAUTrbLybNOj0rmmrdGm1cN2HJ1o/hBu0sXuq4KF9P1h/eVRn1HIRbVIEKnEJrA==
|
||||
dependencies:
|
||||
"@libp2p/interface-peer-id" "^2.0.2"
|
||||
"@multiformats/multiaddr" "^12.1.3"
|
||||
debug "^4.3.4"
|
||||
interface-datastore "^8.2.0"
|
||||
multiformats "^11.0.2"
|
||||
|
||||
"@libp2p/peer-id@^2.0.0":
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@libp2p/peer-id/-/peer-id-2.0.4.tgz#d50d2ae4663ef79f6e31ce4eaf25e1f44e1667ab"
|
||||
integrity sha512-gcOsN8Fbhj6izIK+ejiWsqiqKeJ2yWPapi/m55VjOvDa52/ptQzZszxQP8jUk93u36de92ATFXDfZR/Bi6eeUQ==
|
||||
dependencies:
|
||||
"@libp2p/interface-peer-id" "^2.0.0"
|
||||
"@libp2p/interfaces" "^3.2.0"
|
||||
multiformats "^11.0.0"
|
||||
uint8arrays "^4.0.2"
|
||||
|
||||
"@multiformats/dns@^1.0.3":
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/@multiformats/dns/-/dns-1.0.6.tgz#b8c7de11459a02a5f4e609d35d3cdb95cb6ad152"
|
||||
integrity sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==
|
||||
dependencies:
|
||||
"@types/dns-packet" "^5.6.5"
|
||||
buffer "^6.0.3"
|
||||
dns-packet "^5.6.1"
|
||||
hashlru "^2.3.0"
|
||||
p-queue "^8.0.1"
|
||||
progress-events "^1.0.0"
|
||||
uint8arrays "^5.0.2"
|
||||
|
||||
"@multiformats/multiaddr-to-uri@^9.0.1":
|
||||
version "9.0.8"
|
||||
resolved "https://registry.yarnpkg.com/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.8.tgz#c0b1491b26a4d52273ddc16024c59ba47ef8583f"
|
||||
integrity sha512-4eiN5iEiQfy2A98BxekUfW410L/ivg0sgjYSgSqmklnrBhK+QyMz4yqgfkub8xDTXOc7O5jp4+LVyM3ZqMeWNw==
|
||||
dependencies:
|
||||
"@multiformats/multiaddr" "^12.0.0"
|
||||
|
||||
"@multiformats/multiaddr@^11.1.5":
|
||||
version "11.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-11.6.1.tgz#ec46984a298e715e27a398434c087856db5f3185"
|
||||
integrity sha512-doST0+aB7/3dGK9+U5y3mtF3jq85KGbke1QiH0KE1F5mGQ9y56mFebTeu2D9FNOm+OT6UHb8Ss8vbSnpGjeLNw==
|
||||
dependencies:
|
||||
"@chainsafe/is-ip" "^2.0.1"
|
||||
dns-over-http-resolver "^2.1.0"
|
||||
err-code "^3.0.1"
|
||||
multiformats "^11.0.0"
|
||||
uint8arrays "^4.0.2"
|
||||
varint "^6.0.0"
|
||||
|
||||
"@multiformats/multiaddr@^12.0.0", "@multiformats/multiaddr@^12.1.3":
|
||||
version "12.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-12.5.1.tgz#45d64456eddbf8cbe179366d7cb7b72efabe049f"
|
||||
integrity sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==
|
||||
dependencies:
|
||||
"@chainsafe/is-ip" "^2.0.1"
|
||||
"@chainsafe/netmask" "^2.0.0"
|
||||
"@multiformats/dns" "^1.0.3"
|
||||
abort-error "^1.0.1"
|
||||
multiformats "^13.0.0"
|
||||
uint8-varint "^2.0.1"
|
||||
uint8arrays "^5.0.0"
|
||||
|
||||
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
|
||||
integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==
|
||||
|
||||
"@protobufjs/base64@^1.1.2":
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
|
||||
integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
|
||||
|
||||
"@protobufjs/codegen@^2.0.4":
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
|
||||
integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
|
||||
|
||||
"@protobufjs/eventemitter@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
|
||||
integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==
|
||||
|
||||
"@protobufjs/fetch@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
|
||||
integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==
|
||||
dependencies:
|
||||
"@protobufjs/aspromise" "^1.1.1"
|
||||
"@protobufjs/inquire" "^1.1.0"
|
||||
|
||||
"@protobufjs/float@^1.0.2":
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
|
||||
integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==
|
||||
|
||||
"@protobufjs/inquire@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
|
||||
integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==
|
||||
|
||||
"@protobufjs/path@^1.1.2":
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
|
||||
integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==
|
||||
|
||||
"@protobufjs/pool@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
|
||||
integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==
|
||||
|
||||
"@protobufjs/utf8@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
|
||||
integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
|
||||
|
||||
"@types/dns-packet@^5.6.5":
|
||||
version "5.6.5"
|
||||
resolved "https://registry.yarnpkg.com/@types/dns-packet/-/dns-packet-5.6.5.tgz#49fc29a40f5d30227ed028fa1ee82601d3745e15"
|
||||
integrity sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/minimatch@^3.0.4":
|
||||
version "3.0.5"
|
||||
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
|
||||
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
|
||||
|
||||
"@types/node@*", "@types/node@>=13.7.0":
|
||||
version "24.0.10"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-24.0.10.tgz#f65a169779bf0d70203183a1890be7bee8ca2ddb"
|
||||
integrity sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==
|
||||
dependencies:
|
||||
undici-types "~7.8.0"
|
||||
|
||||
"@types/node@^18.0.0":
|
||||
version "18.19.115"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.115.tgz#cd94caf14472021b4443c99bcd7aac6bb5c4f672"
|
||||
integrity sha512-kNrFiTgG4a9JAn1LMQeLOv3MvXIPokzXziohMrMsvpYgLpdEt/mMiVYc4sGKtDfyxM5gIDF4VgrPRyCw4fHOYg==
|
||||
dependencies:
|
||||
undici-types "~5.26.4"
|
||||
|
||||
abort-error@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/abort-error/-/abort-error-1.0.1.tgz#526c17caf2ac9eb1fab1ffdff18c5076157a324e"
|
||||
integrity sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==
|
||||
|
||||
any-signal@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-3.0.1.tgz#49cae34368187a3472e31de28fb5cb1430caa9a6"
|
||||
integrity sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==
|
||||
|
||||
balanced-match@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
||||
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
|
||||
|
||||
base64-js@^1.3.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
|
||||
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
|
||||
|
||||
blob-to-it@^2.0.0:
|
||||
version "2.0.10"
|
||||
resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-2.0.10.tgz#dc3bb27f246b3437a23bcffe343fc0257f3de85f"
|
||||
integrity sha512-I39vO57y+LBEIcAV7fif0sn96fYOYVqrPiOD+53MxQGv4DBgt1/HHZh0BHheWx2hVe24q5LTSXxqeV1Y3Nzkgg==
|
||||
dependencies:
|
||||
browser-readablestream-to-it "^2.0.0"
|
||||
|
||||
brace-expansion@^1.1.7:
|
||||
version "1.1.12"
|
||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843"
|
||||
integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==
|
||||
dependencies:
|
||||
balanced-match "^1.0.0"
|
||||
concat-map "0.0.1"
|
||||
|
||||
browser-readablestream-to-it@^1.0.0:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76"
|
||||
integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==
|
||||
|
||||
browser-readablestream-to-it@^2.0.0:
|
||||
version "2.0.10"
|
||||
resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-2.0.10.tgz#e37098be227623af21ee815af74d43ffb9307a6d"
|
||||
integrity sha512-I/9hEcRtjct8CzD9sVo9Mm4ntn0D+7tOVrjbPl69XAoOfgJ8NBdOQU+WX+5SHhcELJDb14mWt7zuvyqha+MEAQ==
|
||||
|
||||
buffer@^6.0.1, buffer@^6.0.3:
|
||||
version "6.0.3"
|
||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
|
||||
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
|
||||
dependencies:
|
||||
base64-js "^1.3.1"
|
||||
ieee754 "^1.2.1"
|
||||
|
||||
cborg@^4.0.0:
|
||||
version "4.2.12"
|
||||
resolved "https://registry.yarnpkg.com/cborg/-/cborg-4.2.12.tgz#2f9826773f559e436cb85a49c88fc1bb08bdc373"
|
||||
integrity sha512-z126yLoavS75cdTuiKu61RC3Y3trqtDAgQRa5Q0dpHn1RmqhIedptWXKnk0lQ5yo/GmcV9myvIkzFgZ8GnqSog==
|
||||
|
||||
concat-map@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
|
||||
|
||||
dag-jose@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/dag-jose/-/dag-jose-4.0.0.tgz#4e65f62af58dd5203b2b094eb52142ffe0cdec1d"
|
||||
integrity sha512-tw595L3UYoOUT9dSJPbBEG/qpRpw24kRZxa5SLRnlnr+g5L7O8oEs1d3W5TiVA1oJZbthVsf0Vi3zFN66qcEBA==
|
||||
dependencies:
|
||||
"@ipld/dag-cbor" "^9.0.0"
|
||||
multiformats "^11.0.0"
|
||||
|
||||
debug@^4.3.1, debug@^4.3.4:
|
||||
version "4.4.1"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
|
||||
integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
|
||||
dependencies:
|
||||
ms "^2.1.3"
|
||||
|
||||
dns-over-http-resolver@^2.1.0:
|
||||
version "2.1.3"
|
||||
resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-2.1.3.tgz#bb7f2e10cc18d960339a6e30e21b8c1d99be7b38"
|
||||
integrity sha512-zjRYFhq+CsxPAouQWzOsxNMvEN+SHisjzhX8EMxd2Y0EG3thvn6wXQgMJLnTDImkhe4jhLbOQpXtL10nALBOSA==
|
||||
dependencies:
|
||||
debug "^4.3.1"
|
||||
native-fetch "^4.0.2"
|
||||
receptacle "^1.3.2"
|
||||
undici "^5.12.0"
|
||||
|
||||
dns-packet@^5.6.1:
|
||||
version "5.6.1"
|
||||
resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f"
|
||||
integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==
|
||||
dependencies:
|
||||
"@leichtgewicht/ip-codec" "^2.0.1"
|
||||
|
||||
electron-fetch@^1.7.2:
|
||||
version "1.9.1"
|
||||
resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.9.1.tgz#e28bfe78d467de3f2dec884b1d72b8b05322f30f"
|
||||
integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==
|
||||
dependencies:
|
||||
encoding "^0.1.13"
|
||||
|
||||
encoding@^0.1.13:
|
||||
version "0.1.13"
|
||||
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
|
||||
integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
|
||||
dependencies:
|
||||
iconv-lite "^0.6.2"
|
||||
|
||||
err-code@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920"
|
||||
integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==
|
||||
|
||||
eventemitter3@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4"
|
||||
integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
|
||||
|
||||
fast-fifo@^1.0.0:
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c"
|
||||
integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==
|
||||
|
||||
get-iterator@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82"
|
||||
integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==
|
||||
|
||||
hashlru@^2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/hashlru/-/hashlru-2.3.0.tgz#5dc15928b3f6961a2056416bb3a4910216fdfb51"
|
||||
integrity sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==
|
||||
|
||||
iconv-lite@^0.6.2:
|
||||
version "0.6.3"
|
||||
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
|
||||
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
|
||||
dependencies:
|
||||
safer-buffer ">= 2.1.2 < 3.0.0"
|
||||
|
||||
ieee754@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
||||
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
|
||||
|
||||
inherits@^2.0.3:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
|
||||
interface-datastore@^7.0.0:
|
||||
version "7.0.4"
|
||||
resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-7.0.4.tgz#f09ae4e2896f57f876d5d742a59e982fb3f42891"
|
||||
integrity sha512-Q8LZS/jfFFHz6XyZazLTAc078SSCoa27ZPBOfobWdpDiFO7FqPA2yskitUJIhaCgxNK8C+/lMBUTBNfVIDvLiw==
|
||||
dependencies:
|
||||
interface-store "^3.0.0"
|
||||
nanoid "^4.0.0"
|
||||
uint8arrays "^4.0.2"
|
||||
|
||||
interface-datastore@^8.2.0:
|
||||
version "8.3.2"
|
||||
resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-8.3.2.tgz#1ae2f78d1cbc7a99421d551fd0cec00b8859399d"
|
||||
integrity sha512-R3NLts7pRbJKc3qFdQf+u40hK8XWc0w4Qkx3OFEstC80VoaDUABY/dXA2EJPhtNC+bsrf41Ehvqb6+pnIclyRA==
|
||||
dependencies:
|
||||
interface-store "^6.0.0"
|
||||
uint8arrays "^5.1.0"
|
||||
|
||||
interface-store@^3.0.0:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-3.0.4.tgz#670d95ef45f3b7061d154c3cbfaf39a538167ad7"
|
||||
integrity sha512-OjHUuGXbH4eXSBx1TF1tTySvjLldPLzRSYYXJwrEQI+XfH5JWYZofr0gVMV4F8XTwC+4V7jomDYkvGRmDSRKqQ==
|
||||
|
||||
interface-store@^6.0.0:
|
||||
version "6.0.3"
|
||||
resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-6.0.3.tgz#a4443490976f52e1b40ff99ddfbc690dfbb00863"
|
||||
integrity sha512-+WvfEZnFUhRwFxgz+QCQi7UC6o9AM0EHM9bpIe2Nhqb100NHCsTvNAn4eJgvgV2/tmLo1MP9nGxQKEcZTAueLA==
|
||||
|
||||
ipfs-core-types@^0.14.1:
|
||||
version "0.14.1"
|
||||
resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.14.1.tgz#c69f4dd873324e975ef43c391c0692b96863b13c"
|
||||
integrity sha512-4ujF8NlM9bYi2I6AIqPP9wfGGX0x/gRCkMoFdOQfxxrFg6HcAdfS+0/irK8mp4e7znOHWReOHeWqCGw+dAPwsw==
|
||||
dependencies:
|
||||
"@ipld/dag-pb" "^4.0.0"
|
||||
"@libp2p/interface-keychain" "^2.0.0"
|
||||
"@libp2p/interface-peer-id" "^2.0.0"
|
||||
"@libp2p/interface-peer-info" "^1.0.2"
|
||||
"@libp2p/interface-pubsub" "^3.0.0"
|
||||
"@multiformats/multiaddr" "^11.1.5"
|
||||
"@types/node" "^18.0.0"
|
||||
interface-datastore "^7.0.0"
|
||||
ipfs-unixfs "^9.0.0"
|
||||
multiformats "^11.0.0"
|
||||
|
||||
ipfs-core-utils@^0.18.1:
|
||||
version "0.18.1"
|
||||
resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.18.1.tgz#d5fae11bfdb511749c6f905b0d0da3174eb50909"
|
||||
integrity sha512-P7jTpdfvlyBG3JR4o+Th3QJADlmXmwMxbkjszXry6VAjfSfLIIqXsdeYPoVRkV69GFEeQozuz2k/jR+U8cUH/Q==
|
||||
dependencies:
|
||||
"@libp2p/logger" "^2.0.5"
|
||||
"@multiformats/multiaddr" "^11.1.5"
|
||||
"@multiformats/multiaddr-to-uri" "^9.0.1"
|
||||
any-signal "^3.0.0"
|
||||
blob-to-it "^2.0.0"
|
||||
browser-readablestream-to-it "^2.0.0"
|
||||
err-code "^3.0.1"
|
||||
ipfs-core-types "^0.14.1"
|
||||
ipfs-unixfs "^9.0.0"
|
||||
ipfs-utils "^9.0.13"
|
||||
it-all "^2.0.0"
|
||||
it-map "^2.0.0"
|
||||
it-peekable "^2.0.0"
|
||||
it-to-stream "^1.0.0"
|
||||
merge-options "^3.0.4"
|
||||
multiformats "^11.0.0"
|
||||
nanoid "^4.0.0"
|
||||
parse-duration "^1.0.0"
|
||||
timeout-abort-controller "^3.0.0"
|
||||
uint8arrays "^4.0.2"
|
||||
|
||||
ipfs-http-client@^60.0.1:
|
||||
version "60.0.1"
|
||||
resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-60.0.1.tgz#d2e9ab430aad43a92a6e44008e534afba4fd22b9"
|
||||
integrity sha512-amwM5TNuf077J+/q27jPHfatC05vJuIbX6ZnlYLjc2QsjOCKsORNBqV3brNw7l+fPrijV1yrwEDLG3JEnKsfMw==
|
||||
dependencies:
|
||||
"@ipld/dag-cbor" "^9.0.0"
|
||||
"@ipld/dag-json" "^10.0.0"
|
||||
"@ipld/dag-pb" "^4.0.0"
|
||||
"@libp2p/logger" "^2.0.5"
|
||||
"@libp2p/peer-id" "^2.0.0"
|
||||
"@multiformats/multiaddr" "^11.1.5"
|
||||
any-signal "^3.0.0"
|
||||
dag-jose "^4.0.0"
|
||||
err-code "^3.0.1"
|
||||
ipfs-core-types "^0.14.1"
|
||||
ipfs-core-utils "^0.18.1"
|
||||
ipfs-utils "^9.0.13"
|
||||
it-first "^2.0.0"
|
||||
it-last "^2.0.0"
|
||||
merge-options "^3.0.4"
|
||||
multiformats "^11.0.0"
|
||||
parse-duration "^1.0.0"
|
||||
stream-to-it "^0.2.2"
|
||||
uint8arrays "^4.0.2"
|
||||
|
||||
ipfs-unixfs@^9.0.0:
|
||||
version "9.0.1"
|
||||
resolved "https://registry.yarnpkg.com/ipfs-unixfs/-/ipfs-unixfs-9.0.1.tgz#d06e688e07ef4ce08d610337ba2fe8c143c386e7"
|
||||
integrity sha512-jh2CbXyxID+v3jLml9CqMwjdSS9ZRnsGfQGGPOfem0/hT/L48xUeTPvh7qLFWkZcIMhZtG+fnS1teei8x5uGBg==
|
||||
dependencies:
|
||||
err-code "^3.0.1"
|
||||
protobufjs "^7.0.0"
|
||||
|
||||
ipfs-utils@^9.0.13:
|
||||
version "9.0.14"
|
||||
resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-9.0.14.tgz#24f5fda1f4567685eb32bca2543d518f95fd8704"
|
||||
integrity sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==
|
||||
dependencies:
|
||||
any-signal "^3.0.0"
|
||||
browser-readablestream-to-it "^1.0.0"
|
||||
buffer "^6.0.1"
|
||||
electron-fetch "^1.7.2"
|
||||
err-code "^3.0.1"
|
||||
is-electron "^2.2.0"
|
||||
iso-url "^1.1.5"
|
||||
it-all "^1.0.4"
|
||||
it-glob "^1.0.1"
|
||||
it-to-stream "^1.0.0"
|
||||
merge-options "^3.0.4"
|
||||
nanoid "^3.1.20"
|
||||
native-fetch "^3.0.0"
|
||||
node-fetch "^2.6.8"
|
||||
react-native-fetch-api "^3.0.0"
|
||||
stream-to-it "^0.2.2"
|
||||
|
||||
is-electron@^2.2.0:
|
||||
version "2.2.2"
|
||||
resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9"
|
||||
integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==
|
||||
|
||||
is-plain-obj@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
|
||||
integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
|
||||
|
||||
iso-url@^1.1.5:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811"
|
||||
integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==
|
||||
|
||||
it-all@^1.0.4:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335"
|
||||
integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==
|
||||
|
||||
it-all@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/it-all/-/it-all-2.0.1.tgz#45d530ecf6e13fb81d7ba583cdfd55ffdb376b05"
|
||||
integrity sha512-9UuJcCRZsboz+HBQTNOau80Dw+ryGaHYFP/cPYzFBJBFcfDathMYnhHk4t52en9+fcyDGPTdLB+lFc1wzQIroA==
|
||||
|
||||
it-first@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/it-first/-/it-first-2.0.1.tgz#75d66b254c385ae3a1906def060a69006a437cef"
|
||||
integrity sha512-noC1oEQcWZZMUwq7VWxHNLML43dM+5bviZpfmkxkXlvBe60z7AFRqpZSga9uQBo792jKv9otnn1IjA4zwgNARw==
|
||||
|
||||
it-glob@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-1.0.2.tgz#bab9b04d6aaac42884502f3a0bfee84c7a29e15e"
|
||||
integrity sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==
|
||||
dependencies:
|
||||
"@types/minimatch" "^3.0.4"
|
||||
minimatch "^3.0.4"
|
||||
|
||||
it-last@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/it-last/-/it-last-2.0.1.tgz#a6f3253459cb77e917aeada3b2c4ae9f3e66c64b"
|
||||
integrity sha512-uVMedYW0wa2Cx0TAmcOCLbfuLLII7+vyURmhKa8Zovpd+aBTMsmINtsta2n364wJ5qsEDBH+akY1sUtAkaYBlg==
|
||||
|
||||
it-map@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/it-map/-/it-map-2.0.1.tgz#d5251fd6b222d6ee39293d406a3f8fce54fb9220"
|
||||
integrity sha512-a2GcYDHiAh/eSU628xlvB56LA98luXZnniH2GlD0IdBzf15shEq9rBeb0Rg3o1SWtNILUAwqmQxEXcewGCdvmQ==
|
||||
|
||||
it-peekable@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-2.0.1.tgz#1e118610473aa511efc70f3bb7a7066178728dd3"
|
||||
integrity sha512-fJ/YTU9rHRhGJOM2hhQKKEfRM6uKB9r4yGGFLBHqp72ACC8Yi6+7/FhuBAMG8cpN6mLoj9auVX7ZJ3ul6qFpTA==
|
||||
|
||||
it-pushable@^3.0.0:
|
||||
version "3.2.3"
|
||||
resolved "https://registry.yarnpkg.com/it-pushable/-/it-pushable-3.2.3.tgz#e2b80aed90cfbcd54b620c0a0785e546d4e5f334"
|
||||
integrity sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==
|
||||
dependencies:
|
||||
p-defer "^4.0.0"
|
||||
|
||||
it-stream-types@^1.0.4:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/it-stream-types/-/it-stream-types-1.0.5.tgz#9c72e6adefdea9dac69d0a28fbea783deebd508d"
|
||||
integrity sha512-I88Ka1nHgfX62e5mi5LLL+oueqz7Ltg0bUdtsUKDe9SoUqbQPf2Mp5kxDTe9pNhHQGs4pvYPAINwuZ1HAt42TA==
|
||||
|
||||
it-to-stream@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-1.0.0.tgz#6c47f91d5b5df28bda9334c52782ef8e97fe3a4a"
|
||||
integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==
|
||||
dependencies:
|
||||
buffer "^6.0.3"
|
||||
fast-fifo "^1.0.0"
|
||||
get-iterator "^1.0.2"
|
||||
p-defer "^3.0.0"
|
||||
p-fifo "^1.0.0"
|
||||
readable-stream "^3.6.0"
|
||||
|
||||
long@^5.0.0:
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83"
|
||||
integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==
|
||||
|
||||
merge-options@^3.0.4:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7"
|
||||
integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==
|
||||
dependencies:
|
||||
is-plain-obj "^2.1.0"
|
||||
|
||||
minimatch@^3.0.4:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
||||
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
ms@^2.1.1, ms@^2.1.3:
|
||||
version "2.1.3"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
|
||||
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
|
||||
|
||||
multiformats@^11.0.0, multiformats@^11.0.2:
|
||||
version "11.0.2"
|
||||
resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-11.0.2.tgz#b14735efc42cd8581e73895e66bebb9752151b60"
|
||||
integrity sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==
|
||||
|
||||
multiformats@^12.0.1:
|
||||
version "12.1.3"
|
||||
resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-12.1.3.tgz#cbf7a9861e11e74f8228b21376088cb43ba8754e"
|
||||
integrity sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==
|
||||
|
||||
multiformats@^13.0.0, multiformats@^13.1.0:
|
||||
version "13.3.7"
|
||||
resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-13.3.7.tgz#9313edd1b152d9997ab6830c4f702783e724d62f"
|
||||
integrity sha512-meL9DERHj+fFVWoOX9fXqfcYcSpUfSYJPcFvDPKrxitICbwAoWR+Ut4j5NO9zAT917HUHLQmqzQbAsGNHlDcxQ==
|
||||
|
||||
nanoid@^3.1.20:
|
||||
version "3.3.11"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
|
||||
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
|
||||
|
||||
nanoid@^4.0.0:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.2.tgz#140b3c5003959adbebf521c170f282c5e7f9fb9e"
|
||||
integrity sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==
|
||||
|
||||
native-fetch@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb"
|
||||
integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==
|
||||
|
||||
native-fetch@^4.0.2:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-4.0.2.tgz#75c8a44c5f3bb021713e5e24f2846750883e49af"
|
||||
integrity sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==
|
||||
|
||||
node-fetch@^2.6.8:
|
||||
version "2.7.0"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
|
||||
integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
|
||||
dependencies:
|
||||
whatwg-url "^5.0.0"
|
||||
|
||||
p-defer@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83"
|
||||
integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==
|
||||
|
||||
p-defer@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-4.0.1.tgz#d12c6d41420785ed0d162dbd86b71ba490f7f99e"
|
||||
integrity sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==
|
||||
|
||||
p-fifo@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63"
|
||||
integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==
|
||||
dependencies:
|
||||
fast-fifo "^1.0.0"
|
||||
p-defer "^3.0.0"
|
||||
|
||||
p-queue@^8.0.1:
|
||||
version "8.1.0"
|
||||
resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-8.1.0.tgz#d71929249868b10b16f885d8a82beeaf35d32279"
|
||||
integrity sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==
|
||||
dependencies:
|
||||
eventemitter3 "^5.0.1"
|
||||
p-timeout "^6.1.2"
|
||||
|
||||
p-timeout@^6.1.2:
|
||||
version "6.1.4"
|
||||
resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.4.tgz#418e1f4dd833fa96a2e3f532547dd2abdb08dbc2"
|
||||
integrity sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==
|
||||
|
||||
papaparse@^5.5.3:
|
||||
version "5.5.3"
|
||||
resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.5.3.tgz#07f8994dec516c6dab266e952bed68e1de59fa9a"
|
||||
integrity sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==
|
||||
|
||||
parse-duration@^1.0.0:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.2.tgz#20008e6c507814761864669bb936e3f4a9a80758"
|
||||
integrity sha512-p8EIONG8L0u7f8GFgfVlL4n8rnChTt8O5FSxgxMz2tjc9FMP199wxVKVB6IbKx11uTbKHACSvaLVIKNnoeNR/A==
|
||||
|
||||
progress-events@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/progress-events/-/progress-events-1.0.1.tgz#693b6d4153f08c1418ae3cd5fcad8596c91db7e8"
|
||||
integrity sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==
|
||||
|
||||
protobufjs@^7.0.0:
|
||||
version "7.5.3"
|
||||
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.3.tgz#13f95a9e3c84669995ec3652db2ac2fb00b89363"
|
||||
integrity sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==
|
||||
dependencies:
|
||||
"@protobufjs/aspromise" "^1.1.2"
|
||||
"@protobufjs/base64" "^1.1.2"
|
||||
"@protobufjs/codegen" "^2.0.4"
|
||||
"@protobufjs/eventemitter" "^1.1.0"
|
||||
"@protobufjs/fetch" "^1.1.0"
|
||||
"@protobufjs/float" "^1.0.2"
|
||||
"@protobufjs/inquire" "^1.1.0"
|
||||
"@protobufjs/path" "^1.1.2"
|
||||
"@protobufjs/pool" "^1.1.0"
|
||||
"@protobufjs/utf8" "^1.1.0"
|
||||
"@types/node" ">=13.7.0"
|
||||
long "^5.0.0"
|
||||
|
||||
react-native-fetch-api@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz#81e1bb6562c292521bc4eca52fe1097f4c1ebab5"
|
||||
integrity sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==
|
||||
dependencies:
|
||||
p-defer "^3.0.0"
|
||||
|
||||
readable-stream@^3.6.0:
|
||||
version "3.6.2"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
|
||||
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
|
||||
dependencies:
|
||||
inherits "^2.0.3"
|
||||
string_decoder "^1.1.1"
|
||||
util-deprecate "^1.0.1"
|
||||
|
||||
receptacle@^1.3.2:
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2"
|
||||
integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==
|
||||
dependencies:
|
||||
ms "^2.1.1"
|
||||
|
||||
retimer@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/retimer/-/retimer-3.0.0.tgz#98b751b1feaf1af13eb0228f8ea68b8f9da530df"
|
||||
integrity sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==
|
||||
|
||||
safe-buffer@~5.2.0:
|
||||
version "5.2.1"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
||||
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
||||
|
||||
"safer-buffer@>= 2.1.2 < 3.0.0":
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
||||
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
||||
|
||||
stream-to-it@^0.2.2:
|
||||
version "0.2.4"
|
||||
resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0"
|
||||
integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==
|
||||
dependencies:
|
||||
get-iterator "^1.0.2"
|
||||
|
||||
string_decoder@^1.1.1:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
|
||||
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
|
||||
dependencies:
|
||||
safe-buffer "~5.2.0"
|
||||
|
||||
timeout-abort-controller@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz#dd57ffca041652c03769904f8d95afd93fb95595"
|
||||
integrity sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==
|
||||
dependencies:
|
||||
retimer "^3.0.0"
|
||||
|
||||
tr46@~0.0.3:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
|
||||
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
|
||||
|
||||
uint8-varint@^2.0.1:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/uint8-varint/-/uint8-varint-2.0.4.tgz#85be52b3849eb30f2c3640a2df8a14364180affb"
|
||||
integrity sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==
|
||||
dependencies:
|
||||
uint8arraylist "^2.0.0"
|
||||
uint8arrays "^5.0.0"
|
||||
|
||||
uint8arraylist@^2.0.0, uint8arraylist@^2.1.2:
|
||||
version "2.4.8"
|
||||
resolved "https://registry.yarnpkg.com/uint8arraylist/-/uint8arraylist-2.4.8.tgz#5a4d17f4defd77799cb38e93fd5db0f0dceddc12"
|
||||
integrity sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==
|
||||
dependencies:
|
||||
uint8arrays "^5.0.1"
|
||||
|
||||
uint8arrays@^4.0.2:
|
||||
version "4.0.10"
|
||||
resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-4.0.10.tgz#3ec5cde3348903c140e87532fc53f46b8f2e921f"
|
||||
integrity sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==
|
||||
dependencies:
|
||||
multiformats "^12.0.1"
|
||||
|
||||
uint8arrays@^5.0.0, uint8arrays@^5.0.1, uint8arrays@^5.0.2, uint8arrays@^5.1.0:
|
||||
version "5.1.0"
|
||||
resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-5.1.0.tgz#14047c9bdf825d025b7391299436e5e50e7270f1"
|
||||
integrity sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==
|
||||
dependencies:
|
||||
multiformats "^13.0.0"
|
||||
|
||||
undici-types@~5.26.4:
|
||||
version "5.26.5"
|
||||
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
|
||||
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
|
||||
|
||||
undici-types@~7.8.0:
|
||||
version "7.8.0"
|
||||
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.8.0.tgz#de00b85b710c54122e44fbfd911f8d70174cd294"
|
||||
integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==
|
||||
|
||||
undici@^5.12.0:
|
||||
version "5.29.0"
|
||||
resolved "https://registry.yarnpkg.com/undici/-/undici-5.29.0.tgz#419595449ae3f2cdcba3580a2e8903399bd1f5a3"
|
||||
integrity sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==
|
||||
dependencies:
|
||||
"@fastify/busboy" "^2.0.0"
|
||||
|
||||
util-deprecate@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
|
||||
|
||||
varint@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0"
|
||||
integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==
|
||||
|
||||
webidl-conversions@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
|
||||
integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
|
||||
|
||||
whatwg-url@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
|
||||
integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
|
||||
dependencies:
|
||||
tr46 "~0.0.3"
|
||||
webidl-conversions "^3.0.0"
|
||||
|
||||
Reference in New Issue
Block a user