完整地理节点备份和恢复

备份和恢复GeoNode的管理命令允许以可序列化的元格式一致地提取GeoNode和GeoServer数据模型,恢复过程稍后将对其进行解释,以便准确地重建整个结构。

特别是,该工具可帮助开发人员和管理员正确提取和序列化以下资源:

  • GeoNode (资源基础模型):

    1. 图层(栅格和矢量)

    2. 地图

    3. 文件

    4. 有资格的人

    5. 权限

    6. 关联样式

    7. 静态数据和模板

  • GeoServer (目录):

    1. OWS服务配置和限制

    2. 安全模型以及身份验证筛选器配置、用户和凭据

    3. 工作区

    4. 存储(包括数据存储和覆盖存储)

    5. 风格

该工具公开了两个GeoNode管理命令“backup”和“restore”。

这些命令允许:

  1. 在zip存档上完全备份GeoNode数据和装置

  2. 完全备份GeoServer配置(物理数据集-表、shapefile、geotiffs)

  3. 从zip存档中完全恢复GeoNode和GeoServer设备和目录

这些命令的用法非常简单明了。

第一步是确保正确配置了所有内容并遵守了必要条件,以便成功地执行GeoNode的备份和恢复。

警告

值得注意的是,此功能需要最新的 GeoServer Extension (2.9.x或更高版本)以便GeoNode正确工作。

注解

GeoServer完整文档也可在此处获得 GeoServer Docs

必要条件和设置

之前 运行GeoNode备份/恢复时,必须确保所有内容都正确配置和设置。

设置

根据管理员的需要,文件 settings.ini 必须在运行备份或还原之前删除。

默认文件位于 geonode/br/management/commands/settings_sample.inigeonode/br/management/commands/settings_docker_sample.ini 对于经典和Docker环境。两者的内容相似(例如 settings_sample.ini ):

[database]
pgdump = pg_dump
pgrestore = pg_restore

[geoserver]
datadir = geoserver/data
dumpvectordata = yes
dumprasterdata = yes

[fixtures]
# NOTE: Order is important
apps  = contenttypes,auth,people,groups,account,guardian,admin,actstream,announcements,avatar,base,dialogos,documents,geoserver,invitations,pinax_notifications,layers,maps,oauth2_provider,services,sites,socialaccount,taggit,tastypie,upload,user_messages
dumps = contenttypes,auth,people,groups,account,guardian,admin,actstream,announcements,avatar,base,dialogos,documents,geoserver,invitations,pinax_notifications,layers,maps,oauth2_provider,services,sites,socialaccount,taggit,tastypie,upload,user_messages

The settings.ini file can be created in any directory accessible by GeoNode, and it's path can be passed to the backup / restore procedures using -c (--config) argument.

在运行备份/还原命令之前,必须仔细检查配置文件的几个不同部分。

设置: [数据库] 截面

[database]
pgdump = pg_dump
pgrestore = pg_restore

这个部分很简单。它只包含两个属性:

  • PG转储 ;道路 pg_dump 地方指挥部。

  • PG还原 ;道路 pg_restore 地方指挥部。

警告

在这种情况下,这些属性被配置为不使用数据库 settings.pylocal_settings.py 部分)

注解

数据库连接设置(GeoNode和GeoServer)将从 settings.pylocal_settings.py 配置文件。确保它们已正确配置(在目标GeoNode实例上也是如此),并且在执行备份/还原命令时数据库服务器是可访问的。

设置: [地质勘探者] 截面

[geoserver]
datadir = /opt/gs_data_dir
datadir_exclude_file_path =
dumpvectordata = yes
dumprasterdata = yes
data_dt_filter =
data_layername_filter =
data_layername_exclude_filter =

