部署django项目
# 部署django项目
将 django 项目从windows迁移并部署到linux,本项目核心基于 django + vue3 + mysql搭建
本项目部署主要分为四步:1.传代码,2.配置环境3.传数据库4.配置并运行项目
此外在数据库迁移时出现了问题,因此还涉及 linux 的 python 源码编译安装,以及 mysql 的安装过程
项目目录:
<img src="/media/uploads/articles_image/202601/20260127_025104_image.png" height="500" alt="项目目录">
## 一、传代码
这一部分摘要:这一部分主要是通过 `requirements.txt` 提前备份版本,通过 git 将文件传到 linux 上
### 1.requirements.txt备份
首先在本地项目里生成一个requirements.txt文件,用来备份虚拟环境中用到的 python 库的版本:
```shell
pip freeze > requirements.txt
```
文件结构大概这样:
```Plaintext
asgiref==3.11.0 <-- 库名 == 版本号
cssselect==1.3.0
Django==6.0
...
```
### 2.把代码推送到 Gitee 或 GitHub
#### 1.1 创建.gitignore文件
不需要上传
venv 文件夹(虚拟环境)和 __pycache__ 文件夹
db.sqlite3: 数据
media: 用户上传文件目录
```Plaintext
venv/
__pycache__/
*.pyc
db.sqlite3
media/
.DS_Store
.vscode/
```
#### 1.2 上传
- 创建github仓库
- 在本地项目文件夹:
```bash
git init
git add .
git commit -m "首次部署"
git branch -M main
git remote add origin <你的仓库地址>
git push -u origin master
```
### 2 克隆代码
```bash
cd ~
git clone https://github.com/LuminovaBeta/my_blog_v1.git my_blog
```
如果github连接慢,直接告诉 Git 使用代理,防止以后直连出问题,克隆完成后,取消代理
```Bash
cd ~
git config --global http.proxy http://192.168.1.101:7890
git config --global https.proxy http://192.168.1.101:7890
git clone https://github.com/LuminovaBeta/my_blog_v1.git my_blog
git config --global --unset http.proxy
git config --global --unset https.proxy
```
## 二、配置虚拟环境和系统依赖
首先由于虚拟环境必须前提是电脑自己带的环境,因此需要装以下根项目的版本比较接近的python版本,如果版本差距比较大,建议装一下版本差不多的例如我的项目是`Python 3.12.4`,但是我的系统是 `Python 3.8.1`
这个时候就需要在保留系统自带 Python 3.8 的同时,安装你指定的 Python 3.12.4,因此需要使用 源码编译安装 (Source Compilation) 并配合 altinstall 命令。
源码构建官网教程地址
```url
https://devguide.python.org/getting-started/setup-building/#unix
```
1. 安装编译依赖
Python 编译需要很多底层库的支持(比如 SSL 加密、SQLite 数据库、解压支持等)。如果这一步缺了东西,装出来的 Python 会出现“缺胳膊少腿”的情况(比如 pip 用不了,或者连不上 HTTPS)。
```bash
sudo apt update
sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev liblzma-dev tk-dev uuid-dev libmysqlclient-dev
```
2. 下载Python源码
```bash
cd ~
wget https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tgz
tar -xvf Python-3.12.4.tgz
cd Python-3.12.4
```
3. 配置与编译
配置环境(开启优化):
```bash
./configure --enable-optimizations --with-lto
```
编译
```bash
make -j4
```
安装必须使用 altinstall,绝对不要用 install
```bash
sudo make altinstall
```
验证安装
```bash
python3 --version
# 输出应该是原版: Python 3.8.10
python3.12 --version
# 输出应该是: Python 3.12.4
```
4. 为你的项目创建**虚拟**环境
首先确保没有旧的虚拟环境
创建新的环境:
```bash
/usr/local/bin/python3.12 -m venv venv
```
激活环境:
```bash
source venv/bin/activate
```
5. 进入虚拟环境并安装依赖
根据 `requirements.txt` 文件安装依赖
```bash
sudo apt update
pip install -r requirements.txt
```

## 三、传数据库
由于本项目并没有用django默认的db.sqlite3,用的是MySQL
本次迁移windows上用的是 MySQL 8.0 香橙派上用的版本是 MariaDB 然后进行数据库传输
MySQL 是一个服务,不能直接把 Windows 里的文件夹复制到香橙派。你必须在香橙派上重新搭建一套一样的数据库环境,然后把数据导入进去。
### 1. 在香橙派上安装 MySQL 服务
#### 1.1 卸载旧的 MariaDB
检查版本:
```bash
mysql --version
```
这里我的输出是:(版本不合适)
```bash
mysql Ver 15.1 Distrib 10.3.39-MariaDB, for debian-linux-gnu (aarch64) using readline 5.2
```
如果当前有比较老的版本,比如 `10.3.39-MariaDB` 的话建议先卸载
```bash
# 停止服务
sudo systemctl stop mariadb
# 卸载软件
sudo apt purge mariadb-server mariadb-client mariadb-common -y
sudo apt autoremove -y
# 关键:删除旧数据目录(否则新版安装会冲突)
# 注意:这会删除你之前尝试导入的所有数据
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql
```
#### 1.1 安装 MySQL 8.0
##### 安装服务和开发库
```bash
cd ~
# 下载配置包
wget https://dev.mysql.com/get/mysql-apt-config_0.8.28-1_all.deb
# 安装配置包
sudo dpkg -i mysql-apt-config_0.8.28-1_all.deb
```
执行后会弹出蓝色菜单,直接选 OK(默认就是 MySQL 8.0)即可。


