add-setting-env

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Adding Environment Variable for User Settings

为用户设置添加环境变量

Add server-side environment variables to configure default values for user settings.
Priority: User Custom > Server Env Var > Hardcoded Default
添加服务器端环境变量以配置用户设置的默认值。
优先级:用户自定义 > 服务器环境变量 > 硬编码默认值

Steps

步骤

1. Define Environment Variable

1. 定义环境变量

Create
src/envs/<domain>.ts
:
typescript
import { createEnv } from '@t3-oss/env-nextjs';
import { z } from 'zod';

export const get<Domain>Config = () => {
  return createEnv({
    server: {
      YOUR_ENV_VAR: z.coerce.number().min(MIN).max(MAX).optional(),
    },
    runtimeEnv: {
      YOUR_ENV_VAR: process.env.YOUR_ENV_VAR,
    },
  });
};

export const <domain>Env = get<Domain>Config();
创建
src/envs/<domain>.ts
文件:
typescript
import { createEnv } from '@t3-oss/env-nextjs';
import { z } from 'zod';

export const get<Domain>Config = () => {
  return createEnv({
    server: {
      YOUR_ENV_VAR: z.coerce.number().min(MIN).max(MAX).optional(),
    },
    runtimeEnv: {
      YOUR_ENV_VAR: process.env.YOUR_ENV_VAR,
    },
  });
};

export const <domain>Env = get<Domain>Config();

2. Update Type (if new domain)

2. 更新类型(若为新领域)

Add to
packages/types/src/serverConfig.ts
:
typescript
import { User<Domain>Config } from './user/settings';

export interface GlobalServerConfig {
  <domain>?: PartialDeep<User<Domain>Config>;
}
Prefer reusing existing types from
packages/types/src/user/settings
.
添加至
packages/types/src/serverConfig.ts
typescript
import { User<Domain>Config } from './user/settings';

export interface GlobalServerConfig {
  <domain>?: PartialDeep<User<Domain>Config>;
}
优先复用
packages/types/src/user/settings
中的现有类型

3. Assemble Server Config (if new domain)

3. 组装服务器配置(若为新领域)

In
src/server/globalConfig/index.ts
:
typescript
import { <domain>Env } from '@/envs/<domain>';

export const getServerGlobalConfig = async () => {
  const config: GlobalServerConfig = {
    <domain>: cleanObject({
      <settingName>: <domain>Env.YOUR_ENV_VAR,
    }),
  };
  return config;
};
src/server/globalConfig/index.ts
中:
typescript
import { <domain>Env } from '@/envs/<domain>';

export const getServerGlobalConfig = async () => {
  const config: GlobalServerConfig = {
    <domain>: cleanObject({
      <settingName>: <domain>Env.YOUR_ENV_VAR,
    }),
  };
  return config;
};

4. Merge to User Store (if new domain)

4. 合并至用户存储(若为新领域)

In
src/store/user/slices/common/action.ts
:
typescript
const serverSettings: PartialDeep<UserSettings> = {
  <domain>: serverConfig.<domain>,
};
src/store/user/slices/common/action.ts
中:
typescript
const serverSettings: PartialDeep<UserSettings> = {
  <domain>: serverConfig.<domain>,
};

5. Update .env.example

5. 更新.env.example

bash
undefined
bash
undefined

<Description> (range/options, default: X)

<Description> (range/options, default: X)

YOUR_ENV_VAR=<example>

YOUR_ENV_VAR=<example>

undefined
undefined

6. Update Documentation

6. 更新文档

  • docs/self-hosting/environment-variables/basic.mdx
    (EN)
  • docs/self-hosting/environment-variables/basic.zh-CN.mdx
    (CN)
  • docs/self-hosting/environment-variables/basic.mdx
    (英文)
  • docs/self-hosting/environment-variables/basic.zh-CN.mdx
    (中文)

Example: AI_IMAGE_DEFAULT_IMAGE_NUM

示例:AI_IMAGE_DEFAULT_IMAGE_NUM

typescript
// src/envs/image.ts
AI_IMAGE_DEFAULT_IMAGE_NUM: z.coerce.number().min(1).max(20).optional(),

// packages/types/src/serverConfig.ts
image?: PartialDeep<UserImageConfig>;

// src/server/globalConfig/index.ts
image: cleanObject({ defaultImageNum: imageEnv.AI_IMAGE_DEFAULT_IMAGE_NUM }),

// src/store/user/slices/common/action.ts
image: serverConfig.image,

// .env.example
typescript
// src/envs/image.ts
AI_IMAGE_DEFAULT_IMAGE_NUM: z.coerce.number().min(1).max(20).optional(),

// packages/types/src/serverConfig.ts
image?: PartialDeep<UserImageConfig>;

// src/server/globalConfig/index.ts
image: cleanObject({ defaultImageNum: imageEnv.AI_IMAGE_DEFAULT_IMAGE_NUM }),

// src/store/user/slices/common/action.ts
image: serverConfig.image,

// .env.example

AI_IMAGE_DEFAULT_IMAGE_NUM=4

AI_IMAGE_DEFAULT_IMAGE_NUM=4

undefined
undefined