此部分允许启用/禁用GeoServer的完整数据备份/还原。

  • 数据中心 :默认情况下GeoServer Data Dir的完整路径 /opt/gs_data_dir . 小径 must 易于接近和 完全可写geonode 和/或 httpd server 执行备份/还原命令时的用户。

  • datadir_exclude_file_path :要从中排除的路径的逗号分隔列表 geoserver_catalog.zip ;此列表将由GeoServer Backup REST API直接发送和管理。

  • 转储向量数据 :启用或禁用从GeoServer(shapefile或DB tables)创建向量数据转储的布尔标志。如果 false (或) no )矢量数据不会被存储/重新存储。

  • 转储数据 :启用或禁用从GeoServer(geotiffs)创建栅格数据转储的布尔标志。如果 false (或) no )不会存储/重新存储栅格数据。

  • data_dt_filter: {cmp_operator} {ISO8601} e.g. > 2019-04-05T24:00 which means "include on backup archive only the files that have been modified later than 2019-04-05T24:00

  • data_layername_filter :逗号分隔的列表 layer names ,可选使用glob语法,例如:tuscany_ ,italy; Only ``RASTER`` original data and ``VECTORIAL`` table dumps matching those filters will be * *包括 *到备份压缩存档中

  • data_layername_exclude_filter :逗号分隔的列表 layer names ,可选使用glob语法,例如:tuscany_ ,italy; The ``RASTER`` original data and ``VECTORIAL`` table dumps matching those filters will be * *排除 *从备份压缩档案

警告

启用这些选项 要求 GeoServer数据目录是可访问的,并且 完全可写 对于 geonode 和/或 httpd server 执行备份/还原命令时的用户。

设置: [夹具] 截面

[fixtures]
#NOTE: Order is important
apps   = people,account,avatar.avatar,base.backup,base.license,base.topiccategory,base.region,base.resourcebase,base.contactrole,base.link,base.restrictioncodetype,base.spatialrepresentationtype,guardian.userobjectpermission,guardian.groupobjectpermission,layers.uploadsession,layers.style,layers.layer,layers.attribute,layers.layerfile,maps.map,maps.maplayer,maps.mapsnapshot,documents.document,taggit

dumps  = people,accounts,avatars,backups,licenses,topiccategories,regions,resourcebases,contactroles,links,restrictioncodetypes,spatialrepresentationtypes,useropermissions,groupopermissions,uploadsessions,styles,layers,attributes,layerfiles,maps,maplayers,mapsnapshots,documents,tags

这个部分是最复杂的部分。通常不需要修改它。只有了解Python和GeoNode模型结构的专家用户才应该修改此部分。

它的性质意味着:

  • apps ;geonodedjango应用程序的有序列表。备份/恢复过程将以可移植格式转储/恢复设备。

  • 倾倒 ;这是 files 与Django应用程序关联。命令 must 与中相同 apps 以上属性。每个名称代表 file name 从单个应用程序的fixture中转储/读取的位置。

从CLI执行

以下部分显示如何使用Django管理命令从命令行执行备份/还原的说明。

为了从命令行获取管理命令的基本用户指南,只需运行

python manage.py backup --help

python manage.py restore --help

--help 将提供可用命令行选项的列表和简要说明。

默认情况下,这两个过程都会激活 Read Only 模式,禁用任何内容修改请求,在完成后,无论命令的结果(成功还是失败),都将恢复到以前的状态(从执行之前开始)。要禁用此模式的激活, --skip-read-only 参数可以传递给命令。

值得注意的是,这两个命令都允许以下选项

python manage.py backup --force / -f

python manage.py restore --force / -f

这将启用非交互模式,这意味着用户将不会被要求显式确认。

备份

要执行备份,只需运行以下命令:

python manage.py backup --backup-dir=<target_bk_folder_path> --config=</path/to/settings.ini>

管理命令将自动生成 .zip 如果成功,请在目标文件夹上存档文件。在目标目录中 .md5 将创建与备份同名的文件。它包含备份文件的MD5哈希值,可用于在恢复之前检查存档的完整性。

值得一提的是 br (备份和还原GeoNode应用程序)将不会转储,即使在 settings.ini 因为它的内容与特定GeoNode实例严格相关。

