chore(deploy): 增强生产部署校验与本地忽略规则
This commit is contained in:
17
.gitignore
vendored
17
.gitignore
vendored
@@ -1,11 +1,28 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
dist/
|
dist/
|
||||||
.next/
|
.next/
|
||||||
|
|
||||||
|
# Local environment files. Keep example templates tracked.
|
||||||
.env
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
!.env.*.example
|
||||||
|
!apps/**/.env.example
|
||||||
.env.local
|
.env.local
|
||||||
.env.local-server
|
.env.local-server
|
||||||
.env.production
|
.env.production
|
||||||
|
|
||||||
|
# Logs and local diagnostics.
|
||||||
*.log
|
*.log
|
||||||
|
logs/
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# Local IDE/editor state.
|
||||||
|
.idea/
|
||||||
.turbo/
|
.turbo/
|
||||||
coverage/
|
coverage/
|
||||||
.tmp/
|
.tmp/
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ const checks = [
|
|||||||
'pnpm --filter @ftb/shared build',
|
'pnpm --filter @ftb/shared build',
|
||||||
'pnpm --filter web build',
|
'pnpm --filter web build',
|
||||||
'NEXT_PUBLIC_API_URL',
|
'NEXT_PUBLIC_API_URL',
|
||||||
|
'NEXT_API_PROXY_TARGET',
|
||||||
'NEXT_PUBLIC_APP_VERSION',
|
'NEXT_PUBLIC_APP_VERSION',
|
||||||
'ARG APP_VERSION=unknown',
|
'ARG APP_VERSION=unknown',
|
||||||
'COPY scripts ./scripts',
|
'COPY scripts ./scripts',
|
||||||
@@ -50,6 +51,7 @@ const checks = [
|
|||||||
'SERVER_IMAGE',
|
'SERVER_IMAGE',
|
||||||
'WEB_IMAGE',
|
'WEB_IMAGE',
|
||||||
'APP_VERSION',
|
'APP_VERSION',
|
||||||
|
'NEXT_API_PROXY_TARGET',
|
||||||
'/api/v1/health/version',
|
'/api/v1/health/version',
|
||||||
'prometheus:',
|
'prometheus:',
|
||||||
"profiles: ['monitoring']",
|
"profiles: ['monitoring']",
|
||||||
@@ -65,6 +67,7 @@ const checks = [
|
|||||||
'appleboy/ssh-action',
|
'appleboy/ssh-action',
|
||||||
'docker compose --env-file .env.production -f docker-compose.prod.yml pull',
|
'docker compose --env-file .env.production -f docker-compose.prod.yml pull',
|
||||||
'pnpm --filter server db:deploy',
|
'pnpm --filter server db:deploy',
|
||||||
|
'NEXT_API_PROXY_TARGET',
|
||||||
'scripts/smoke-test-release.mjs',
|
'scripts/smoke-test-release.mjs',
|
||||||
'--expected-version',
|
'--expected-version',
|
||||||
],
|
],
|
||||||
@@ -77,6 +80,7 @@ const checks = [
|
|||||||
file: 'scripts/smoke-test-release.mjs',
|
file: 'scripts/smoke-test-release.mjs',
|
||||||
snippets: [
|
snippets: [
|
||||||
'Release smoke test passed',
|
'Release smoke test passed',
|
||||||
|
'/api/v1/health/version',
|
||||||
'/api/v1/v2.2/requirements?productId=__smoke__',
|
'/api/v1/v2.2/requirements?productId=__smoke__',
|
||||||
'/api/v1/config/ai',
|
'/api/v1/config/ai',
|
||||||
],
|
],
|
||||||
@@ -111,9 +115,29 @@ const checks = [
|
|||||||
'nginx:',
|
'nginx:',
|
||||||
'local_server_data:',
|
'local_server_data:',
|
||||||
'NEXT_PUBLIC_API_URL',
|
'NEXT_PUBLIC_API_URL',
|
||||||
|
'NEXT_API_PROXY_TARGET',
|
||||||
'${LOCAL_HTTP_PORT:-8080}:80',
|
'${LOCAL_HTTP_PORT:-8080}:80',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
file: 'apps/web/lib/api.ts',
|
||||||
|
snippets: [
|
||||||
|
"env.NODE_ENV === 'production'",
|
||||||
|
'isLocalOnlyApiUrl',
|
||||||
|
"'localhost'",
|
||||||
|
"'127.0.0.1'",
|
||||||
|
"'0.0.0.0'",
|
||||||
|
"return '/api/v1'",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
file: 'apps/web/next.config.js',
|
||||||
|
snippets: [
|
||||||
|
'NEXT_API_PROXY_TARGET',
|
||||||
|
'toApiProxyDestination',
|
||||||
|
'/api/v1/:path*',
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
file: 'deploy/nginx/default.conf.template',
|
file: 'deploy/nginx/default.conf.template',
|
||||||
snippets: [
|
snippets: [
|
||||||
@@ -188,7 +212,8 @@ const checks = [
|
|||||||
snippets: [
|
snippets: [
|
||||||
'POSTGRES_PASSWORD=',
|
'POSTGRES_PASSWORD=',
|
||||||
'DATABASE_URL=postgresql://',
|
'DATABASE_URL=postgresql://',
|
||||||
'NEXT_PUBLIC_API_URL=',
|
'NEXT_PUBLIC_API_URL=/api/v1',
|
||||||
|
'NEXT_API_PROXY_TARGET=',
|
||||||
'APP_VERSION=',
|
'APP_VERSION=',
|
||||||
'WEB_IMAGE=',
|
'WEB_IMAGE=',
|
||||||
'SERVER_IMAGE=',
|
'SERVER_IMAGE=',
|
||||||
@@ -203,8 +228,12 @@ const checks = [
|
|||||||
'LOCAL_ACCESS_HOST=localhost',
|
'LOCAL_ACCESS_HOST=localhost',
|
||||||
'DATABASE_URL=postgresql://',
|
'DATABASE_URL=postgresql://',
|
||||||
'NEXT_PUBLIC_API_URL=/api/v1',
|
'NEXT_PUBLIC_API_URL=/api/v1',
|
||||||
|
'NEXT_API_PROXY_TARGET=',
|
||||||
'NEXTAUTH_URL=http://localhost:8080',
|
'NEXTAUTH_URL=http://localhost:8080',
|
||||||
],
|
],
|
||||||
|
forbiddenSnippets: [
|
||||||
|
'LOCAL_SERVER_PORT=',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
file: 'docs/deployment.md',
|
file: 'docs/deployment.md',
|
||||||
@@ -243,6 +272,12 @@ for (const check of checks) {
|
|||||||
failed = true;
|
failed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (const snippet of check.forbiddenSnippets ?? []) {
|
||||||
|
if (content.includes(snippet)) {
|
||||||
|
console.error(`Forbidden snippet in ${check.file}: ${snippet}`);
|
||||||
|
failed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const check of requiredRuntimeDependencies) {
|
for (const check of requiredRuntimeDependencies) {
|
||||||
|
|||||||
Reference in New Issue
Block a user