首页 > 解决方案 > 将生产 Django 服务器 + Postgres 数据库复制到相同的 Linode 服务器作为备份

问题描述

我正在尝试制作托管在 Linode 上的生产服务器的相同副本。这是一个带有租户模型的 Python/Django/Postgres 实现。我对另一位已经离开的开发人员完成的实施非常陌生。

当前站点与tenant1.prodlive.info 一起使用tenant2.prodlive.info

我执行的步骤是在 linode 仪表板中进行备份,然后使用该备份创建一个新的 linode 实例。登录后,我看到所有文件都已正确复制。

但是,我缺少配置某些细节的步骤,因为当我尝试访问tenant1.backup.infotenant2.backup.info 时服务器显示 404 错误。

DNS 已正确设置为两者都有 A 记录。服务器确实响应主服务器 url www.backup.info

我唯一更改的文件是 \project_dir\django_project\middleware.py 并将域名和 IP 地址 prodlive.info 和 ip.prod.live.info 的提及更改为 backup.info 和 ip.back.up。信息。

我可能会遗漏一些配置项,因此需要一些指针和最佳实践的帮助来维护现场制作的精确副本。提前感谢您的所有建议和帮助。

这是我在访问子域 URL 时收到的确切消息。找不到页面 (404) 请求方法:GET 请求 URL: http ://tenant1.backup.info/ 引发者:appname.views.index

标签: djangopostgresqldjango-modelsapache2

解决方案


Django-tenants使用 PostgreSQL 模式将数据库划分为多个命名空间。

鉴于您已手动恢复(以前)工作的 Linode 备份,您应该做的第一件事是获得对数据库的控制台访问权限并手动检查安装了哪些租户:

$ ./manage.py dbshell
postgres=# \d
postgres=# select schema_name, domain from myapp_tenant cross join myapp_domain;

   name   |       domain    
----------+---------------------
 public   | www.backup.info
 tenant1  | tenant1.backup.info
 tenant2  | tenant2.backup.info

如果一切顺利,您应该会看到上面列出的租户。访问http://tenant1.backup.info/时,django-tenants会在表中查找域名myapp_domain,找到对应的租户账户,并将 PostgreSQL 设置search_pathtenant1.

但是,由于您收到一个404我怀疑数据库中的域名与您当前配置的域名不对应。您可以使用适当的 SQL 语句或简单地在 Python shell 中解决此问题:

./manage.py python
>>> from myapp.models import Domain
>>> Domain.objects.all()
<QuerySet [<Domain domain="incorrect_domain.prodlive.info" Tenant="tenant1" is_primary="True">, <Domain domain="another_incorrect_domain.prodlive.info" Tenant="tenant2" is_primary="True">]>
>>> d = Domain.objects.get(domain="incorrect_domain.prodlive.info")
>>> d.domain = "tenant1.backup.info"
>>> d.save()

换句话说,使用数据库 shell 或 Python shell 确保出现在数据库中的域名是正确的。


推荐阅读