目前,GeoNode不支持备份文件的任何自动提取。如果需要,应该手动将其传输到目标实例环境。

恢复

这个 restore 命令有许多参数,正在修改其执行:

γ -c / --config :指向 settings.ini 配置文件。如果备份档案随他的设置一起提供,则restore命令将使用后者,并且不再强制使用此选项

  1. --skip-geoserver :不会执行GeoServer备份还原

  2. --skip-geoserver-info: {Default: True} Skips GeoServer Global Infos, like the proxy base url and other global GeoServer metadata info

  3. --skip-geoserver-security: {Default: True} Skips GeoServer all the Security Settings

  4. --backup-file :(独家与 --backup-files-dir )备份路径 .zip 档案文件

  5. --backup-files-dir :(独家与 --backup-file )包含备份档案的目录。目录可能包含许多文件,但是 only 备份档案允许使用 .zip 扩展。如果目录中存在多个存档文件,则将还原在上次已还原的备份创建时间之后创建的最新存档。实施此选项时考虑到了自动恢复。

  6. --recovery-file :备份档案,其中包含发生故障时要还原的GeoNode数据。

  7. -l / --with-logs :将根据还原日志(历史记录)检查备份文件。如果已还原此备份(基于MD5的比较),则会引发RuntimeError,从而阻止还原执行。

  8. -n / --notify :还原过程的结果将通过电子邮件通知发送给实例的超级用户(注意:恢复前将向实例的超级用户发送通知)。

  9. --skip-read-only :恢复程序将在不设置的情况下执行 Read Only 执行期间的模式。

要执行默认备份还原,只需运行以下命令:

python manage.py restore --backup-file=<target_restore_file_path> --config=</path/to/settings.ini>

要运行还原,它需要 --backup-file--backup-files-dir 参数已定义。

警告

将恢复 重写 GeoNode的整个目标实例(默认情况下是GeoServer)包括用户、目录和数据库,所以要非常小心。

GeoNode管理GUI检查

可以在管理面板中验证已还原备份的历史记录。

登录到管理面板并选择 Restored backups 表来自 BACKUP/RESTORE 应用。

../../_images/br_1.png

将显示一个列表,其中包含所有已还原备份的历史记录。您可以选择某个备份来查看其数据。

../../_images/br_2.png

恢复的备份的详细视图显示备份档案的名称、MD5哈希、创建/修改日期(在目标文件夹中)和恢复日期。请注意,无法修改还原的备份历史记录。

../../_images/br_3.png

Docker环境下的B/R

在Docker环境中执行B/R时,创建备份到/恢复自应该在 /backup_restore 目录。它是Geoserver和Geonode映像之间的共享卷,仅用于此目的。指向另一个位置将失败,因为其中一个图像无法访问这些文件。

警告

在Docker环境中执行B/R时 记得 创造 settings.ini 文件基于 settings_docker_sample.ini 指向一个正确的Geoserver数据目录!在其他情况下,配置不匹配可能会导致意外错误。

警告

图像之间唯一共享的其他卷是 /geoserver_data/data ,但备份创建 不应该 在那里执行,因为在这种情况下可能会创建递归Geoserver备份。

B/R詹金斯在码头环境中的工作

通过安装GeoNode时 geonode-project Docker(参见 GeoNode基本安装 )的实例 Jenkins CI/CD 也可以自动部署并通过 http://<geonode_host>/jenkins .

../../_images/br_jenkins_1.png

在第一次启动时配置Jenkins

第一次尝试访问Jenkins时,您需要解锁它并生成一个新的管理员用户名和密码。

为此,您需要打印自动生成的文件的内容 /var/jenkins_home/secrets/initialAdminPassword

  1. 首先搜索Jenkins容器ID,通常 jenkins4{{{{project_name}}}} 在哪里? {{{{project_name}}}} 是你的名字吗 geonode-project 实例(例如) my_geonode

