1. 准备工作

1.1 购买阿里云ECS服务器

  • 进入阿里云官网,选择“云服务器ECS”。
  • 推荐配置:2核4GB内存(或最低1核2GB),系统盘40GB,操作系统选择 Ubuntu 20.04 64位(或CentOS 7/8,本文以Ubuntu为例)。
  • 安全组配置:在创建实例时,或之后在安全组规则中,放行22端口(SSH)、80端口(HTTP)、443端口(HTTPS,如果需要)
  • 购买后,获取服务器的公网IP。

1.2 本地准备

  • 确保您的项目代码已完整并测试通过。
  • 记录数据库文件路径(默认为 instance/goals.db),后续需要设置权限。

2. 连接服务器

使用SSH客户端(如终端、PuTTY、Xshell)连接服务器:

ssh root@你的服务器公网IP

(如果使用普通用户,替换root为用户名)


3. 安装基础环境

3.1 更新系统包

apt update && apt upgrade -y

3.2 安装Python3、pip、虚拟环境工具

apt install python3 python3-pip python3-venv -y

3.3 安装Nginx

apt install nginx -y
systemctl start nginx
systemctl enable nginx

访问 http://你的服务器IP 应看到Nginx欢迎页。

3.4 安装git(可选,用于代码拉取)

apt install git -y

4. 上传项目代码

方法一:使用scp(从本地复制到服务器)

在本地终端执行:

scp -r /本地路径/goal_tracker root@你的服务器IP:/root/

(如果使用普通用户,替换root和路径)

方法二:使用git

如果代码已托管到Git仓库,在服务器上:

cd /root
git clone 你的仓库地址

假设项目目录为 /root/goal_tracker


5. 配置Python虚拟环境并安装依赖

cd /root/goal_tracker
python3 -m venv venv
source venv/bin/activate
pip install flask python-dateutil gunicorn

注:gunicorn 用于生产部署。


6. 配置环境变量(SECRET_KEY)

Flask 需要设置一个安全的 SECRET_KEY,建议通过环境变量设置。创建 .env 文件(或直接在shell中export),但为了持久化,可以写入系统环境变量或使用 .env 文件。

创建 .env 文件:

cat > /root/goal_tracker/.env << EOF
SECRET_KEY=$(openssl rand -hex 32)
EOF

然后在 app.py 中读取该文件(需安装 python-dotenv)或直接在代码中从环境变量获取。简单起见,可以在 app.py 中修改:

import os
app.secret_key = os.environ.get('SECRET_KEY', 'your-secret-key-here')  # 生产务必从环境变量获取

并确保在启动服务前设置环境变量(后续在systemd服务文件中设置)。


7. 测试运行

7.1 修改app.py监听地址

app.py 末尾,将 app.run() 修改为:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=False)   # 关闭debug

7.2 运行测试

cd /root/goal_tracker
source venv/bin/activate
python app.py

此时在本地浏览器访问 http://服务器IP:5000,应能看到系统登录页面。如果无法访问,检查阿里云安全组是否放行5000端口(测试完成后建议关闭,或使用Nginx反向代理)。


8. 配置Gunicorn

Gunicorn 作为WSGI服务器,可以更好地处理并发请求。

8.1 测试Gunicorn启动

cd /root/goal_tracker
source venv/bin/activate
gunicorn -w 4 -b 127.0.0.1:8000 app:app
  • -w 4:启动4个工作进程(根据CPU核心数调整)
  • -b 127.0.0.1:8000:监听本地8000端口,等待Nginx转发
  • app:app:模块名:Flask实例名

访问 http://服务器IP:8000 应能看到页面,但此时只能通过本地访问(127.0.0.1),需配合Nginx对外暴露。


9. 配置Nginx反向代理

9.1 创建Nginx站点配置文件

vim /etc/nginx/sites-available/goal_tracker

写入以下内容(注意修改 server_name 为你的域名或IP):

