system-environment-setup
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSystem & Environment Setup
系统与环境设置
When to use this skill
何时使用此技能
- 신규 프로젝트: 초기 환경 설정
- 팀 온보딩: 새 개발자 환경 통일
- 다중 서비스: 마이크로서비스 로컬 실행
- 프로덕션 재현: 로컬에서 프로덕션 환경 테스트
- 新项目:初始环境配置
- 团队入职:统一新开发人员环境
- 多服务:微服务本地运行
- 生产环境复现:在本地测试生产环境
Instructions
操作步骤
Step 1: Docker Compose 설정
步骤1:Docker Compose配置
docker-compose.yml:
yaml
version: '3.8'
services:
# Web Application
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DATABASE_URL=postgresql://postgres:password@db:5432/myapp
- REDIS_URL=redis://redis:6379
volumes:
- .:/app
- /app/node_modules
depends_on:
- db
- redis
command: npm run dev
# PostgreSQL Database
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
# Redis Cache
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
# Nginx (Reverse Proxy)
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- web
volumes:
postgres_data:
redis_data:사용:
bash
undefineddocker-compose.yml:
yaml
version: '3.8'
services:
# Web Application
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DATABASE_URL=postgresql://postgres:password@db:5432/myapp
- REDIS_URL=redis://redis:6379
volumes:
- .:/app
- /app/node_modules
depends_on:
- db
- redis
command: npm run dev
# PostgreSQL Database
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
# Redis Cache
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
# Nginx (Reverse Proxy)
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- web
volumes:
postgres_data:
redis_data:使用:
bash
undefined모든 서비스 시작
모든 서비스 시작
docker-compose up -d
docker-compose up -d
로그 확인
로그 확인
docker-compose logs -f web
docker-compose logs -f web
특정 서비스만 재시작
특정 서비스만 재시작
docker-compose restart web
docker-compose restart web
중지 및 제거
중지 및 제거
docker-compose down
docker-compose down
볼륨까지 제거
볼륨까지 제거
docker-compose down -v
undefineddocker-compose down -v
undefinedStep 2: 환경변수 관리
步骤2:环境变量管理
.env.example:
bash
undefined.env.example:
bash
undefinedApplication
Application
NODE_ENV=development
PORT=3000
APP_URL=http://localhost:3000
NODE_ENV=development
PORT=3000
APP_URL=http://localhost:3000
Database
Database
DATABASE_URL=postgresql://postgres:password@localhost:5432/myapp
DATABASE_POOL_SIZE=10
DATABASE_URL=postgresql://postgres:password@localhost:5432/myapp
DATABASE_POOL_SIZE=10
Redis
Redis
REDIS_URL=redis://localhost:6379
REDIS_URL=redis://localhost:6379
JWT
JWT
ACCESS_TOKEN_SECRET=change-me-in-production-min-32-characters
REFRESH_TOKEN_SECRET=change-me-in-production-min-32-characters
TOKEN_EXPIRY=15m
ACCESS_TOKEN_SECRET=change-me-in-production-min-32-characters
REFRESH_TOKEN_SECRET=change-me-in-production-min-32-characters
TOKEN_EXPIRY=15m
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASSWORD=your-app-password
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASSWORD=your-app-password
External APIs
External APIs
STRIPE_SECRET_KEY=sk_test_xxx
STRIPE_PUBLISHABLE_KEY=pk_test_xxx
AWS_ACCESS_KEY_ID=AKIAXXXXXXX
AWS_SECRET_ACCESS_KEY=xxxxxxxx
AWS_REGION=us-east-1
**.env** (로컬에서만, gitignore에 추가):
```bashSTRIPE_SECRET_KEY=sk_test_xxx
STRIPE_PUBLISHABLE_KEY=pk_test_xxx
AWS_ACCESS_KEY_ID=AKIAXXXXXXX
AWS_SECRET_ACCESS_KEY=xxxxxxxx
AWS_REGION=us-east-1
**.env**(仅在本地使用,添加到gitignore):
```bash.gitignore
.gitignore
.env
.env.local
.env.*.local
**환경변수 로드** (Node.js):
```typescript
import dotenv from 'dotenv';
import path from 'path';
// Load .env file
dotenv.config();
// Type-safe environment variables
interface Env {
NODE_ENV: 'development' | 'production' | 'test';
PORT: number;
DATABASE_URL: string;
REDIS_URL: string;
ACCESS_TOKEN_SECRET: string;
}
function loadEnv(): Env {
const required = ['DATABASE_URL', 'ACCESS_TOKEN_SECRET', 'REDIS_URL'];
for (const key of required) {
if (!process.env[key]) {
throw new Error(`Missing required environment variable: ${key}`);
}
}
return {
NODE_ENV: (process.env.NODE_ENV as any) || 'development',
PORT: parseInt(process.env.PORT || '3000'),
DATABASE_URL: process.env.DATABASE_URL!,
REDIS_URL: process.env.REDIS_URL!,
ACCESS_TOKEN_SECRET: process.env.ACCESS_TOKEN_SECRET!
};
}
export const env = loadEnv();.env
.env.local
.env.*.local
**加载环境变量** (Node.js):
```typescript
import dotenv from 'dotenv';
import path from 'path';
// Load .env file
dotenv.config();
// Type-safe environment variables
interface Env {
NODE_ENV: 'development' | 'production' | 'test';
PORT: number;
DATABASE_URL: string;
REDIS_URL: string;
ACCESS_TOKEN_SECRET: string;
}
function loadEnv(): Env {
const required = ['DATABASE_URL', 'ACCESS_TOKEN_SECRET', 'REDIS_URL'];
for (const key of required) {
if (!process.env[key]) {
throw new Error(`Missing required environment variable: ${key}`);
}
}
return {
NODE_ENV: (process.env.NODE_ENV as any) || 'development',
PORT: parseInt(process.env.PORT || '3000'),
DATABASE_URL: process.env.DATABASE_URL!,
REDIS_URL: process.env.REDIS_URL!,
ACCESS_TOKEN_SECRET: process.env.ACCESS_TOKEN_SECRET!
};
}
export const env = loadEnv();Step 3: Dev Container (VS Code)
步骤3:开发容器(Dev Container)(VS Code)
.devcontainer/devcontainer.json:
json
{
"name": "Node.js & PostgreSQL",
"dockerComposeFile": "../docker-compose.yml",
"service": "web",
"workspaceFolder": "/app",
"customizations": {
"vscode": {
"extensions": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"ms-azuretools.vscode-docker",
"prisma.prisma"
],
"settings": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"eslint.validate": ["javascript", "typescript"]
}
}
},
"forwardPorts": [3000, 5432, 6379],
"postCreateCommand": "npm install",
"remoteUser": "node"
}.devcontainer/devcontainer.json:
json
{
"name": "Node.js & PostgreSQL",
"dockerComposeFile": "../docker-compose.yml",
"service": "web",
"workspaceFolder": "/app",
"customizations": {
"vscode": {
"extensions": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"ms-azuretools.vscode-docker",
"prisma.prisma"
],
"settings": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"eslint.validate": ["javascript", "typescript"]
}
}
},
"forwardPorts": [3000, 5432, 6379],
"postCreateCommand": "npm install",
"remoteUser": "node"
}Step 4: Makefile (편의 명령어)
步骤4:Makefile(便捷命令)
Makefile:
makefile
.PHONY: help install dev build test clean docker-up docker-down migrate seed
help: ## Show this help
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
install: ## Install dependencies
npm install
dev: ## Start development server
npm run dev
build: ## Build for production
npm run build
test: ## Run tests
npm test
test-watch: ## Run tests in watch mode
npm test -- --watch
lint: ## Run linter
npm run lint
lint-fix: ## Fix linting issues
npm run lint -- --fix
docker-up: ## Start Docker services
docker-compose up -d
docker-down: ## Stop Docker services
docker-compose down
docker-logs: ## View Docker logs
docker-compose logs -f
migrate: ## Run database migrations
npm run migrate
migrate-create: ## Create new migration
@read -p "Migration name: " name; \
npm run migrate:create -- $$name
seed: ## Seed database
npm run seed
clean: ## Clean build artifacts
rm -rf dist node_modules coverage
reset: clean install ## Reset project (clean + install)사용:
bash
make help # 명령어 목록
make install # 의존성 설치
make dev # 개발 서버 시작
make docker-up # Docker 서비스 시작Makefile:
makefile
.PHONY: help install dev build test clean docker-up docker-down migrate seed
help: ## Show this help
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
install: ## Install dependencies
npm install
dev: ## Start development server
npm run dev
build: ## Build for production
npm run build
test: ## Run tests
npm test
test-watch: ## Run tests in watch mode
npm test -- --watch
lint: ## Run linter
npm run lint
lint-fix: ## Fix linting issues
npm run lint -- --fix
docker-up: ## Start Docker services
docker-compose up -d
docker-down: ## Stop Docker services
docker-compose down
docker-logs: ## View Docker logs
docker-compose logs -f
migrate: ## Run database migrations
npm run migrate
migrate-create: ## Create new migration
@read -p "Migration name: " name; \
npm run migrate:create -- $$name
seed: ## Seed database
npm run seed
clean: ## Clean build artifacts
rm -rf dist node_modules coverage
reset: clean install ## Reset project (clean + install)使用:
bash
make help # 명령어 목록
make install # 의존성 설치
make dev # 개발 서버 시작
make docker-up # Docker 서비스 시작Step 5: Infrastructure as Code (Terraform)
步骤5:基础设施即代码(IaC)(Terraform)
main.tf (AWS 예시):
hcl
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
backend "s3" {
bucket = "myapp-terraform-state"
key = "production/terraform.tfstate"
region = "us-east-1"
}
}
provider "aws" {
region = var.aws_region
}main.tf(AWS示例):
hcl
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
backend "s3" {
bucket = "myapp-terraform-state"
key = "production/terraform.tfstate"
region = "us-east-1"
}
}
provider "aws" {
region = var.aws_region
}VPC
VPC
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "${var.project_name}-vpc"
Environment = var.environment
}
}
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "${var.project_name}-vpc"
Environment = var.environment
}
}
RDS (PostgreSQL)
RDS (PostgreSQL)
resource "aws_db_instance" "postgres" {
identifier = "${var.project_name}-db"
engine = "postgres"
engine_version = "15.4"
instance_class = "db.t3.micro"
allocated_storage = 20
storage_encrypted = true
db_name = var.db_name
username = var.db_username
password = var.db_password
vpc_security_group_ids = [aws_security_group.db.id]
db_subnet_group_name = aws_db_subnet_group.main.name
backup_retention_period = 7
skip_final_snapshot = false
final_snapshot_identifier = "${var.project_name}-final-snapshot"
tags = {
Name = "${var.project_name}-db"
Environment = var.environment
}
}
resource "aws_db_instance" "postgres" {
identifier = "${var.project_name}-db"
engine = "postgres"
engine_version = "15.4"
instance_class = "db.t3.micro"
allocated_storage = 20
storage_encrypted = true
db_name = var.db_name
username = var.db_username
password = var.db_password
vpc_security_group_ids = [aws_security_group.db.id]
db_subnet_group_name = aws_db_subnet_group.main.name
backup_retention_period = 7
skip_final_snapshot = false
final_snapshot_identifier = "${var.project_name}-final-snapshot"
tags = {
Name = "${var.project_name}-db"
Environment = var.environment
}
}
ECS (Container Service)
ECS (Container Service)
resource "aws_ecs_cluster" "main" {
name = "${var.project_name}-cluster"
setting {
name = "containerInsights"
value = "enabled"
}
}
resource "aws_ecs_cluster" "main" {
name = "${var.project_name}-cluster"
setting {
name = "containerInsights"
value = "enabled"
}
}
Load Balancer
Load Balancer
resource "aws_lb" "main" {
name = "${var.project_name}-alb"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.alb.id]
subnets = aws_subnet.public[*].id
}
**variables.tf**:
```hcl
variable "project_name" {
description = "Project name"
type = string
default = "myapp"
}
variable "environment" {
description = "Environment (dev, staging, production)"
type = string
}
variable "aws_region" {
description = "AWS region"
type = string
default = "us-east-1"
}
variable "db_username" {
description = "Database username"
type = string
sensitive = true
}
variable "db_password" {
description = "Database password"
type = string
sensitive = true
}resource "aws_lb" "main" {
name = "${var.project_name}-alb"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.alb.id]
subnets = aws_subnet.public[*].id
}
**variables.tf**:
```hcl
variable "project_name" {
description = "Project name"
type = string
default = "myapp"
}
variable "environment" {
description = "Environment (dev, staging, production)"
type = string
}
variable "aws_region" {
description = "AWS region"
type = string
default = "us-east-1"
}
variable "db_username" {
description = "Database username"
type = string
sensitive = true
}
variable "db_password" {
description = "Database password"
type = string
sensitive = true
}Output format
输出格式
프로젝트 구조
项目结构
project/
├── .devcontainer/
│ └── devcontainer.json
├── docker-compose.yml
├── Dockerfile
├── Makefile
├── .env.example
├── .gitignore
├── terraform/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
└── README.mdproject/
├── .devcontainer/
│ └── devcontainer.json
├── docker-compose.yml
├── Dockerfile
├── Makefile
├── .env.example
├── .gitignore
├── terraform/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
└── README.mdConstraints
约束条件
필수 규칙 (MUST)
必须遵守的规则(MUST)
- .env.example 제공: 필요한 환경변수 목록
- .gitignore: .env 파일 절대 커밋하지 않음
- README.md: 설치 및 실행 방법 문서화
- 提供.env.example:包含所需环境变量列表
- .gitignore:绝对不要提交.env文件
- README.md:文档化安装和运行方法
금지 사항 (MUST NOT)
禁止事项(MUST NOT)
- Secrets 커밋 금지: .env, credentials 파일 절대 커밋하지 않음
- 하드코딩 금지: 모든 설정은 환경변수로
- 禁止提交机密信息:绝对不要提交.env、凭证文件
- 禁止硬编码:所有配置都通过环境变量实现
Best practices
最佳实践
- Docker Compose: 로컬 개발은 Docker Compose
- Volume Mount: 코드 변경 즉시 반영
- Health Checks: 서비스 준비 상태 확인
- Docker Compose:本地开发使用Docker Compose
- 卷挂载:代码变更即时生效
- 健康检查:检查服务就绪状态
References
参考资料
Metadata
元数据
버전
版本
- 현재 버전: 1.0.0
- 최종 업데이트: 2025-01-01
- 호환 플랫폼: Claude, ChatGPT, Gemini
- 当前版本:1.0.0
- 最后更新:2025-01-01
- 兼容平台:Claude, ChatGPT, Gemini
관련 스킬
相关技能
- deployment
- environment-setup
- deployment
- environment-setup
태그
标签
#environment-setup#Docker-Compose#dev-environment#IaC#Terraform#infrastructure#environment-setup#Docker-Compose#dev-environment#IaC#Terraform#infrastructureExamples
示例
Example 1: Basic usage
示例1:基础用法
<!-- Add example content here -->
<!-- 添加示例内容 -->
Example 2: Advanced usage
示例2:高级用法
<!-- Add advanced example content here -->
<!-- 添加高级示例内容 -->