NJet Portal 应用门户管理介绍


NGINX 向云原生演进,All in OpenNJet 


1. 应用门户简介

NJet 应用引擎是基于 Nginx 的面向互联网和云原生应用提供的运行时组态服务程序,作为底层引擎,NJet 实现了NGINX 云原生功能增强、安全加固和代码重构,利用动态加载机制可以实现不同的产品形态,如Web服务器、流媒体服务器、负载均衡、代理(Proxy)、应用中间件、API网关、消息队列等产品形态等等。NJet使用现有的API Gateway及各动态配置模块提供的能力,实现了一个Portal管理模块。通过该模块,对外提供应用门户的功能,以此来简化应用的开发及部署过程。应用可以只专注于业务逻辑的实现,将通用的安装配置及权限认证功能统一交给NJet应用门户管理模块。逻辑架构如下图所示:


2. 应用部署流程

用户使用管理员账号登录Portal门户,上传应用,添加用户/组/角色,最后进行应用的授权。完成上述操作后,使用普通用户账号登录门户,即可使用应用。

a. 管理员登录

在部署包含Portal 管理模块的环境上,使用api gateway的管理员账号登录后,将显示Portal 的管理界面,在该界面中可以进行应用的部署,及相关的授权。


b. 上传应用

应用管理中点击“新增”,选择Portal 应用的相应npk 文件(应用的结构在后续章节进行说明)。点击确认后,Portal管理模块将自动创建应用需要的Location/Upstream, 由于使用了NJet的动态配置功能,所有的改动将实时生效,不需要重启或重加载NJet。

 

 

 

 

应用如果需要连接第三方组件,门户管理模块也提供了通用组件的配置能力。

c. 创建访问应用需要的用户/组/角色

应用门户使用Api Gateway提供的授权能力,其模型是“用户->组->角色”的授权模型,一个用户可以归属于不同的用户组,一个用户组可以分配多个角色,API 授权将授权到角色上。


应用门户的 UI上可以对用户/组/角色及相互间的关系进行维护。

d. 对应用进行授权

在应用管理中,选择应用授权,对应用不同的访问路径可以授予不同的角色。

e. 普通用户登录

使用普通用户账号登录后,将显示应用一览页面,在改列表页面中点击对应的图标,将跳转至具体的应用中。

3. Portal 应用结构

