完整的GeoNode备份和恢复

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

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

  • GeoNode (资源库模型):

    1. 图层(栅格和矢量)

    2. 地图

    3. 文件

    4. 有资历的人

    5. 权限

    6. 关联样式

    7. 静电数据和模板

  • GeoServer (目录):

    1. OWS服务配置和限制

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

    3. 工作空间

    4. 商店(数据存储区和CoverageStores)

    5. 图层

    6. 样式

该工具公开了两个GeoNode管理命令:“BACKUP”和“RESTORE”。

这些命令允许执行以下操作:

  1. 完全备份zip归档中的GeoNode数据和装置

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

  3. 从zip归档文件中完全恢复GeoNode和Geoserver装置和目录

这些命令的使用非常简单和直接。

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

警告

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

注解

此处还提供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

这一节非常简单。它只包含两个属性:

  • pgdumppg_dump 本地指挥部。

  • ** ; pg_restore 本地指挥部。

警告

如果未将GeoNode配置为使用数据库作为后端,则忽略这些属性(请参见 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数据目录的完整路径 /opt/gs_data_dir 。这条路 must 具有可访问性,并且 完全可写geonode 和/或 httpd server 用户在执行备份/还原命令时。

  • datadir_exclude_file_path :要从中排除的路径的逗号分隔列表 geoserver_catalog.zip ;此列表将由Geoserver备份睡觉接口直接发送和管理。

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

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

  • data_dt_filter :{cmp_Operator}{ISO8601}例如>2019-04-05T24:00,意思是“在备份档案中只包含在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 * *包括在内 *放入备份ZIP存档中

  • data_layername_exclude_filter :逗号分隔的列表 layer names ,可选地使用GLOB语法,例如:Tuscany_ ,italy; The ``RASTER`` original data and ``VECTORIAL`` table dumps matching those filters will be * *已排除 *来自备份ZIP归档

警告

启用这些选项 需要 可访问的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 ;GeoNode Django应用程序的有序列表。备份/恢复过程将以便携格式转储/恢复灯具。

  • 转储 ;这是……的名单 files 与Django应用程序相关联。订单 must 与中的相同 apps 上面的财产。每个名称代表 file name 转储到哪个位置/从单个应用程序的固定装置读取。

从CLI执行

以下各节介绍如何使用Django Admin Management命令从命令行执行备份/恢复。

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

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 (Backup&Restore GeoNode应用程序)将不会转储,即使在中指定也是如此 settings.ini 因为它的内容与某个GeoNode实例严格相关。

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

恢复

这个 restore 命令具有多个参数,用于修改其执行:

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

  1. --skip-geoserver :将不执行Geoserver备份恢复

  2. --skip-geoserver-info :{default:true}跳过Geoserver全局信息,如代理基础URL和其他全局Geoserver元数据信息

  3. --skip-geoserver-security :{default:true}跳过Geoserver所有安全设置

  4. --backup-file :(独家与 --backup-files-dir )备份的路径 .zip 存档

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

  6. --recovery-file :备份包含要在出现故障时恢复的GeoNode数据的归档。

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

  8. -n / --notify :恢复过程结果会以邮件通知的方式通知实例的超级用户(注意:恢复前会通知实例的超级用户)。

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

  10. --soft-reset :还原过程将在还原期间保留Geoserver表/资源。缺省情况下,该过程将删除表和资源

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

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环境下执行应收时 记住 要创建 settings.ini 文件基于 settings_docker_sample.ini 指向正确的Geoserver数据目录!在其他情况下,配置不匹配可能会导致意外错误。

警告

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

Docker环境下的B/R Jenkins作业

通过安装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 上面Jenkins容器内的文件

$> 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实例URL,稍后可以从配置中更改此URL,以防您需要更新服务器地址

../../_images/br_jenkins_6.png

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

../../_images/br_jenkins_7.png

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

../../_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 已在您的PC上正确安装并运行。最终检查所有防火墙规则。

    $> 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" 关于Jenkins容器

    $> 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. 移动到Jenkins Home并单击 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

      警告

      提供地理节点实例的正确URL

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

      警告

      提供地理节点实例的正确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