Logo文档
部署指南

AWS SST

使用 Serverless Stack (SST) 和基础设施即代码将 NEXTDEVKIT 部署到 AWS

使用 Serverless Stack (SST) 将您的 NEXTDEVKIT 应用程序部署到 AWS,以获得企业级基础设施和完全控制及可扩展性。

🌟 为什么选择 AWS SST?

AWS SST 适用于需要以下功能的企业应用程序:

  • 🏗️ 基础设施即代码:版本控制、可重复的部署
  • 🎭 多环境:隔离的预发布和生产环境
  • 🔧 完整 AWS 集成:访问所有 AWS 服务和无限可扩展性
  • 🛡️ 类型安全:TypeScript 基础设施减少配置错误
  • 💰 成本优化:仅为使用的内容付费,无服务器定价
  • 🔐 企业安全:AWS 安全最佳实践和合规就绪

📋 先决条件

在部署之前,确保您拥有:

🚀 部署步骤

第 1 步:配置环境变量

请参考环境指南了解详细的环境变量。

复制 .env.example.env.production 并更新环境变量。

第 2 步:配置 AWS 凭据

设置您的 AWS 凭据:

# 配置 AWS CLI
aws configure

# AWS Access Key ID: your-access-key-id
# AWS Secret Access Key: your-secret-access-key
# Default region name: us-east-1
# Default output format: json

或编辑 ~/.aws/credentials 文件:

[default]
aws_access_key_id = your-access-key-id
aws_secret_access_key = your-secret-access-key

请确认 AWS 凭据 IAM 权限正确。您可以参考 SST AWS IAM 凭据来检查 IAM 权限。

第 3 步:初始化 SST 项目

更新项目根目录中的 sst.config.ts 文件:

export default $config({
	app(input) {
		return {
			name: "nextdevkit-aws-template",
			removal: input?.stage === "production" ? "retain" : "remove",
			protect: ["production"].includes(input?.stage),
			home: "aws",
			providers: {
				cloudflare: "6.3.1",
				aws: { version: "6.83.0", region: "us-east-1" },
			},
		};
	},
  async run() {
		const vpc = new sst.aws.Vpc("YourVpcName", {
			/// ...
		});
		const database = new sst.aws.Postgres("YourDatabaseName", {
			/// ...
		});
		const bucket = new sst.aws.Bucket(
			"YourBucketName",
			{
				/// ...
			}
		);
		const migrator = new sst.aws.Function("YourMigratorName", {
			handler: "src/database/migrator.handler",
			link: [database],
			vpc,
			/// ...
		});
		if (!$dev) {
			new aws.lambda.Invocation("DatabaseMigratorInvocation", {
				input: Date.now().toString(),
				functionName: migrator.name,
			});
		}
		new sst.aws.Nextjs("YourNextjsSiteName", {
			link: [database, bucket],
			vpc,
			domain: {
				name: "your-domain.com",
				dns: sst.cloudflare.dns({
					proxy: true,
				}),
			},
			environment: {
				NEXT_PUBLIC_AVATARS_BUCKET_NAME: bucket.name,
			},
		});
		new sst.x.DevCommand("DrizzleStudio", {
			link: [database],
			dev: {
				command: "npx drizzle-kit studio",
			},
		});
	},
});

如果您更改了数据库名称,需要更新 drizzle.config.ts 文件和 src/database/client 文件资源名称。

如果您不想使用 cloudflare dns,可以删除 domain.dns 属性。您可以参考 SST AWS DNS 了解更多关于 dns 的信息。

第 4 步:配置数据库

如果使用 AWS RDS 作为您的数据库,您可以参考数据库指南了解更多关于数据库设置的信息。

更新 sst.config.ts 文件以包含 RDS 配置。

# 将数据库密码设置为密钥
npx sst secret set NextDevKitDBPassword your-secure-password

如果您想更改密钥名称,需要在 database 属性中更新 sst.config.ts 文件。

更新您的 sst.config.ts 以包含 RDS 配置:

