将 django 项目转移到另一台机器

Transfer a django project to another machine

这是一个初学者问题,但我还没有找到答案。我想将我的 django 项目从 Ubuntu 18.04 的虚拟机转移到另一个 Ubuntu 18.04.

的虚拟机

这是示例目录结构

pd_videowebapp/
├── db.sqlite3
├── env
│   ├── bin
│   ├── lib
│   └── pyvenv.cfg
├── manage.py
├── media
│   ├── images
│   └── video
├── mysite
│   ├── core
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py
│   ├── static
│   ├── templates
│   ├── urls.py
│   └── wsgi.py
├── Pipfile
├── requirements.txt
└── static
    ├── admin
    ├── style2.css
    └── style3.css

env 目录中有一个 Python 虚拟环境。

在我转移之前我会运行

$ pip freeze > requirements.txt

然后我将压缩除 db.sqlite3media 目录之外的所有目录结构。

然后在另一个虚拟机上解压。

然后将db.sqlite3media目录复制到正确的位置。

然后在另一个虚拟机上创建一个虚拟环境。

然后运行

$ pip install -r requirements.txt

或者我应该在开头复制整个项目 env 目录?什么是更好的?我遗漏了什么吗?或者有更好的方法吗?

Or should I rather copy the whole project with env directory in the beginning? What is better? Did I omit something? Or is there a better approach?

最好不要复制env目录。排除此目录。

有很多方法可以做到这一点。我建议你使用 Git。为此:

  1. 从当前项目创建一个 git 存储库
  2. 使用正确的 .gitignore 文件忽略 env 目录和其他 environment-related 内容:
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Other stuff
  1. 从其他 VM 克隆项目并在此 VM 中配置虚拟环境

更简单的方法:

  1. 压缩整个项目,同时排除 env 目录和其他 手动忽略的东西。

  2. 将 zip 文件移动到其他 VM 并在此 VM 中配置虚拟环境

你的想法是正确的。您可以在没有 env 目录的情况下压缩项目。

在新系统中创建虚拟环境:假设您已经根据需要安装了python3-pippython3-dev等,然后在您的新系统中设置项目,方法是从终端项目目录并执行这些命令(如您所知)-

# install virtual env
pip install virtualenv

# create virtual env
virtualenv -p /usr/bin/python3 venv

# activate virtual env
source venv/bin/activate

# install project dependencies
pip install -r requirements.txt

那你就没事了。此外,您可以创建一个远程存储库(例如在 Github 上)并通过 .gitignore 文件忽略虚拟环境目录 env]

如果您正在寻找不需要重新配置新系统的解决方案,我强烈建议您使用 Docker

您可以使用 docker 进行更简单的传输

你可以使用下面的 Dockerfile:

# syntax=docker/dockerfile:1

FROM python:3.9

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /code

RUN pip install --upgrade pip

COPY requirements.txt /code/

RUN pip install -r requirements.txt

#COPY daemon.json /etc/docker/daemon.json

COPY . /code/

EXPOSE 80

您可以在此处找到有关 dockerizing django 应用程序的更多信息 https://docs.docker.com/samples/django/

希望对您有所帮助!

每个答案都有一个其他答案所缺少的元素。我会尝试将所有这些汇总成一个可行且合理的计划。

不要复制虚拟环境目录

Python 虚拟环境目录已优化为使用链接而不是副本,因此如果您在单台计算机上创建类似的虚拟环境,则不会因相同 pip 的副本而使磁盘膨胀包和 Python 个文件。

复制环境会破坏此模型。它可能不起作用或行为不端。

使用git和.git忽略指定易变资源

如果您使用 git 管理您的项目,您绝对应该有一个 .gitignore 来说明哪些资源是 auto-generated、user-specific、volatile 等,并且应该不是共享仓库的一部分。

在继续下一步之前,您应该按照@hamraa 的建议进行设置。

使用git重新定位项目

假设你在两台机器上都有互联网连接,为什么你必须压缩并移动它?

如果两台机器都可以访问同一台 Git 服务器,您应该将您的更改推送到全局存储库,然后从其他 VM 中拉取这些更改。

如果不是这种情况,但目标 VM 与源计算机有 SSH 连接,您可以调用:

git clone ssh://<username>@<hostname>:/<path-to-repo>

使用 git-bundle 从您的存储库创建一个可移动的包

如果机器之间没有网络连接,您可以使用一个很酷的 Git 功能,使用单个文件轻松移动存储库。

命令很简单:

git bundle create app.bundle <commit/tag/branch>

然后您可以将这个包移动到任何其他机器并使用:

git clone app.bundle

考虑使用Docker

我不反对Docker,我爱Docker。但是(!)我不认为 是解决方案。使用好的 bring-up 脚本,您可以拥有一个非常易于使用的 Git 存储库,您可以快速轻松地设置它。很少有只有一种正确方法的情况。我认为这不是其中之一。

由于您要从一个 VM 转移到另一个,假设您在 AWS 上,您可以使用 AMI 创建当前实例 (VM) 的快照,然后启动一个新实例 (VM)已保存 AMI。这样做的好处是它将保留您当前的所有设置、代码库和数据。您不必从头开始配置新机器。

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html