server {
    listen 80;
    server_name 你的服务器IP;   # 如果有域名,填写域名

    location / {
        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;
    }

    # 静态文件(如果有)可以直接由Nginx处理
    location /static {
        alias /root/goal_tracker/static;
        expires 30d;
    }
}

9.2 启用站点

ln -s /etc/nginx/sites-available/goal_tracker /etc/nginx/sites-enabled/
nginx -t          # 测试配置
systemctl reload nginx

现在访问 http://你的服务器IP,应该看到系统首页。


10. 使用Systemd管理Gunicorn服务

为了让应用在后台持续运行并开机自启,创建systemd服务文件。

10.1 创建服务文件

vim /etc/systemd/system/goal_tracker.service

内容如下(注意路径和用户):

[Unit]
Description=Gunicorn instance to serve goal tracker
After=network.target

[Service]
User=root
Group=root
WorkingDirectory=/root/goal_tracker
Environment="PATH=/root/goal_tracker/venv/bin"
Environment="SECRET_KEY=你的随机密钥"   # 或者从文件读取
ExecStart=/root/goal_tracker/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 app:app

[Install]
WantedBy=multi-user.target

注意:将 Environment="SECRET_KEY=..." 替换为实际的密钥,或通过其他方式设置。

10.2 启动并设置开机自启

systemctl start goal_tracker
systemctl enable goal_tracker
systemctl status goal_tracker   # 查看状态

11. 设置文件权限

SQLite数据库文件需要可写权限。默认位置为 instance/goals.db,需确保运行用户(root)有读写权限:

chown -R root:root /root/goal_tracker/instance
chmod 755 /root/goal_tracker/instance

如果数据库文件已存在,也需设置权限:

chmod 664 /root/goal_tracker/instance/goals.db

12. 配置防火墙(可选但推荐)

如果系统防火墙(如UFW)已启用,放行80端口:

ufw allow 80/tcp
ufw allow 22/tcp   # SSH
ufw enable

阿里云安全组已放行80和22,系统防火墙可以保持关闭或相应配置。


13. 配置域名和HTTPS(可选)

13.1 购买域名并解析

  • 在域名服务商处将域名解析到服务器IP。

13.2 修改Nginx配置中的 server_name 为域名

server_name yourdomain.com;

13.3 申请SSL证书(Let’s Encrypt)

安装Certbot:

apt install certbot python3-certbot-nginx -y
certbot --nginx -d yourdomain.com

按照提示完成证书申请,Certbot会自动修改Nginx配置启用HTTPS。


14. 数据库备份策略

SQLite是一个文件,定期备份即可。可编写cron任务每天备份:

crontab -e

添加一行(每天凌晨2点备份):

0 2 * * * cp /root/goal_tracker/instance/goals.db /root/backups/goals_$(date +\%Y\%m\%d).db

记得提前创建 /root/backups 目录。


15. 日志管理

  • Gunicorn的日志默认输出到journal,可使用 journalctl -u goal_tracker 查看。
  • Nginx日志在 /var/log/nginx/access.logerror.log
  • 可配置logrotate管理日志轮转。

16. 常见问题排查

16.1 访问出现502 Bad Gateway

  • 检查Gunicorn是否运行:systemctl status goal_tracker
  • 查看Gunicorn日志:journalctl -u goal_tracker -f
  • 确认Nginx反向代理地址是否正确(127.0.0.1:8000)

16.2 静态文件404

  • 检查Nginx配置中 location /static 的路径是否正确。
  • 确认静态文件目录权限是否可读。

16.3 数据库无法写入

  • 检查instance目录和数据库文件的权限。
  • 查看应用日志是否有权限错误。

16.4 无法登录/注册

  • 检查数据库是否初始化(表结构是否存在)。
  • 可手动删除数据库文件重启应用,系统会自动重建表。

17. 部署完成

现在您的目标管理系统已正式上线。可以通过域名或IP访问,所有数据持久化存储,服务自动重启。

如需更新代码,重新拉取或上传后,重启Gunicorn即可:

systemctl restart goal_tracker

如有任何问题,欢迎查阅阿里云文档或咨询技术支持。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