// 添加到您的 sst.config.ts
const database = new sst.aws.Postgres("NextDevKitDB", {
  instance: "t4g.micro",
  storage: "20 GB",
  version: "16.4",
  vpc,
  proxy: true,
  // 在此设置您的密钥名称
  password: new sst.Secret("NextDevKitDBPassword").value,
});

第 5 步:设置生产密钥

如果您想使用 SST 配置生产密钥,可以在 sst.config.ts 文件中设置密钥。

# 设置生产环境变量
npx sst secret set BETTER_AUTH_SECRET your-32-character-secret-key
npx sst secret set RESEND_API_KEY re_your_resend_api_key
npx sst secret set STRIPE_SECRET_KEY sk_live_your_stripe_secret_key
npx sst secret set GITHUB_CLIENT_SECRET your-github-client-secret
npx sst secret set GOOGLE_CLIENT_SECRET your-google-client-secret
new sst.aws.Nextjs("NextDevKitWeb", {
  link: [database, bucket],
  vpc,
  domain: {
    name: "aws.nextdevkit.com",
    dns: sst.cloudflare.dns({
      proxy: true,
    }),
  },
  environment: {
    NEXT_PUBLIC_AVATARS_BUCKET_NAME: bucket.name,
    // 在此设置您的密钥环境变量
    BETTER_AUTH_SECRET: $dev ? process.env.BETTER_AUTH_SECRET : new sst.Secret("BETTER_AUTH_SECRET").value,
    RESEND_API_KEY: $dev ? process.env.RESEND_API_KEY : new sst.Secret("RESEND_API_KEY").value,
    STRIPE_SECRET_KEY: $dev ? process.env.STRIPE_SECRET_KEY : new sst.Secret("STRIPE_SECRET_KEY").value,
    GITHUB_CLIENT_SECRET: $dev ? process.env.GITHUB_CLIENT_SECRET : new sst.Secret("GITHUB_CLIENT_SECRET").value,
    GOOGLE_CLIENT_SECRET: $dev ? process.env.GOOGLE_CLIENT_SECRET : new sst.Secret("GOOGLE_CLIENT_SECRET").value,
  },
});

第 6 步:部署到 AWS

# 部署到开发环境
npx sst dev

# 部署到生产环境
npx sst deploy --stage production

第 7 步:数据库迁移

部署后运行数据库迁移:

# 生成迁移文件
pnpm run db:generate

迁移在部署期间自动应用

if (!$dev) {
  new aws.lambda.Invocation("DatabaseMigratorInvocation", {
    input: Date.now().toString(),
    functionName: migrator.name,
  });
}

SST 配置在部署期间使用 Lambda 函数自动处理数据库迁移。

第 8 步:更改为 ECS 部署

要在容器中部署我们的 Next.js 应用,我们将使用 AWS Fargate 和 Amazon ECS。替换您的 sst.config.ts 中的 run 函数。

async run() {
  const vpc = new sst.aws.Vpc("MyVpc");
  const cluster = new sst.aws.Cluster("MyCluster", { vpc });

  new sst.aws.Service("MyService", {
    cluster,
    loadBalancer: {
      ports: [{ listen: "80/http", forward: "3000/http" }],
    },
    dev: {
      command: "npm run dev",
    },
  });
}

有关 ECS 部署的更多信息,您可以参考 SST AWS ECS 了解更多关于 ECS 部署的信息。

🎉 下一步

现在您的 NEXTDEVKIT 已部署在 AWS 上,您可以:

  1. 🔧 配置监控:设置 CloudWatch 警报和仪表板
  2. 🔐 安全审查:审核 IAM 权限和安全组
  3. 📊 性能:监控 Lambda 指标并优化
  4. 💰 成本管理:设置计费警报和成本跟踪
  5. 🚀 扩展:添加更多区域并优化增长

其他资源

您的 NEXTDEVKIT 应用程序现在运行在企业级 AWS 基础设施上!🌟🚀