fix: harden backend production deployment

This commit is contained in:
ANG-Server
2026-07-20 21:07:27 +08:00
parent c995891c1f
commit a72920d1e0
6 changed files with 57 additions and 4 deletions

View File

@@ -46,7 +46,8 @@ ZULIP_DEGRADED_MODE_ENABLED=true
ZULIP_AUTO_RECONNECT_ENABLED=true
# Realtime and generated assets
WEBSOCKET_PORT=3000
# The native WebSocket server listens separately from the REST API.
WEBSOCKET_PORT=3001
WEBSOCKET_NAMESPACE=/game
ACCOUNT_ASSET_DIR=generated/account-assets
SKIN_GENERATION_OUTPUT_DIR=generated/skins

View File

@@ -0,0 +1,21 @@
server {
listen 80;
server_name whaletownadmin.xinghangee.icu;
root /var/www/whale-town-end-v2/client/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location = /index.html {
add_header Cache-Control "no-cache";
}
location ~* \.(?:js|css|png|jpg|jpeg|gif|svg|ico|woff2?)$ {
expires 7d;
add_header Cache-Control "public, max-age=604800, immutable";
try_files $uri =404;
}
}

View File

@@ -0,0 +1,28 @@
server {
listen 80;
server_name whaletownend.xinghangee.icu;
client_max_body_size 24m;
location /game {
proxy_pass http://127.0.0.1:3001/game;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

View File

@@ -2,6 +2,7 @@ module.exports = {
apps: [
{
name: 'whale-town-end-v2',
cwd: __dirname,
script: 'dist/main.js',
instances: 1,
exec_mode: 'cluster',

View File

@@ -2,6 +2,8 @@ import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { AppStatusResponseDto } from './business/shared';
const packageJson: { version: string } = require('../package.json');
/**
* 应用服务类
*
@@ -31,7 +33,7 @@ export class AppService {
return {
service: 'Pixel Game Server',
version: '1.1.1',
version: packageJson.version,
status: 'running',
timestamp: new Date().toISOString(),
uptime: Math.floor((Date.now() - this.startTime) / 1000),

View File

@@ -354,7 +354,7 @@ export function validateZulipConfig(
errors.push('API Key加密密钥长度必须至少32字符');
}
if (!config.server.botApiKey) {
if (!config.server.botApiKey && !config.errorHandling.degradedModeEnabled) {
errors.push('生产环境必须配置Zulip机器人API Key');
}
}
@@ -405,4 +405,4 @@ function isValidEmail(email: string): boolean {
*/
export const zulipConfig = registerAs('zulip', () => {
return loadZulipConfigFromEnv();
});
});