##### 正式安装
```bash
sudo apt update
sudo apt install mysql-server -y
```
如果刚刚删除过数据库这个时候直接运行安装命令可能会报错`mysqld: Can't read dir of '/etc/mysql/conf.d/'`
这是因为刚刚把整个 `/etc/mysql` 目录删除了,需要先创建 `sudo mkdir -p /etc/mysql/conf.d/`, `sudo mkdir -p /etc/mysql/mysql.conf.d/`
启动并进行安全配置
##### 检查
版本输出:
```bash
orangepi@orangepi5pro:~$ mysql --version
mysql Ver 8.0.42-0ubuntu0.20.04.1 for Linux on aarch64 ((Ubuntu))
```
后台是否启动?
```bash
sudo systemctl status mysql
```
#### 1.2 创建用户和数据库
创建root用户:
```bash
sudo mysql -u root -p
```
```python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'my_blog', # 数据库的名字
'USER': 'root', # 用户名
'PASSWORD': 'root', # 密码
'HOST': '127.0.0.1',# 地址
'PORT': 3306 # 端口
}
}
```
根据在 `setting.py` 创建一个不需要root权限登录的用户:
```SQL
-- 创建用户: 这里的 'my_blog_user' 和 'password' 对应你 settings.py 里的配置
CREATE USER 'my_blog_user'@'localhost' IDENTIFIED BY 'password';
-- 授予权限
GRANT ALL PRIVILEGES ON my_blog.* TO 'my_blog_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
```
创建数据库:
首先需要先进入数据库
```sql
show databases;
create database my_blog;
```
### 2.数据库迁移
#### 数据库版本兼容问题(弃)
在之前的版本兼容问题参考,可以忽略这一部分
在windows上用的是 MySQL 8.0 而香橙派上用的版本是 MariaDB 之间存在版本兼容性问题,并且如果你的数据库比较老的话,django 建表的命令会报错无法使用
主要是直接生成的 `.sql` 文件里面还包括很多SQL 的语法,这些 SQL 语法差异会导致迁移数据库报错,因此先用django自带的建表命令 `python manage.py migrate` 创建数据结构,再只导出“数据”,不导出“结构”
创建数据结构:
```bash
python manage.py makemigrations
python manage.py migrate
```
##### 问题与解决-加密验证驱动库安装
```bash
python manage.py makemigrations
python manage.py migrate
```
如果使用上面创建数据表的命令,报错:
```bash
# 报错信息
RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
```
解决(用清华园比较快):
```bash
pip install cryptography -i https://pypi.tuna.tsinghua.edu.cn/simple
```
#### 2.1 数据库导出
在原服务器上导出(Dump)仅导出数据文件,使用 mysqldump 工具将数据库打包成文件:
```bash
# 2. 使用 -r 确保编码是 UTF-8,避免之前的 \0 乱码报错
mysqldump -u root -p --databases my_blog -r my_blog_full.sql
```
#### 2.2 数据库导入
按照 `settings.py` 中的配置
上面已经在服务器上创建一个数据库,运行:
```bash
# my_blog_db 为真实数据库名称
sudo mysql -u root -p my_blog_db < blog_data_only.sql
sudo mysql -u root -p < /home/orangepi/my_blog_full.sql
```
#### 2.3 数据库检查
查看是否成功创建,运行:`use my_blog;`, `SHOW tables;` 看看输出全不全,可以根原数据库对比

## 四、运行项目
### 终端运行
#### 仅在本机访问
```bash
python manage.py runserver
```
- 默认端口:127.0.0.1:8000。
#### 允许局域网访问
```bash
python manage.py runserver 0.0.0.0:8000
```
- 0.0.0.0:告诉 Django 监听香橙派所有的网络接口。
- :8000:手动指定端口号。如果你想用别的端口(比如 8080),直接修改这个数字即可。
这个时候你可以尝试访问,但如果没有配置django项目应该会报错
##### 允许ip访问
打开 settings.py
找到 `ALLOWED_HOSTS` 这一行
原来的内容:
```python
ALLOWED_HOSTS = []
```
修改后的内容:
```python
ALLOWED_HOSTS = ['*']
```
### 服务运行
```bash
sudo vim /etc/systemd/system/my_blog.service
```
复制下面的内容进去
```
[Unit]
Description=Django My Blog Service
After=network.target mysql.service
[Service]
# 你的香橙派用户名
User=orangepi
# 项目根目录路径
WorkingDirectory=/home/orangepi/my_blog
# 使用虚拟环境里的 python 运行项目
ExecStart=/home/orangepi/my_blog/venv/bin/python /home/orangepi/my_blog/manage.py runserver 0.0.0.0:8000
# 崩溃后 5 秒自动重启
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
```
启动服务:
```bash
# 1. 重新加载系统配置,让它识别新写的服务
sudo systemctl daemon-reload
# 2. 启动博客服务
sudo systemctl start my_blog
# 3. 设置开机自启
sudo systemctl enable my_blog
# 4. 查看运行状态
sudo systemctl status my_blog
```
重启服务 `sudo systemctl daemon-reload`,`sudo systemctl restart my_blog`
## 五、用户 media 目录迁移
可以直接用命令 `scp` 完整的传过去
35
666
6324
2026-01-27