自己的电脑是windows有网络,怎么打包到linux离线服务器?
1、部署python
🛠️ 一、准备阶段:在 Windows 上制作“离线依赖包”
这一步的目的是在你的 Windows 电脑上,提前下载好项目需要的所有依赖库。
如何下载真正的依赖,而不是环境中的无关依赖呢?
最可靠的方法:用启动脚本触发加载后打印
第 1 步:先关掉正在运行的服务
在运行 程序 的那个终端里按 Ctrl + C 停掉它。
第 2 步:新建 check_modules.py
在你的项目目录 app\ 下,新建一个文件 check_modules.py,内容如下:
# check_modules.pyimport sys# 导入你的 FastAPI 应用入口,这会把所有依赖都加载进来from main import app# 收集所有已加载的顶级模块名modules = set()for m in sys.modules.keys(): top = m.split('.')[0] if not top.startswith('_'): modules.add(top)# 打印出来print("=" * 50)print("已加载的模块列表:")print("=" * 50)for mod in sorted(modules): print(mod)
如果你的 FastAPI 实例不是在 main.py 里的 app,请把 from main import app 改成你实际的位置,比如 from app import application。
第 3 步:运行这个脚本
python check_modules.py
这次它会真正导入你的整个项目(依赖),打印出的模块列表就是完整且准确的。
这个列表看起来很长,但其实大部分是 Python 标准库,不需要操心。
真正需要放进 requirements.txt 的第三方库,如:
需要离线安装的:
| | |
|---|
annotated_doc | annotated-doc | |
annotated_types | annotated-types | |
anyio | anyio | |
email_validator | email-validator | |
fastapi | fastapi | |
idna | idna | 国际域名处理,requests 或 httpx 会依赖 |
orjson | orjson | |
pydantic | pydantic | |
pydantic_core | pydantic-core | |
python_multipart | python-multipart | |
sniffio | sniffio | |
starlette | starlette | |
typing_extensions | typing-extensions | |
typing_inspection | typing-inspection | |
一步到位,直接生成 requirements.txt 文件:
pip freeze | findstr /I "annotated-doc annotated-types anyio email-validator fastapi idna orjson pydantic pydantic-core python-multipart sniffio starlette typing-extensions typing-inspection uvicorn pydantic-settings fastapi-sso sse-starlette" > requirements.txt
接下来,用这份清单下载 Linux 离线包
pip download -r requirements.txt -d ./offline_packages --platform manylinux2014_x86_64 --python-version 312 --only-binary=:all:
如果你的环境是 Python 3.12,所以 --python-version 312。
🛠️ 二、服务器部署,如何打包
只需要在服务器上额外安装打包工具(PyInstaller 或 Nuitka),然后直接用已有的 Python 环境打包就行。
一步到位:在 CentOS 8 服务器上直接打包
第 1 步:在 Windows 上下载打包工具的离线包
额外下载这些:
# 下载 PyInstaller 及其依赖(推荐,坑少)pip download pyinstaller -d ./offline_packages --platform manylinux2014_x86_64 --python-version 312 --only-binary=:all:# 如果觉得 PyInstaller 打包太慢,也可以选 Nuitkapip download nuitka -d ./offline_packagespip download nuitka ordered-set zstandard -d ./offline_packages# 下载 PyInstaller 的隐式依赖(避免打包时报错)pip download pyinstaller-hooks-contrib -d ./offline_packages --platform manylinux2014_x86_64 --python-version 312 --only-binary=:all:
把这三个命令下载的包,和之前项目依赖的包,放在同一个 offline_packages 文件夹里,一起拷到服务器。
第 2 步:在服务器上安装打包工具
把 offline_packages 文件夹拷到 CentOS 8 服务器后,执行:
# 安装 PyInstallerpip install --no-index --find-links=./offline_packages pyinstaller# 如果服务器缺少编译工具(PyInstaller 通常不需要),Nuitka 则需要:# yum install -y gcc gcc-c++ make python3-devel# 这些编译工具可以在 CentOS 8 的 ISO 镜像里找到 rpm 包,离线安装
第 3 步:在服务器上打包你的项目
进入项目目录,执行:
pyinstaller --onefile --name myapp main.py
如果有自己的模块需要手动包含(比如自己的 core、routers、services),用:
pyinstaller --onefile --name myapp \ --hidden-import=core \ --hidden-import=core.state \ --hidden-import=core.storage \ --hidden-import=routers \ --hidden-import=services \ main.py
如果 core、routers 是个文件夹(包),可以直接 --add-data "core:core" 把整个文件夹打包进去。
第 4 步:运行打包后的文件
打包完成后,在 dist/ 目录下会生成一个 myapp 文件(Linux 没有 .exe 后缀):
./dist/myapp
如果启动时需要指定端口或配置文件,可以通过命令行参数传递(看main.py 里怎么写的)。
./python/bin/pip3 install --no-index --find-links=./offline_packages -r ./backened_py/requirements.txt./python/bin/python3 ./backened_py/app/main.py
📥 三:在 Windows 上准备便携版 Python 3.12
确定下载版本:因为是为 CentOS 8 服务器准备,需要下载标签为 unknown-linux-gnu 的版本。你可以从 python-build-standalone 项目的 Releases 页面 搜索或直接使用官方链接下载。假设你需要的具体版本是 20231002(这只是个示例,请以你实际看到的为准)。
下载压缩包:在 Windows 上,打开浏览器,用下面的链接把文件下载下来。文件名可能会因版本不同而略有差异:
text
https://github.com/astral-sh/python-build-standalone/releases/download/20231002/cpython-3.12.0+20231002-x86_64-unknown-linux-gnu-install_only.tar.gz
建议下载带有 install_only 字样的版本,它更精简。
🗂️ 四:整理要拷贝到服务器的文件
在 Windows 上找一个地方,把所有东西归拢到一起。
便携版 Python 包:就是刚下载的 .tar.gz 压缩包,比如 cpython-3.12.0+20231002-x86_64-unknown-linux-gnu-install_only.tar.gz。
项目代码:整个 hot-rolling-scheduler 项目文件夹。
离线依赖包:我们之前准备好的 offline_packages 文件夹。
(可选)创建一个安装脚本:为了方便,可以在服务器上用一个脚本完成所有操作。新建一个 install.sh 文件,内容先空着,等下把它填好。
现在,你的 U 盘里应该有这几个东西:
text
U盘根目录/ ├── cpython-3.12.0+20231002-....tar.gz # 便携 Python 包 ├── hot-rolling-scheduler/ # 你的项目代码 ├── offline_packages/ # 你的离线依赖包 └── install.sh # 一个空的安装脚本
把这些全部拷到 U 盘,再插到 CentOS 8 服务器上。
💻 五:在 CentOS 8 服务器上安装和部署
假设你已经把文件从 U 盘拷贝到了服务器的某个目录下,比如 /home/your_user/deploy/。
解压便携版 Python:解压后,会得到一个 python 目录,这里面就包含了独立的 Python 解释器。
bash
cd /home/your_user/deploy/
解压,注意替换成你下载的实际文件名
tar -xzf cpython-3.12.0+20231002-x86_64-unknown-linux-gnu-install_only.tar.gz
如果是zip格式,则:
unzip xxx.zip
安装项目依赖:使用这个便携版 Python 自带的 pip,从我们准备好的离线包里安装依赖。
bash
注意,pip 在解压后的 python/bin/ 目录下
./python/bin/pip3 install --no-index --find-links=./offline_packages -r ./hot-rolling-scheduler/requirements.txt
这条命令的意思是:--no-index(不联网)从 --find-links=./offline_packages(本地文件夹)里,根据 requirements.txt 清单安装所有依赖。
测试运行:依赖装好后,试着跑一下你的程序,看看能不能正常启动。
bash
./python/bin/python3 ./hot-rolling-scheduler/backened_py/app/main.py
(锦上添花)把操作写成脚本:还记得我们那个空的 install.sh 吗?现在可以把上面的命令填进去了。在服务器上用 vi install.sh 创建文件,写入以下内容:
#!/bin/bash# 1. 解压便携 Pythonecho "正在解压便携 Python..."tar -xzf cpython-3.12.0+20231002-x86_64-unknown-linux-gnu-install_only.tar.gz# 2. 安装依赖echo "正在安装项目依赖..."./python/bin/pip3 install --no-index --find-links=./offline_packages -r ./hot-rolling-scheduler/requirements.txt# 3. 运行程序(可按需修改入口文件路径)echo "一切就绪,正在启动应用..."./python/bin/python3 ./hot-rolling-scheduler/backened_py/app/main.py
保存后,给它加上执行权限,以后就可以一步到位了:
bash
chmod +x install.sh sudo ./install.sh
💡 一些小提醒
版本对应:一定要确认你下载的便携版 Python 压缩包文件名里含有 x86_64-unknown-linux-gnu,这才是给 Linux 用的版本。
系统兼容性:如果程序启动时报错,提示缺少某些系统库(.so 文件),那说明你的 CentOS 8 缺了一些基础库。根据报错信息,从 CentOS 的 ISO 镜像里找到对应的 RPM 包手动补上就行。常见的可能有 glibc、libxcrypt 等。
2、部署rust
方法 :静态编译(推荐)
步骤 1:在 Windows 上交叉编译为 Linux 可执行文件
Powershell
安装 Linux 目标rustup target add x86_64-unknown-linux-musl# 静态编译(musl 会产生完全静态的二进制文件)cargo build --release --target x86_64-unknown-linux-musl编译后的文件位置:target/x86_64-unknown-linux-musl/release/your_app
步骤 2:执行上述语句后可能报错:
linker cc not found — Windows 交叉编译 musl
问题原因:Windows 上没有 cc 链接器,交叉编译 Linux musl 目标时需要指定 Rust 内置的 rust-lld 链接器。
修复:创建 .cargo/config.toml 配置文件:
toml
Copy
[target.x86_64-unknown-linux-musl]linker = "rust-lld"rustflags = ["-C", "linker-flavor=ld.lld"]
这样编译时就不需要系统安装 gcc/cc,完全使用 Rust 自带的 LLVM 链接器。
步骤3:重新编译
# 直接编译(无需安装 gcc/cc)cargo build --release --target x86_64-unknown-linux-musl