# Ubuntu服务器部署指南

## 1. 准备服务器环境

```bash
# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装必要软件
sudo apt install python3 python3-pip python3-venv nginx postgresql postgresql-contrib git -y

# 创建项目目录
sudo mkdir -p /var/www/tech_portal
sudo chown $USER:$USER /var/www/tech_portal
```

## 2. 上传项目文件

```bash
# 方法1: 使用git克隆
cd /var/www/tech_portal
git clone [your_git_repository] .

# 方法2: 使用scp上传
# 在本地执行：
# scp -r /path/to/tech_portal/ user@server_ip:/var/www/
```

## 3. 配置Python环境

```bash
cd /var/www/tech_portal

# 创建虚拟环境
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate

# 安装依赖
pip install -r requirements.txt

# 如果没有requirements.txt，手动安装：
pip install django gunicorn psycopg2-binary pillow
```

## 4. 配置数据库

```bash
# 切换到postgres用户
sudo -i -u postgres

# 创建数据库和用户
createdb tech_portal_db
createuser --interactive

# 设置用户密码
psql
ALTER USER tech_portal_user PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE tech_portal_db TO tech_portal_user;
\q

# 退出postgres用户
exit
```

## 5. 修改Django设置

编辑 `tech_portal/settings.py`：

```python
ALLOWED_HOSTS = ['your_domain.com', 'www.your_domain.com', 'server_ip']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'tech_portal_db',
        'USER': 'tech_portal_user',
        'PASSWORD': 'your_password',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

STATIC_ROOT = '/var/www/tech_portal/static/'
MEDIA_ROOT = '/var/www/tech_portal/media/'
```

## 6. 初始化Django

```bash
cd /var/www/tech_portal

# 激活虚拟环境
source venv/bin/activate

# 数据库迁移
python manage.py makemigrations
python manage.py migrate

# 收集静态文件
python manage.py collectstatic --noinput

# 创建超级用户
python manage.py createsuperuser

# 测试Django运行
python manage.py runserver 0.0.0.0:8000
```

## 7. 配置Gunicorn

```bash
# 复制服务文件
sudo cp deploy/gunicorn.service /etc/systemd/system/

# 修改文件权限
sudo chown www-data:www-data /var/www/tech_portal -R

# 启动并启用服务
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn

# 检查服务状态
sudo systemctl status gunicorn
```

## 8. 配置Nginx

```bash
# 复制配置文件
sudo cp deploy/nginx_site.conf /etc/nginx/sites-available/tech_portal

# 创建软链接
sudo ln -s /etc/nginx/sites-available/tech_portal /etc/nginx/sites-enabled/

# 删除默认配置（可选）
sudo rm /etc/nginx/sites-enabled/default

# 测试配置
sudo nginx -t

# 重启nginx
sudo systemctl restart nginx
sudo systemctl enable nginx
```

## 9. 配置防火墙

```bash
# 启用防火墙
sudo ufw enable

# 允许SSH
sudo ufw allow OpenSSH

# 允许HTTP和HTTPS
sudo ufw allow 'Nginx Full'

# 检查状态
sudo ufw status
```

## 10. 常用命令

### 查看日志
```bash
# Gunicorn日志
sudo journalctl -u gunicorn -f

# Nginx日志
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log
```

### 重启服务
```bash
# 重启Gunicorn
sudo systemctl restart gunicorn

# 重启Nginx
sudo systemctl restart nginx

# 重新加载Nginx配置
sudo systemctl reload nginx
```

### 更新代码
```bash
cd /var/www/tech_portal
source venv/bin/activate

# 拉取更新
git pull origin main

# 重新收集静态文件
python manage.py collectstatic --noinput

# 数据库迁移（如果有）
python manage.py migrate

# 重启服务
sudo systemctl restart gunicorn
```

## 故障排除

### 常见问题

1. **Gunicorn无法启动**
   - 检查虚拟环境路径是否正确
   - 确认用户权限设置
   - 查看系统日志：`sudo journalctl -u gunicorn -n 50`

2. **Nginx 502 Bad Gateway**
   - 确认Gunicorn服务正在运行
   - 检查socket文件权限
   - 查看Nginx错误日志

3. **静态文件无法加载**
   - 确认静态文件路径配置正确
   - 运行 `python manage.py collectstatic`
   - 检查文件权限

4. **数据库连接错误**
   - 确认PostgreSQL服务运行
   - 检查数据库用户权限
   - 验证连接参数

### 安全建议

1. 定期更新系统和软件包
2. 使用强密码
3. 配置SSH密钥认证
4. 启用HTTPS（使用Let's Encrypt）
5. 定期备份数据库
6. 监控服务器资源使用情况