From e936fbc140f97677eecb6335096576567cb881e3 Mon Sep 17 00:00:00 2001 From: shenjianZ Date: Sat, 2 Aug 2025 10:42:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(docker):=20=E5=AE=89=E8=A3=85=20tzdata=20?= =?UTF-8?q?=E5=B9=B6=E8=AE=BE=E7=BD=AE=20TZ=3DAsia/Shanghai=20=E4=BB=A5?= =?UTF-8?q?=E8=AE=A9=20Node.js=20=E4=BD=BF=E7=94=A8=E4=B8=8A=E6=B5=B7?= =?UTF-8?q?=E6=97=B6=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/Dockerfile | 11 +++++------ backend/init.sql | 2 +- backend/logger.js | 19 ++++++++----------- backend/saveEmail.js | 9 +++++++-- docker-compose.build.yml | 2 ++ docker-compose.full.yml | 2 ++ docker-compose.self.yml | 6 +++++- docker-compose.yml | 2 ++ 8 files changed, 32 insertions(+), 21 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 420b0f2..49b94da 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,14 +1,13 @@ FROM node:20-alpine +# Set timezone to Asia/Shanghai FIRST +# This ensures that any native modules compiled during npm install are linked correctly. +RUN apk add --no-cache tzdata +ENV TZ=Asia/Shanghai + WORKDIR /usr/src/app COPY package*.json ./ - -# Set timezone to Asia/Shanghai -RUN apk add --no-cache tzdata -ENV TZ=Asia/Shanghai -ENV NODE_ENV=production - RUN npm install COPY . . diff --git a/backend/init.sql b/backend/init.sql index 94c90a3..de8716d 100644 --- a/backend/init.sql +++ b/backend/init.sql @@ -4,7 +4,7 @@ CREATE TABLE IF NOT EXISTS emails ( sender VARCHAR(255) NOT NULL, subject VARCHAR(512), body TEXT, - received_at DATETIME DEFAULT CURRENT_TIMESTAMP, + received_at DATETIME, raw MEDIUMBLOB ); diff --git a/backend/logger.js b/backend/logger.js index d13902e..108e926 100644 --- a/backend/logger.js +++ b/backend/logger.js @@ -4,7 +4,8 @@ const logger = winston.createLogger({ level: 'info', format: winston.format.combine( winston.format.timestamp({ - format: 'YYYY-MM-DD HH:mm:ss' + format: 'YYYY-MM-DD HH:mm:ss', + tz: 'Asia/Shanghai' }), winston.format.errors({ stack: true }), winston.format.splat(), @@ -17,10 +18,16 @@ const logger = winston.createLogger({ ] }); +// 在非生产环境下,添加一个带有着色的控制台输出 if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.combine( winston.format.colorize(), + // 确保控制台日志也有正确格式和时区的时间戳 + winston.format.timestamp({ + format: 'YYYY-MM-DD HH:mm:ss', + tz: 'Asia/Shanghai' + }), winston.format.printf(({ level, message, timestamp, stack }) => { if (stack) { // 打印错误堆栈 @@ -32,14 +39,4 @@ if (process.env.NODE_ENV !== 'production') { })); } -// 在文件日志中也使用更清晰的格式 -logger.transports.forEach(t => { - if (t.name === 'file') { - t.format = winston.format.combine( - winston.format.timestamp(), - winston.format.json() - ); - } -}); - module.exports = logger; diff --git a/backend/saveEmail.js b/backend/saveEmail.js index 6b4f6ac..9bf9db1 100644 --- a/backend/saveEmail.js +++ b/backend/saveEmail.js @@ -42,9 +42,14 @@ async function saveEmail(stream) { const subject = parsed.subject || 'No Subject'; const body = parsed.text || (parsed.html || ''); + // Manually create a timestamp for 'Asia/Shanghai' timezone + const received_at = new Date().toLocaleString('sv-SE', { + timeZone: 'Asia/Shanghai' + }); + const [result] = await db.execute( - 'INSERT INTO emails (recipient, sender, subject, body) VALUES (?, ?, ?, ?)', - [recipient, sender, subject, body] + 'INSERT INTO emails (recipient, sender, subject, body, received_at) VALUES (?, ?, ?, ?, ?)', + [recipient, sender, subject, body, received_at] ); // const [result] = await db.execute( // 'INSERT INTO emails (recipient, sender, subject, body, raw) VALUES (?, ?, ?, ?, ?)', diff --git a/docker-compose.build.yml b/docker-compose.build.yml index ddfd631..726dbab 100644 --- a/docker-compose.build.yml +++ b/docker-compose.build.yml @@ -17,6 +17,8 @@ services: image: mysql:8.0 container_name: email-mysql restart: always + environment: + - TZ=Asia/Shanghai env_file: - compose.env volumes: diff --git a/docker-compose.full.yml b/docker-compose.full.yml index 718bd4b..1ce9a09 100644 --- a/docker-compose.full.yml +++ b/docker-compose.full.yml @@ -17,6 +17,8 @@ services: image: registry.cn-hangzhou.aliyuncs.com/pull-image/mysql:8.0 container_name: email-mysql restart: always + environment: + - TZ=Asia/Shanghai env_file: - compose.full.env volumes: diff --git a/docker-compose.self.yml b/docker-compose.self.yml index c79a284..d4f835c 100644 --- a/docker-compose.self.yml +++ b/docker-compose.self.yml @@ -1,6 +1,10 @@ services: backend: - build: ./backend + build: + context: ./backend + args: + HTTP_PROXY: "http://127.0.0.1:7899" + HTTPS_PROXY: "http://127.0.0.1:7899" container_name: email-backend restart: always ports: diff --git a/docker-compose.yml b/docker-compose.yml index da9bf4c..a36a6d1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,6 +17,8 @@ services: image: registry.cn-hangzhou.aliyuncs.com/pull-image/mysql:8.0 # mysql:8.0 container_name: email-mysql restart: always + environment: + - TZ=Asia/Shanghai env_file: - compose.env volumes: