# 阿里云服务器网站部署血泪史 > 从崩溃边缘到成功上线的完整记录 — 一部充满挫折与喜悦的部署史诗 --- ## 🎬 写在前面 这是一份真实的部署踩坑记录,记录了从阿里云 ECS 服务器购买到网站正式上线的全过程。期间经历了 MySQL 密码丢失、网站反复报错、数据表缺失等各种问题,整整折腾了将近两天一夜,多次想要放弃,最终在凌晨时分看到网站成功显示的那一刻,那种喜悦难以言表。 如果你正在部署网站,希望这篇文章能给你一些参考和鼓励——遇到问题很正常,坚持下去一定能成功! --- ## 📦 第一章:服务器购买与环境选择 ### 1.1 阿里云 ECS 购买 一切始于一个普通的下午。我像往常一样打开阿里云,挑选了一台 ECS 服务器: - **服务器**:阿里云 ECS - **系统**:CentOS / Alibaba Cloud Linux - **配置**:入门级即可,主要用于展示网站 买完服务器的那一刻,心里美滋滋的,感觉成功了一半。 ### 1.2 最初的梦想:Docker 部署 一开始,我雄心勃勃地想要用 Docker 部署,这样看起来更专业、更现代化。 我在本地研究了很久 Docker Compose 配置,写好了 Dockerfile,觉得一切都在掌握之中。 **然后,现实给了我一记重锤——** ```bash docker pull xxx/xxx:latest Error: connection timeout ``` 网络连接错误!国内访问 Docker Hub 总是超时,各种镜像加速也都试过了,还是不行。 > 💔 第一次挫败感袭来... **最终结论**:对于简单部署,直接用 Linux 系统更省事。Docker 虽好,但不是万能的。放弃 Docker,回归传统部署。 --- ## 📤 第二章:本地代码上传到服务器 ### 2.1 艰难的抉择:Git 仓库选哪个? 一开始想用 GitHub,但是国内访问速度太慢了。转念一想,用 Gitee(码云)吧,毕竟是国内厂商,速度快。 ### 2.2 本地操作 — 反复尝试 ```bash # 初始化 Git 仓库(如果没有) cd /你的项目目录 git init git add . git commit -m "initial commit" # 添加远程仓库 git remote add gitee https://gitee.com/neachnow/szr-website.git # 第一次推送,紧张得手心冒汗 git push -u gitee master ``` 看到 "push successful" 的那一刻,又看到了希望的曙光! ### 2.3 阿里云服务器操作 ```bash # 先装 Git yum install -y git # 克隆仓库 cd /home/admin git clone https://gitee.com/neachnow/szr-website.git # 进入项目目录 cd szr-website # 心情激动!代码终于传到服务器了! ``` --- ## 🐬 第三章:MySQL 数据库安装与配置 — 噩梦的开始 ### 3.1 安装 MySQL 按照常规流程安装 MySQL: ```bash yum install -y mysql-server systemctl start mysqld systemctl enable mysqld ``` 看起来一切顺利! ### 3.2 初始密码问题 — 真正的噩梦开始了 安装完成后,我尝试登录 MySQL: ```bash mysql -u root -p ``` **然后输入我不知道的密码...** 试了 N 多种可能: - root - password - 123456 - 服务器密码 - 空密码 全部失败! > 😱 那一刻是崩溃的... ### 3.3 深夜的挣扎 时间一分一秒地过去,已经凌晨一两点了。连续尝试了各种方法: - 查看 MySQL 初始日志 - 搜索各种"忘记 MySQL 密码"的教程 - 尝试各种重置方法 大部分方法都需要先停止 MySQL,但是 systemctl stop mysqld 后又无法以特殊模式启动。 ### 3.4 冲动与冷静 一度想要直接删除 MySQL 重新安装: ```bash yum remove -y mysql-server yum remove -y mysql ``` **但理智告诉我,这样可能会造成更大的灾难...** > 🌙 深夜两点,带着疲惫和挫败感,决定先去睡觉... > > 也许睡着了醒来就有办法了呢? ### 3.5 醒来后的转机 — AI 指点迷津 第二天醒来,问了 AI 这个问题。AI 给了我一个方案——使用 MySQL 安全模式。 ### 3.6 安全模式重置密码 — 终于成功了! ```bash # 1. 停止 MySQL systemctl stop mysqld # 2. 以安全模式启动(跳过了权限验证) mysqld_safe --skip-grant-tables & # 3. 无需密码登录! mysql -u root # 4. 在 MySQL 命令行中执行: FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'openclaw@2026!'; EXIT; # 5. 正常重启 MySQL systemctl restart mysqld ``` **当 `mysql -u root -p` 成功登录的那一刻!** > 🎉 那种感觉,就像中了彩票一样! ### 3.7 创建数据库 ```bash mysql -u root -p'openclaw@2026!' -e "CREATE DATABASE IF NOT EXISTS szr_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" ``` --- ## 🐍 第四章:Python 环境搭建 ### 4.1 创建虚拟环境 ```bash cd /home/admin/szr-website python3 -m venv venv source venv/bin/activate ``` ### 4.2 安装依赖 ```bash pip install -r requirements.txt ``` **又出错了!** ``` Could not find a version that satisfies the requirement Flask>=2.3.0 No matching distribution found for Flask>=2.3.0 ``` 查了一下,是 pip 源的问题。Python 3.6 版本太老了,很多新包不支持。 > 😅 真的是一波未平,一波又起... 最终手动调整了 requirements.txt,降低了版本要求,总算安装成功了。 --- ## 📊 第五章:建表问题 — 关键的疏忽 ### 5.1 网站启动啦! 一切就绪,启动网站: ```bash source venv/bin/activate export MYSQL_PASSWORD='openclaw@2026!' export MYSQL_DATABASE='szr_db' flask run --host=0.0.0.0 --port=5000 ``` 访问 http://116.62.123.230:5000... **网站显示了!!!** > 🤩 那一刻激动得跳起来! ### 5.2 高兴得太早了... 但是很快发现了问题: - ❌ 注册用户失败 - ❌ 探索页面报错 - ❌ 服务器 500 错误 ### 5.3 各种错误尝试 ``` pymysql.err.OperationalError: (1054, "Unknown column 'users.password_hash' in 'field list'") ``` **什么?!数据库里没有 password_hash 字段??** 我明明创建了数据库啊! ### 5.4 真相大白 原来,我虽然执行了 `CREATE DATABASE szr_db`,但是只创建了空的数据库,**忘记执行建表脚本 `db_setup.py`!** > 🤦♂️ 这是多么低级的错误!但却真实发生了... ### 5.5 第一次执行 db_setup.py ```bash cd /home/admin/szr-website python db_setup.py ``` 输出: ``` ✓ 数据库 szr_db 已创建 ✓ users 表已创建 ✓ activity_types 表已创建 ✓ activities 表已创建 ... ``` 太好了!这次应该没问题了! ### 5.6 Too Naive 重启网站,又报错了... ``` pymysql.err.OperationalError: (1824, "Failed to open the referenced table 'users'") ``` 表结构不匹配!原来之前已经建过一些表了,现在新旧表混在一起,乱套了。 ### 5.7 删库重建 一怒之下,决定全部推倒重来: ```bash mysql -u root -p'openclaw@2026!' -e "DROP DATABASE IF EXISTS szr_db;" cd /home/admin/szr-website python db_setup.py ``` 这次终于所有表都创建成功了! ### 5.8 探索页面又挂了 注册功能正常了,但是访问 /explore 页面时又报错: ``` pymysql.err.OperationalError: (1054, "Unknown column 'routes.map_center' in 'field list'") ``` **还有完没完了!!!** 原来服务器上的 db_setup.py 是旧版本,和我本地的不一样! ### 5.9 同步代码 ```bash git pull origin master --allow-unrelated-histories python db_setup.py ``` 网站终于可以正常访问了! > 😅 此时已经是凌晨,折腾了整整两天... --- ## ⚙️ 第六章:Gunicorn 配置 ### 6.1 安装 Gunicorn ```bash pip install gunicorn ``` ### 6.2 直接启动测试 ```bash cd /home/admin/szr-website source venv/bin/activate export MYSQL_PASSWORD='openclaw@2026!' export MYSQL_DATABASE='szr_db' gunicorn -w 4 -b 0.0.0.0:5000 --timeout 120 "app:app" ``` 成功!但是关闭窗口服务就停了,需要后台运行。 ### 6.3 Systemd 服务配置 创建了 `/home/admin/szr-website/szr-website.service`: ```ini [Unit] Description=SZR Website Flask App After=network.target mysql.service [Service] Type=notify User=admin Group=admin WorkingDirectory=/home/admin/szr-website Environment="PATH=/home/admin/szr-website/venv/bin" Environment="MYSQL_PASSWORD=openclaw@2026!" Environment="MYSQL_DATABASE=szr_db" ExecStart=/home/admin/szr-website/venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 --timeout 120 "app:app" Restart=always RestartSec=10 [Install] WantedBy=multi-user.target ``` 安装服务: ```bash sudo cp /home/admin/szr-website/szr-website.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable szr-website sudo systemctl start szr-website ``` 现在可以用 `systemctl` 管理网站了! --- ## 🌐 第七章:Nginx 反向代理配置 ### 7.1 安装 Nginx ```bash yum install -y nginx systemctl start nginx systemystem enable nginx ``` ### 7.2 配置反向代理 创建 `/etc/nginx/conf.d/szr-website.conf`: ```nginx server { listen 80; server_name 116.62.123.230; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` ### 7.3 测试并重启 ```bash nginx -t systemctl restart nginx ``` ### 7.4 成功! 访问 http://116.62.123.230 **网站成功显示了!!!** > 🎉🎉🎉 那一刻的心情,真的无法用语言形容! > > 就像攀登者终于登上了珠穆朗玛峰! > 就像马拉松选手冲过了终点线! > 就像... 总之,太不容易了! --- ## 🔒 第八章:安全组配置 在阿里云控制台配置安全组: | 协议 | 端口 | 来源 | 说明 | |------|------|------|------| | TCP | 80 | 0.0.0.0/0 | HTTP | | TCP | 443 | 0.0.0.0/0 | HTTPS | | TCP | 22 | 0.0.0.0/0 | SSH | **重要**:5000 端口(gunicorn)不需要对公网开放!通过 Nginx 反向代理即可访问。 --- ## 🔄 第九章:代码更新与发布 ### 9.1 本地更新代码 ```bash git add . git commit -m "更新说明" git push gitee master ``` ### 9.2 服务器拉取更新 ```bash cd /home/admin/szr-website git fetch origin git reset --hard origin/master # 重启服务 sudo systemctl restart szr-website sudo systemctl restart nginx ``` --- ## 📝 第十章:经验总结 ### 10.1 踩过的坑 | 序号 | 坑 | 教训 | |------|-----|------| | 1 | Docker 镜像拉取失败 | 国内环境慎用 Docker Hub | | 2 | MySQL 密码丢失 | 初始密码要记录,安全模式可重置 | | 3 | 忘记执行 db_setup.py | 建表脚本是必须的! | | 4 | 服务器代码版本不一致 | 用 Git 同步代码 | | 5 | 表结构不匹配 | 重建数据库最省事 | | 6 | 5000 端口暴露 | 通过 Nginx 代理即可,不需要对外开放 | ### 10.2 关键命令 ```bash # 数据库 mysql -u root -p'密码' -e "SQL语句" python db_setup.py # 服务管理 sudo systemctl start|stop|restart szr-website sudo systemctl status szr-website journalctl -u szr-website -f # Nginx nginx -t sudo systemctl restart nginx # Git git pull origin master ``` --- ## 🎊 终章:最终效果 现在,网站已经成功上线! - 访问 https://116.62.123.230 即可查看 - 可以注册登录 - 可以浏览路线 - 可以创建和分享活动 - Nginx 反向代理已配置 - Gunicorn 后台服务运行中 **这一切来之不易!** 感谢过程中帮助我的每一个人,感谢 AI 的指点,最重要的是——**感谢自己没有放弃!** --- > 💡 如果你也在部署过程中遇到了困难,请记住: > > **坚持就是胜利!每一个坑都是成长的必经之路!** --- *本文档于 2026-03-13 完成,记录了整整两天的血泪奋斗史* *愿这份文档能帮助到更多需要的人*