使用Portal 管理模块部署的应用,需要使用Portal模块可以识别的格式进行目录规划及应用打包,文件类型是npk (NJet Package)。 典型的目录结构如下图所示:

  • META-INF 目录
    manifest.json: 应用的基本信息,包括入口地址,配置地址,及location / upstream 信息。
    图标文件: jpg 或 jpg 格式的文件
    app_openapi.json: openapi 3.0 格式的文件,其中path 支持 通配符*, 例如 /setting/*
    app_schema.json: 应用需要的组件配置项 (可选,非必须)

  • scripts 目录
    应用使用的脚本

  • static 目录
    静态页面,资源文件,javascript 脚本, css

manifest.json 示例
该文件中定了入口地址(entry_point), 应用配置地址(cfg_url), 及应用需要的 location, upstream servers, \proxy_pass。Location 中可以直接配置属性("__access_control": “true” ) 来标识该访问地址需要使用门户提供的用户授权功能。

{
  "manifest_version": "1.0.0",
  "app": {
    "name": "ollamaApp",
    "version": "1.0.0",
    "arch": "x86_64",
    "description": "Ollma Chat application",
    "icon_file": "ollama.jpg",
    "api_file": "app_openapi.json" 
  },
  "deployment": {
    "type": "location",
    "server_name": "",
    "entry_point": "/ollama-app/open/chat",
    "cfg_url": "/ollama-app/open/config",
    "locations": [
      {
        "path": "/ollama-app/conversation",
        "properties": {
          " content_by_lua_file": "${APP_PREFIX}/scripts/chat_api.lua"
        }
      },
      {
        "path": "/ollama-app/setting",
        "properties": {
          "__access_control": "true", 
          " content_by_lua_file": "${APP_PREFIX}/scripts/chat_api.lua"
        }
      },
      {
        "path": "/ollama-app/chat",
        "properties": {
          "access_by_lua_file": "${APP_PREFIX}/scripts/access.lua",  
           "proxy_set_header": [
            "Host 192.168.0.206",
            "Origin http://192.168.0.206"
          ],
          "proxy_pass": {
            "schema": "http",
            "servers": [
              {"server":"192.168.40.206:11434"}
            ],
            "url": "/api/chat"
          }
        }
      },
      {
        "path": "/ollama-app",
        "properties": {
          "__access_control": "true", 
          "alias": "${APP_PREFIX}/static/",
          "try_files": "$uri $uri/ /ollama-app/index.html"
        }
      }
    ]
  }
}


app_schema.json 示例
应用需要连接第三方组件时,组件的配置通过json文件描述配置项,门户管理模块将根据json内容动态生成配置页面。该配置使用 formily (阿里巴巴表单框架 https://formilyjs.org/)定义的格式。 以下示例文件为连接redis 组件时需提供的json文件。

{
"redis_host": {
"type": "string",
"x-component": "Input",
"x-component-props": {
"placeholder": "请输入ip地址"
},
"x-decorator": "Form.Item",
"x-decorator-props": {
"label": "Redis IP",
"tooltip": "请输入ip地址"
}
},
"redis_port": {
"type": "number",
"x-component": "InputNumber",
"x-component-props": {
"placeholder": "请输入端口号",
"min": 0,
"max": 65535
},
"x-decorator": "Form.Item",
"x-decorator-props": {
"label": "Redis Port",
"tooltip": "请输入端口号"
}
},
"redis_password": {
"type": "string",
"x-component": "Input.Password",
"x-component-props": {
"placeholder": "请输入 密码"
},
"x-decorator": "Form.Item",
"x-decorator-props": {
"label": "Redis密码",
"tooltip": "请输入密码"
}
}
}



4. Demo 应用完整实例

a. 通过ftp 获取到 demo 应用包

地址: ftp.tmlake.com
目录: /OpenNjet/Software/v3.2.2-portal
文件: demo_app_1.0.2.npk

b. 使用默认管理员账号 agw_admin /****** 登录 /portal

c. 添加demo应用

在应用管理中,选择新增,添加获取的 demo_app_1.0.2.npk, 并点击确认

成功后,应用管理页面将出现 demo 应用的条目

d. 为用户添加用户/组/角色

添加一个demo用户角色

添加一个demo用户组

为这个组分配角色

添加一个 user1 用户,并指定 domain 为 “demo”


为这个用户分配组

e. 编辑应用的授权

在应用管理列表中点击 demo 的授权

该应用只有一个访问地址,选择后点击授权,在弹出的窗口下拉框中选择"demoUserRole"

f. 使用刚创建的普通用户账号登录 /portal


应用列表中显示出我们刚刚部署的demo 应用

点击应用图标后,跳转到应用的页面

该demo应用只是简单的一些页面Tab, 展示的也只是一些测试数据

5. 后续改进

目前部署的应用有新版本需要升级时,需要在应用管理中删除应用后,重新上传。后续将继续优化门户管理模块,提供应用的版本管理及回滚功能。

6. 参考

a. 使用到的API

API Gateway: 用户/组/权限的增删改查,api group 创建,oas3.0 格式文档导入,应用部署接口
https://gitee.com/njet-rd/njet/blob/master/doc/swagger/helper_api_gateway.yaml
动态Location API: 动态添加及删除Location
https://gitee.com/njet-rd/njet/blob/master/doc/swagger/helper_dy_loc.yaml
动态Upstream API: 动态添加及删除 Upsteam
https://gitee.com/njet-rd/njet/blob/master/doc/swagger/helper_dyn_http_ups.yaml\

b. Demo 应用包的下载

地址: ftp.tmlake.com \
目录: /OpenNjet/Software/v3.2.2-portal
文件: demo_app_1.0.2.npk

c. NJet版本及Portal 获取及安装

NJet 版本需要 > 3.2.2
Portal 门户管理模块获取:
地址: ftp.tmlake.com

目录: /OpenNjet/Software/v3.2.2-portal/
文件: portal_1.0.2.npk , ssh_remote_mod.so
Portal 门户管理模块安装:
修改配置 /usr/local/njet/conf/njet.conf

worker_processes auto;

cluster_name njet;
node_name node1;

error_log logs/error.log error;

helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf;
helper broker modules/njt_helper_broker_module.so;

load_module modules/njt_agent_dynlog_module.so;
load_module modules/njt_dyn_ssl_module.so;
load_module modules/njt_http_vtsc_module.so;
load_module modules/njt_http_location_module.so;
load_module modules/njt_http_lua_module.so;
load_module modules/njt_http_dyn_upstream_module.so;
load_module modules/njt_http_dyn_server_module.so;
load_module modules/njt_http_token_sync_module.so;
load_module modules/njt_http_upstream_member_module.so;
load_module modules/njt_http_dyn_lua_module.so;

events {
worker_connections1024;
}

shared_slab_pool_size100m; 
http {
token_sync zone=token:4M sync_time=5s clean_time=10s;
dyn_kv_conf conf/iot-work.conf;
include mime.types;
access_log off;
vhost_traffic_status_zone;

lua_package_path "$prefix/lualib/lib/?.lua;$prefix/modules/?.lua;$prefix/apps/?.lua;;";
lua_package_cpath "$prefix/lualib/clib/?.so;;";
init_by_lua_block {
local _=require("lor.index")
local _=require("lsqlite3complete")
}
server {
listen 8080;
error_page 401 =302 /portal;
client_max_body_size 1000m; 
location / {
 root html;
}
location /icons/ {
alias /usr/local/njet/apps/__icons/;
try_files $uri =404;
 }
}
}


load_module modules/njt_http_sendmsg_module.so;
load_module modules/njt_ctrl_config_api_module.so; 
load_module modules/njt_helper_health_check_module.so;
load_module modules/njt_http_upstream_api_module.so; 
load_module modules/njt_http_location_api_module.so;
load_module modules/njt_doc_module.so;
load_module modules/njt_http_vtsd_module.so;
load_module modules/njt_http_lua_module.so;
load_module modules/njt_http_dyn_upstream_module.so;
load_module modules/njt_http_dyn_upstream_api_module.so;
load_module modules/njt_http_dyn_server_api_module.so; 
load_module modules/njt_http_upload_module.so;

error_log logs/error_ctrl.log error;

events {
worker_connections1024;
}

http {
dyn_kv_conf conf/ctrl_kv.conf;
lua_package_path "$prefix/lualib/lib/?.lua;$prefix/modules/?.lua;;";
lua_package_cpath "$prefix/lualib/clib/?.so;;";
init_by_lua_block {
local _=require("lor.index")
local _=require("lsqlite3complete")
}
include mime.types;
access_log off;
server {
client_max_body_size 1000m;
listen 8081;

location / {
return 200 "njet control panel\n";
}

location /api {
dyn_module_api;
}

location /doc {
doc_api;
}

location /metrics {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}

location /api_gateway {
 access_by_lua_block {
local ac=require("api_gateway.access.control")
local access=ac.new("/api_gateway")
access:check()
 }
 content_by_lua_block {
local api_gateway=require("api_gateway")
api_gateway.main()
 }
}
}
}


拷贝 ssh_remote_mod.so

sudo cp ssh_remote_mod.so /usr/local/njet/lualib/clib/

重启 njet

sudo systemctl stop njet
sudo systemctl start njet 


将下载后的 portal_1.0.2.npk 文件上传到 njet 主机上,并且主机上安装 curl 及 jq 命令行工具

NJET_SITE="http://localhost:8081"

PORTAL_FILE=$(curl -k -s -F "file=@portal_1.0.2.npk""$NJET_SITE/api/v1/upload" |jq -r '.file')

TOKEN=$(curl -k -X POST -d '{"login_data":{"username": "agw_admin", "password": "********"}}' -s "$NJET_SITE/api_gateway/auth/login" | jq -r '.token')

curl -X 'POST' \
"$NJET_SITE/api_gateway/deploy/app" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"uploaded_file\": \"$PORTAL_FILE\"}"

NJet 应用引擎通过内核重构实现了独特的运行时动态配置加载能力,是新一代高性能 Web 应用引擎。NJet 拥有高性能数据面处理能力,将集群、高可用、主动健康检查、声明式 API 等多种辅助功能,通过 NJet 独特的副驾驶 CoPilot 服务框架调度,从而方便功能扩展,隔离管理 / 控制功能对数据面的影响,NJet 应用引擎性能超过 CNCF 推荐 Envoy 应用引擎的三倍。 邮件组  官网


相關推薦

2022-04-04

定制的强调色。 CHRIS DAVIS 计划在不久的将来向 xdg-desktop-portal 提交一个提案。在 GNOME 中,最好只在 UI 中显示一些经过 QA 测试的强调色,但 libadwaita 将支持配置任意颜色。 使用重新着色 API 的开发人员可以用编程的方法更改其

2023-02-07

管理页面增加了列表视图: 系统配置页面增加了 PortalDB 和 ConfigDB 所有配置项的列表视图: 开放平台权限管理页面增加了第三方应用列表视图: 配置项的类型支持 用户现在可以修改配置项的类型,Apollo 将根据类型

2024-06-28

OpenNJet v3.0.0 已经发布,这是一个云原生应用引擎。 此版本更新内容包括: 新功能 动态证书吊销列表更新 http2mqtt 消息代理 http2kafka 消息代理 数据消隐(access日志隐藏敏感信息) 集群动态桥接 集群间文件同步 大

2022-10-26

Bug修复: 会话结束时终止 flatpak-session-helper 和 flatpak-portal 服务,这样应用程序就不会继承过时的 Wayland 和 X11 套接字地址(#5068) 使用 fishshell 时,不要覆盖之前设置的 XDG_DATA_DIRS( #5123 ) 如果链接到不支持它的 libcurl 版本

2024-03-30

置同步关于命令式api 动态删除location消息同步存在问题 应用加速功能,删除location后本地缓存文件没有立马同步清理 配置沙箱进程,在NJet 可执行文件热升级时,无法在旧的沙箱进程退出后,再启动新的配置沙箱 动态VS,只

2024-01-25

现在 njet 支持yum源安装了,目前只支持 centos 7 和 x86_64架构! 具体安装方式如下: step 1: 生成njet.repo echo " [opennjet] name=OpenNJet baseurl=https://njet.org.cn/download/linux/centos/$releasever/$basearch/ enabled=1 gpgcheck=1 gpgkey=https://njet.org.cn/download/li

2024-06-29

则使NJet可以动态设置对客户端的返回,在CORS控制、作为应用服务器方面等方面使用广泛 更多详情了解:https://gitee.com/njet-rd/njet/releases/tag/v3.0.0

2024-01-10

curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://njet.org.cn/download/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/njet.gpg sudo chmod a+r /etc/apt/keyrings/njet.gpg 2. 添加APT源 echo \   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/

2023-12-30

能力。 对模块继续进行动态化改造,优化了动态证书管理,覆盖企业灰度发布等关键场景,动态 location 能力在 v2.0.0 已经进入成熟阶段。 加入新协议 HTTP/3 。 主要实现了 HTTP/3 的 Server 能力,以及 ftp 协议的代理能力。

2023-08-30

了解详情:https://sourl.cn/42yfCU      官网:njet.org.cn/      邮件组: [email protected]                      [email protected]

2023-02-12

此去年 10 月,开发者 GeorgesStavracas 在 Flatpak 的 xdg-desktop-portal 中提交了后台应用程序监控的提议,该提议希望可以通过 D-Bus 暴露后台运行的应用程序,以便 GNOME 桌面可以围绕后台运行的应用程序开发更丰富的界面。 开发者 Geor

2023-11-16

oxy的动态特性、高性能实现。弥补了nginx 在云原生场景中应用的不足。 🍀 OpenNJet Ingress Controller提供了丰富的流量管理功能,如动态location、host / path路由、负载均衡、动态upstream、金丝雀发布、SNI等。 🍀 OpenNJet Ingress Controller

2024-01-16

eport 引起的access log api 显示listen ip 端口重复的Bug; 🍀 njet启动后,直接访问prometheus 格式的metrics 地址出错; 🍀配置了stream map,多次reload 出现core 等问题。 🤞更多详情:https://gitee.com/njet-rd/njet/releases/tag/v2.0.1  👏官

2025-04-12

维护 敏感词 配置系统敏感词,支持标签分组 应用管理 管理 SSO 单点登录的应用,支持多种 OAuth2 授权方式 地区管理 展示省份、城市、区镇等城市信息,支持 IP 对应城市 会员组管理 前台注册的用户都是