Files
chengshishouce/DEPLOYMENT.md

473 lines
7.8 KiB
Markdown
Raw Normal View History

# 城市手册项目部署指南
## 部署前准备
### 1. 环境要求
- Python 3.11+
- Node.js 18+
- PostgreSQL 15+
- Docker & Docker Compose可选
- Nginx可选
### 2. 数据库配置
```bash
# 创建数据库
createdb citywiki
# 或使用 Docker
docker run -d \
--name citywiki-db \
-e POSTGRES_DB=citywiki \
-e POSTGRES_USER=citywiki \
-e POSTGRES_PASSWORD=your_password \
-p 5432:5432 \
postgres:15-alpine
```
### 3. 环境变量配置
复制 `.env.example``.env` 并配置:
```env
# Django Settings
DJANGO_SECRET_KEY=your-secret-key-here
DJANGO_DEBUG=False
# Database
DB_NAME=citywiki
DB_USER=citywiki
DB_PASSWORD=your_password
DB_HOST=localhost
DB_PORT=5432
# Allowed Hosts
ALLOWED_HOSTS=localhost,yourdomain.com
# CORS
CORS_ALLOWED_ORIGINS=http://localhost,https://yourdomain.com
# Email可选
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_HOST_USER=your-email@example.com
EMAIL_HOST_PASSWORD=your-email-password
```
---
## 部署方式
### 方式一Docker Compose推荐
#### 1. 构建镜像
```bash
docker-compose build
```
#### 2. 启动服务
```bash
docker-compose up -d
```
#### 3. 运行迁移
```bash
docker-compose exec backend python manage.py migrate
```
#### 4. 创建超级用户
```bash
docker-compose exec backend python manage.py createsuperuser
```
#### 5. 查看日志
```bash
docker-compose logs -f
```
#### 6. 停止服务
```bash
docker-compose down
```
---
### 方式二:手动部署
#### 后端部署
```bash
cd backend
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
# 配置环境变量
cp .env.example .env
# 编辑 .env 文件
# 运行迁移
python manage.py migrate
# 收集静态文件
python manage.py collectstatic --noinput
# 创建超级用户
python manage.py createsuperuser
# 启动服务(生产环境)
gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 3
```
#### 前端部署
```bash
cd frontend
# 安装依赖
npm install
# 配置环境变量
cp .env.example .env
# 编辑 .env 文件
# 构建
npm run build
```
---
### 方式三Nginx 部署
#### Nginx 配置
```nginx
server {
listen 80;
server_name yourdomain.com;
# 前端静态文件
location / {
root /path/to/frontend/build;
try_files $uri $uri/ /index.html;
}
# API 代理
location /api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# GraphQL 代理
location /graphql/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 静态文件
location /static/ {
alias /path/to/backend/staticfiles/;
}
# 媒体文件
location /media/ {
alias /path/to/backend/media/;
}
}
```
#### 启动服务
```bash
# 启动后端
cd backend
source venv/bin/activate
gunicorn config.wsgi:application --bind 127.0.0.1:8000 --workers 3
# 启动 Nginx
sudo nginx -t
sudo systemctl restart nginx
```
---
## 生产环境配置
### 1. Django 配置
```python
# config/settings/prod.py
DEBUG = False
# 安全设置
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_SSL_REDIRECT = True
# 允许的主机
ALLOWED_HOSTS = ['yourdomain.com']
# 数据库(使用 Unix socket 更快)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'citywiki',
'USER': 'citywiki',
'PASSWORD': 'your_password',
'HOST': '/var/run/postgresql',
'PORT': '',
}
}
```
### 2. Gunicorn 配置
创建 `gunicorn.conf.py`
```python
bind = "127.0.0.1:8000"
workers = 3
worker_class = "sync"
worker_connections = 1000
max_requests = 1000
max_requests_jitter = 50
timeout = 30
keepalive = 2
```
启动 Gunicorn
```bash
gunicorn -c gunicorn.conf.py config.wsgi:application
```
### 3. Systemd 服务(自动重启)
创建 `/etc/systemd/system/citywiki.service`
```ini
[Unit]
Description=CityWiki Django App
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/path/to/backend
ExecStart=/path/to/backend/venv/bin/gunicorn -c gunicorn.conf.py config.wsgi:application
Restart=always
[Install]
WantedBy=multi-user.target
```
启动服务:
```bash
sudo systemctl daemon-reload
sudo systemctl start citywiki
sudo systemctl enable citywiki
```
---
## 监控和日志
### 1. Django 日志配置
```python
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': '/var/log/citywiki/django.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'INFO',
'propagate': True,
},
},
}
```
### 2. Nginx 日志
```nginx
access_log /var/log/nginx/citywiki_access.log;
error_log /var/log/nginx/citywiki_error.log;
```
---
## 数据备份
### PostgreSQL 备份
```bash
# 备份
pg_dump -U citywiki citywiki > backup_$(date +%Y%m%d).sql
# 恢复
psql -U citywiki citywiki < backup_20260409.sql
```
### 媒体文件备份
```bash
rsync -avz /path/to/backend/media/ /backup/media/
```
---
## HTTPS 配置Let's Encrypt
```bash
# 安装 Certbot
sudo apt-get install certbot python3-certbot-nginx
# 获取证书
sudo certbot --nginx -d yourdomain.com
# 自动续期
sudo certbot renew --dry-run
```
---
## 性能优化
### 1. 数据库优化
```sql
-- 添加索引
CREATE INDEX idx_articles_region ON articles(region_id);
CREATE INDEX idx_articles_status ON articles(publish_status);
CREATE INDEX idx_services_region ON featured_services(region_id);
CREATE INDEX idx_services_status ON featured_services(publish_status);
CREATE INDEX idx_comments_target ON comments(target_type, target_id);
```
### 2. 缓存Redis
```bash
# 安装 Redis
sudo apt-get install redis-server
```
配置 Django 使用 Redis
```python
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
}
}
```
### 3. CDN 加速
使用 Cloudflare 或阿里云 CDN 加速静态文件访问。
---
## 故障排查
### 1. 数据库连接失败
```bash
# 检查 PostgreSQL 是否运行
sudo systemctl status postgresql
# 检查端口
sudo netstat -tuln | grep 5432
```
### 2. 静态文件 404
```bash
# 重新收集静态文件
cd backend
python manage.py collectstatic --noinput
```
### 3. Nginx 502 Bad Gateway
```bash
# 检查 Django 是否运行
ps aux | grep gunicorn
# 重启 Django
sudo systemctl restart citywiki
```
---
## 更新部署
```bash
# 拉取最新代码
git pull origin master
# 后端更新
cd backend
source venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py collectstatic --noinput
sudo systemctl restart citywiki
# 前端更新
cd frontend
npm install
npm run build
sudo systemctl restart nginx
```
---
## 安全检查清单
- [ ] 更改 Django SECRET_KEY
- [ ] 设置 DEBUG=False
- [ ] 配置 ALLOWED_HOSTS
- [ ] 启用 HTTPS
- [ ] 配置数据库防火墙
- [ ] 定期备份数据
- [ ] 更新依赖包
- [ ] 监控日志文件
- [ ] 配置 fail2ban
- [ ] 定期安全审计
---
## 参考资料
- [Django 部署指南](https://docs.djangoproject.com/en/4.2/howto/deployment/)
- [Gunicorn 文档](https://docs.gunicorn.org/en/stable/)
- [Nginx 文档](https://nginx.org/en/docs/)
- [Docker Compose 文档](https://docs.docker.com/compose/)