# 在容器中设置 Qlik Data Gateway - Direct Access

本主题概述了如何设置容器化 Direct Access gateway。它提供了先决条件和安装说明，并描述了使用容器化 Direct Access gateway 时应了解的限制和注意事项。

信息注释自 Direct Access gateway 1.8.0 起支持。

## 支持的数据源

容器化安装支持以下连接器：

* 支持以下 ODBC 连接器：

  * PostgreSQL
  * SQL Server
  * oracle

  有关 ODBC 连接器的更多信息，请参阅 [ODBC 数据库 - Qlik Cloud](https://help.qlik.com/en-US/cloud-services/Subsystems/ODBC_Connector_help/Content/Connectors_ODBC/Introduction/ODBC-connector.htm) （仅提供英文版本）。

* REST 连接器 (REST 通过 Direct Access gateway)。有关 REST 数据源的详细信息，请参阅 [REST 源 ‒ Qlik Cloud](https://help.qlik.com/en-US/cloud-services/Subsystems/REST_Connector_help/Content/Connectors_REST/REST-connector.htm) （仅提供英文版本）。

* MySQL 连接器。

  信息注释从 Direct Access gateway 1.8.1 起支持。

* SAP SQL、SAP BW、SAP ODP 和 SAP Report 连接器。有关针对容器化安装在 Qlik Data Gateway - Direct Access 计算机上安装 SAP NetWeaver RFC SDK 的信息，请参阅 [为 Qlik Data Gateway - Direct Access 安装 SAP NetWeaver RFC SDK](https://help.qlik.com/en-US/cloud-services/Subsystems/SAP_Connectors_Help/Content/Connectors_SAP/Installation/Installing-sap-connectors-for-direct-access-gw.htm) （仅提供英文版本）。

  信息注释从 Direct Access gateway 1.8.1 起支持。

## 什么是容器化Direct Access gateway？

您可以将 Direct Access gateway 部署到 Docker 容器中。这种类型的部署称为容器化 Direct Access gateway。容器化 Direct Access gateway 部署支持 Linux、macOS 和 Windows。

容器化 Direct Access gateway 为您的 Direct Access gateway 环境提供可移植性。

## 使用 Qlik Data Gateway - Direct Access 时的最佳实践

为了在使用 Qlik Data Gateway - Direct Access 时获得成功体验，强烈建议遵守以下最佳实践：

* 不要将 Direct Access gateway 用于开发、用户验收测试和生产，因为这会增加可用资源过载的风险，并影响系统稳定性。从业务角度来看，资源不足和稳定性下降的组合可能会导致生产应用程序数据的更新延迟。

* 为了获得最佳性能，请在尽可能靠近数据源的环境中安装 Direct Access gateway。

## 系统先决条件

本部分介绍使用容器化 Direct Access gateway 的要求。

### 软件要求

* 宿主机上已安装 Docker Engine 20.9+ 版本和 Docker Compose 插件（docker compose，v2 语法）。

### 所需端口和协议

有关所需端口和协议，请参阅 [所需端口和协议](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setting-up.htm#Ports)。

### 推荐硬件

* 主机：8 核，32 GB 内存，5 GB 可供 Docker 使用的存储空间

* 可选：在 compose 文件中为容器设置匹配的限制，以便网关拥有专用容量，而不是与主机上的其他容器或进程竞争：

  ```
  direct-access-agent:
      image: ...
      deploy:
        resources:
          limits:
            cpus: "6"
            memory: 24G
  ...
  dcaas:
      image: ...
      deploy:
        resources:
          limits:
            cpus: "2"
  ```

#### 最低硬件要求

最低硬件仅适用于使用较小的专用部署（开发、测试或生产）、持续低数据量和有限数量的并发重载的特定场景。

* 主机：4 核，8 GB 内存，Docker 可用 5 GB 存储空间

* 可选：在 compose 文件中为容器设置匹配的限制，以便网关拥有专用容量，而不是与主机上的其他容器或进程竞争：

  ```
  direct-access-agent:
      image: ...
      deploy:
        resources:
          limits:
            cpus: "2"
            memory: 4G
  ...
  dcaas:
      image: ...
      deploy:
        resources:
          limits:
            cpus: "2"
  ```

## 安装 Qlik Data Gateway - Direct Access

设置 Direct Access gateway 涉及需要在 Administration 活动中心和 Direct Access gateway 服务器上执行的步骤。

信息注释需要在 Administration 活动中心中执行的数据网关过程需要租户管理员权限。

### 阶段一：下载 Qlik Data Gateway - Direct Access

1. 在 Administration 活动中心中，选择数据网关。

   任何现有的数据网关都将列在[一个表中，其中显示了每个网关的基本信息](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-managing-console.htm#gateprop)。

2. 单击部署工具栏按钮。

   部署数据网关对话框打开。

3. 选择 数据网关 - 直接访问 - 容器化直接访问网关，接受 Qlik 客户协议，然后点击 下载。Direct Access gateway 安装文件 (docker-compose.qlik-data-gateway-direct-access.yml) 将下载到您的计算机。

### 阶段二：通过运行 Docker Compose 文件启动部署

要开始部署 Direct Access gateway，请运行以下命令：

docker compose -f docker-compose.qlik-data-gateway-direct-access.yml up

#### 将 SAP NetWeaver RFC SDK 复制到容器

对于 SAP SQL、SAP BW、SAP ODP 和 SAP Report 连接器，请将 SAP NetWeaver RFC SDK 文件复制到容器中。

在包含 Linux 和 Windows SDK 二进制文件夹的目录中，运行：

docker cp . direct-access-agent-1:/usr/share/Qlik/Gateway/sap-sdk

复制文件后，重启 direct-access-agent-1 容器。

### 第三阶段：设置 Direct Access gateway

有关详细的设置说明，请参阅 [阶段三：设置 Direct Access gateway](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setting-up.htm#Stage3)。

### 阶段四：注册数据网关

下一步是注册数据网关。 这可以通过 Administration 活动中心或在命令行中完成。

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setup-container.htm)

#### 选项 1：通过 Administration 活动中心

您可以使用 Administration 活动中心注册网关。请参见 [选项 1：通过 Administration 活动中心](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setting-up.htm#StageConsole)。

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setup-container.htm)

#### 选项 2：使用命令行自动注册

您还可通过命令行自动注册 Direct Access gateway，而无需使用 Administration 活动中心。此方法使用由 OAuth 客户端生成的短期会话令牌。

信息注释

要自动注册和移除自动注册的网关，您需要以下权限：

* 自动注册：您需要将 注册 Direct Access gateway 管理员权限设置为 允许。

* 移除自动注册的网关：您需要将 注册 Direct Access gateway 管理员权限设置为 允许。

有关权限的详细信息，请参阅 [默认权限和自定义角色](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Admin/permissions-scopes-capacity-model.htm)。

信息注释自动注册仅支持通过命令行进行。用于网关自动注册的 REST API 目前不可用。

先决条件

具有创建和管理 OAuth 客户端的租户管理员权限的 API 密钥。

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setup-container.htm)通过自动注册注册网关

1. 首先，您需要设置一个 Python 环境，以便在 direct-access-agent 容器中生成 OAuth 客户端 ID 以及断言密钥（短期令牌）。按此顺序分别运行以下命令：

   1. docker exec -it --user root direct-access-agent-1 bash

   2. apt-get update && apt-get install -y python3 python3-pip

   3. apt install python3.11-venv

   4. python3 -m venv .venv

   5. source .venv/bin/activate

   6. pip install cryptography pyjwt

   7. [](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setup-container.htm)python3 generate\_gateway\_assertion.py --tenant-url &lt;tenant-url&gt;

2. 对于[上述列表中的最后一条命令](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setup-container.htm#python3)，关注交互式提示，并在提供时复制 client\_id（OAuth 客户端 ID）和 assertion。请暂时将这些详细信息记录在纸上或保存在临时文本文件中——该流程的后续步骤将需要用到它们。

3. 当您记录下 client\_id 和 assertion 后，使用以下命令清理 Python 环境：

   deactivate

4. 将 OAuth 客户端的许可方法设置为受信任。

   curl "https://&lt;tenant-url&gt;/api/v1/oauth-clients/&lt;client-id&gt;/connection-configs/me" -X PATCH -H 'accept: application/json' -H 'content-type: application/json' -H 'authorization: Bearer &lt;api-key&gt;' -d '[{"op":"replace","path":"/consentMethod","value":"trusted"}]'

5. 请求访问令牌。这也会触发自动创建网关所使用的机器人用户账户。

   curl "https://&lt;tenant-url&gt;/oauth/token" -X POST -H 'content-type: application/x-www-form-urlencoded' -d "grant\_type=client\_credentials" -d "client\_id=&lt;client-id&gt;" -d "client\_assertion\_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer" -d "client\_assertion=&lt;assertion&gt;" -d "scope=admin.direct-access-gateways:register\_gateway admin.direct-access-gateways:delete\_gateway"

   信息注释

   如果断言已过期，请从虚拟环境中重新运行脚本。

6. 查找自动创建的机器人用户。

   curl "https://&lt;tenant-url&gt;/api/v1/users" -H 'accept: application/json' -H 'authorization: Bearer &lt;API-key&gt;'

7. 复制 my-bot-client 的 ID。

8. 创建“DAG 注册”角色。

   curl "https://&lt;tenant-url&gt;/api/v1/roles" -X POST -H 'accept: application/json' -H 'content-type: application/json' -H 'authorization: Bearer &lt;API-key&gt;' -d '{"name":"DAG Registration","description":"Role for registering a gateway","assignedScopes":["admin.direct-access-gateways:register\_gateway", "admin.direct-access-gateways:delete\_gateway"]}'

9. 为机器人用户分配租户级角色。

   curl "https://&lt;tenant-url&gt;/api/v1/users/&lt;bot-user-ID&gt;" -X PATCH -H 'accept: application/json' -H 'content-type: application/json' -H 'authorization: Bearer &lt;API-key&gt;' -d ' [ { "op": "replace", "path": "/assignedRoles", "value": [ { "name": "DAG Registration" } ] } ]'

10. 获取 Direct Access Gateway 空间。

    curl "https://&lt;tenant-url&gt;/api/v1/spaces" -H 'authorization: Bearer &lt;API-key&gt;'

11. 复制 Direct Access Gateway 空间 ID。

12. 将机器人用户添加到空间，并授予 可编辑 权限。

    curl "https://&lt;tenant-url&gt;/api/v1/spaces/&lt;DAG-space-ID&gt;/assignments" -X POST -H 'accept: application/json' -H 'content-type: application/json' -H 'authorization: Bearer &lt;API-key&gt;' -d '{"assigneeId": "&lt;bot-user-ID&gt;","roles": ["consumer","dataconsumer","producer"], "type": "user"}'

13. 如果现有断言已过期，请生成一个新断言。然后运行以下命令：

    python3 generate\_gateway\_assertion.py --tenant-url &lt;tenant-url&gt;

14. 按照命令提示符中的所需步骤进行操作。由于 OAuth 客户端已创建，因此需要使用此 API 调用来更新 JWK：

    curl "https://&lt;tenant-url&gt;/api/v1/oauth-clients/&lt;client-ID&gt;" -X PATCH -H 'accept: application/json' -H 'content-type: application/json' -H 'authorization: Bearer &lt;API-key&gt;' -d '[{"op":"replace","path":"/publicKeys/0/y","value":"&lt;Y-value-from-JWK&gt;"},{"op":"replace","path":"/publicKeys/0/x","value":"&lt;X-value-from-JWK&gt;"},{"op":"remove","path":"/publicKeys/0/use"},{"op":"replace","path":"/publicKeys/0/kid","value":"&lt;kid-value-from-JWK&gt;"}]'

15. 注册网关：

    dotnet ConnectorAgent.dll qcs register\_gateway --tenant\_url &lt;tenant-url&gt; --gateway\_name &lt;DAG-name&gt; --gateway\_description &lt;DAG-description&gt; --space\_name &lt;space-name&gt; --client-id &lt;client-ID&gt; --assertion &lt;assertion&gt;

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setup-container.htm)移除自动注册的网关

使用以下步骤注销通过上述基于会话令牌的自动方法注册的网关。这些步骤还会删除为其创建的 OAuth 客户端、Bot 用户和角色。

1. 生成断言，如[上一部分](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setup-container.htm#AutoRegister)中所述。

2. 删除网关：

   dotnet ConnectorAgent.dll qcs delete\_gateway --tenant\_url &lt;tenant-url&gt; --gateway\_name &lt;gateway-name&gt; --client-id &lt;client-ID&gt; --assertion &lt;assertion&gt;

3. 查找为网关创建的机器人用户帐户。

   curl "https://&lt;tenant-url&gt;/api/v1/users" -H 'accept: application/json' -H 'authorization: Bearer &lt;api-key&gt;'

4. 复制机器人 ID。

5. 删除此机器人用户账户。

   curl -X DELETE "https://&lt;tenant-url&gt;/api/v1/users/&lt;bot-user-ID&gt;" -H "Authorization: Bearer &lt;api-key&gt;"

6. 查找为网关创建的“DAG Registration”角色。

   curl "https://&lt;tenant-url&gt;/api/v1/roles?limit=1&filter=(name%20eq%20%22DAG%20Registration%22)" -H "Authorization: Bearer &lt;api-key&gt;"

7. 复制角色 ID。

8. 删除此角色。

   curl -X DELETE "https://&lt;tenant-url&gt;/api/v1/roles/&lt;role-ID&gt; -H "Authorization: Bearer &lt;api-key&gt;"

9. 删除 OAuth 客户端。

   curl -X DELETE https://&lt;tenant-url&gt;/api/v1/oauth-clients/&lt;OAuth-client-ID&gt; -H "qlik-confirm-delete: &lt;OAuth-client-ID&gt;" -H "Authorization: Bearer &lt;api-key&gt;

### 阶段五：在 Direct Access gateway 服务器上启动 Qlik Data Gateway - Direct Access 服务

要启动 Qlik Data Gateway - Direct Access 服务，请启动 dcaas-dg 和 direct-access-agent 容器。

### 阶段六：将连接添加到数据源

请参见 [阶段六：将连接添加到数据源](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setup-container.htm#Stage6)。

## 环境设置

本部分列出了 docker-compose.qlik-data-gateway-direct-access.yml 文件中的特定环境变量，您可能需要对其进行配置，以便通过网关正确连接您的数据源。

* ALLOW\_SOURCES：以逗号分隔的主机名和 IP 允许列表。当网关代理需要连接到您自己的服务器或本地/私有网络中其他主机上的资源（例如 localhost 上的数据库、Docker 服务名称或私有 IP 主机）时，您需要将该地址添加到 ALLOW\_SOURCES — 否则连接尝试将被拒绝。

## 了解详情

* [设置 Qlik Data Gateway - Direct Access](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setting-up.htm)
* [在 Windows 服务器上设置 Qlik Data Gateway - Direct Access](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/direct-access-gateway-setup-win.htm)