$> docker ps

  CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                                                                NAMES
  e9fc97a75d1a        geonode/nginx:geoserver      "/docker-entrypoint.…"   2 hours ago         Up 2 hours          0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp                                             nginx4my_geonode
  c5496400b1b9        my_geonode_django            "/bin/sh -c 'service…"   2 hours ago         Up 2 hours                                                                                               django4my_geonode
  bc899f81fa28        my_geonode_celery            "/bin/sh -c 'service…"   2 hours ago         Up 2 hours                                                                                               celery4my_geonode
  3b213400d630        geonode/geoserver:2.17.1     "/usr/local/tomcat/t…"   2 hours ago         Up 2 hours          8080/tcp                                                                             geoserver4my_geonode
  d2f59d70a0d3        geonode/postgis:11           "docker-entrypoint.s…"   2 hours ago         Up 2 hours          5432/tcp                                                                             db4my_geonode
  3f9ce0be7f88        rabbitmq                     "docker-entrypoint.s…"   2 hours ago         Up 2 hours          4369/tcp, 5671-5672/tcp, 25672/tcp                                                   rabbitmq4my_geonode
  02fdbce9ae73        geonode/letsencrypt:latest   "./docker-entrypoint…"   2 hours ago         Up 14 seconds                                                                                            my_geonode_letsencrypt_1
  c745520fd551        jenkins/jenkins:lts          "/sbin/tini -- /usr/…"   2 hours ago         Up 2 hours          0.0.0.0:9080->9080/tcp, 8080/tcp, 0.0.0.0:50000->50000/tcp, 0.0.0.0:9443->8443/tcp   jenkins4my_geonode
  1. 现在只是 cat 上面的文件在詹金斯容器里

$> docker container exec -u 0 -it jenkins4my_geonode sh -c 'cat /var/jenkins_home/secrets/initialAdminPassword'

  b91e9d*****************373834
  1. 复制上面打印的哈希代码,然后复制并粘贴到浏览器窗口

../../_images/br_jenkins_2.png

在下一步中,只需安装 Default Plugins . 您可以稍后从管理页面安装更多的。

../../_images/br_jenkins_3.png

等到Jenkins完成插件的配置

../../_images/br_jenkins_4.png

按要求提供管理员凭据

../../_images/br_jenkins_5.png

如果需要的话,可以在以后更新Jenkins服务器的地址表

../../_images/br_jenkins_6.png

干得好,詹金斯现在准备好了

../../_images/br_jenkins_7.png

下一步是配置一个能够与Django Docker容器交互并运行完整备份的Jenkins作业

../../_images/br_jenkins_8.png

配置Jenkins作业以在Django容器上运行完全备份

在创建新的Jenkins作业之前,我们需要安装和配置一个新的插件, Publish over SSH

为了做到这一点,一旦登录为 admin 去詹金斯家 Management Page > Manage Plugins 标签

../../_images/br_jenkins_9.png
../../_images/br_jenkins_10.png

点击 Available 选项卡并搜索 SSH 可用插件

../../_images/br_jenkins_11.png

选择并检查 Publish over SSH

../../_images/br_jenkins_12.png

安装插件并重新启动Jenkins

../../_images/br_jenkins_13.png

下一步是配置 SSH Server Connection 对于 Publish over SSH 插件。

移动到 Jenkins Configuration

../../_images/br_jenkins_14.png

向下滚动直到找到 Publish over SSH 插件部分

../../_images/br_jenkins_15.png

取决于你 HOST SSH service 已配置,您可能需要一些信息才能设置连接。

下面是一个使用全局主机的示例 (master.demo.geonode.org )接受 SSH 连接方式 RSA keys

../../_images/br_jenkins_16.png

注解

保存配置之前,请始终使用 Test Configuration 按钮

../../_images/br_jenkins_17.png

还可以运行和配置 Jenkins 在本地运行,如在 localhost . 在这种情况下,你需要改变一些事情,以便 Jenkins 访问本地网络。

  1. 首先,要确定 OpenSSH Server 已正确安装并在您的电脑上运行。最终检查所有防火墙规则。

    $> sudo apt install openssh-server
    
    # Test your connection locally
    $> ssh -p 22 user@localhost
       user@localhost's password:
    
  2. 你需要对你的 docker-compose.yml 文件以启用 host network 配置。

    注解

    使能 network_mode: "host" 在詹金斯集装箱上

    $> vim docker-compose.yml
    
    ...
    jenkins:
       image: jenkins/jenkins:lts
       # image: istresearch/jenkins:latest
       container_name: jenkins4${COMPOSE_PROJECT_NAME}
       user: jenkins
       ports:
          - '${JENKINS_HTTP_PORT}:${JENKINS_HTTP_PORT}'
          - '${JENKINS_HTTPS_PORT}:${JENKINS_HTTPS_PORT}'
          - '50000:50000'
       network_mode: "host"
       volumes:
          - jenkins_data:/var/jenkins_home
          - backup-restore:/backup_restore
          # - /var/run/docker.sock:/var/run/docker.sock
       environment:
          - 'JENKINS_OPTS=--httpPort=${JENKINS_HTTP_PORT} --httpsPort=${JENKINS_HTTPS_PORT} --prefix=/jenkins'
    ...
    
    # Recreate the Jenkins container
    $> docker-compose stop jenkins
    $> docker-compose rm jenkins
    $> docker-compose up -d jenkins
    

    警告

    从现在起,您的本地Jenkins实例将可以从 http://localhost:9080/jenkins

  3. 添加 localhost 服务器到 Publish over SSH 插件配置

    模式到 http://localhost:9080/jenkins/configure 并填写所需信息

    ../../_images/br_jenkins_18.png

    注解

    保存配置之前,请始终使用 Test Configuration 按钮

    ../../_images/br_jenkins_17.png

我们现在已经准备好创建Jenkins作业,它将运行GeoNode停靠实例的完整备份和恢复。

  1. 搬到詹金斯家,点击 Create a Job 按钮

    ../../_images/br_jenkins_19.png
  2. 为作业提供名称并选择 Freestyle project

    ../../_images/br_jenkins_20.png
  3. 启用 Log rotation 必要时采取策略

    ../../_images/br_jenkins_21.png
  4. 配置 Job Parameters 稍后脚本将使用它。

    加三 String Parameters

    ../../_images/br_jenkins_22.png

    如下图所示

    1. BKP_FOLDER_NAME

      ../../_images/br_jenkins_23.png
    2. SOURCE_URL

      警告

      提供GeoNode实例的正确URL

      ../../_images/br_jenkins_24.png
    3. TARGET_URL

      警告

      提供GeoNode实例的正确URL

      ../../_images/br_jenkins_25.png
  5. 启用 Delete workspace before build startsAdd timestamps to the Console Output Build Environment 选项

    ../../_images/br_jenkins_26.png
  6. 最后,让我们创建 SSH Build Step

    ../../_images/br_jenkins_27.png

    选择正确的 SSH Server 并提供 Exec Command 在下面

    警告

    替换 {{{{project_name}}}} 用你的 geonode-project instance name (例如) my_geonode

    # Replace {{project_name}} with your geonode-project instance name (e.g. my_geonode)
    # docker exec -u 0 -it django4{{project_name}} sh -c 'SOURCE_URL=$SOURCE_URL TARGET_URL=$TARGET_URL ./{{project_name}}/br/backup.sh $BKP_FOLDER_NAME'
    # e.g.:
    docker exec -u 0 -it django4my_geonode sh -c 'SOURCE_URL=$SOURCE_URL TARGET_URL=$TARGET_URL ./my_geonode/br/backup.sh $BKP_FOLDER_NAME'
    
    ../../_images/br_jenkins_28.png

点击 Advanced 并按如下所示更改参数

../../_images/br_jenkins_29.png

救命! 你准备好运行作业了。。。

../../_images/br_jenkins_30.png
../../_images/br_jenkins_31.png
../../_images/br_jenkins_32.png
../../_images/br_jenkins_33.png