学会部署APEX是为了更好构建企业级AI应用打基础,比如企业级的知识平台、智能报表等。

先前在《手把手教你喂养 DeepSeek 本地模型》,使用AnythingLLM方式,虽然操作上已经非常方便,但更多偏向于个人使用。

虽然直接使用现成的APEX云服务很方便,但现实中“本地部署”能匹配到更多场景,大家可自行脑补。

这里的“本地部署”是广义的,对应所有你需要自己动手搭建APEX环境的情形,即便你的环境是在云上。

关键点:

手工部署最新版 APEX 及 ORDS,为后续学习 APEX 奠定环境基础。

特别说明:

这里仅供大家学习测试使用,重在体验把AI带入应用开发的APEX,因此暂不考虑高可用等极致要求。

  • 1.安装环境准备
  • 2.APEX安装
  • 3.ORDS安装
  • 4.搞定收工

1.安装环境准备

安装前提:

已安装好23ai数据库环境,确认系统JDK版本在JDK17或以上,提前下载好最新版APEX和ORDS。

安装之前我们先看下APEX的架构图,图中的Web Server就是指ORDS:

APEX下载地址:【目前最新版是Application Express (APEX) 24.2,今年1月15号刚刚发布】

ORDS下载地址:【目前最新版是Oracle REST Data Services 24.4

附:Oracle软件下载总入口【Oracle旗下软件缺啥找不到都可以来这里搜】:

温馨提示:

  • 1)如果数据库安装部署有疑问,可参考Oracle安装部署,版本升级,应用补丁快速参考
  • 2)没有Oracle 23ai介质的同学们,别折腾,可以先使用23ai Free版,完全免费提供。
  • 3)截止目前最新版APEX是24.2,就算之前没听过APEX也没关系,你很幸运,这一版本APEX非常强大,可以深度结合AI,包括最近大火的 DeepSeek,能够真正实现低代码甚至无代码开发企业级AI应用。
  • 4)如果过程中系统遇到缺少依赖包情况可以使用DNF快速安装,DNF本地源配置可参考:YUM退役了?DNF本地源配置
  • 5)笔者这里的测试操作系统是Oracle Linux 8.10,不踩坑建议直接相同版本,同源的RHEL和CentOS原则上问题也不大。

2.APEX安装

注:以下操作均使用oracle用户操作,笔者这里因为目前测试资源严重不足,因此目录选择比较特殊,千万不要模仿。

建议你可以选择比较常规的目录,比如/u01/app/apex/opt/app/apex之类。

1)解压并拷贝静态文件

# 1.解压APEX 24.2的安装包:
[oracle@23ai-primary app]$ unzip apex_24.2.zip # 2.查看apex目录下的image目录,大小约550M+,同时确认下空间够用:
[oracle@23ai-primary apex]$ pwd
/var/oled/app/apex
[oracle@23ai-primary apex]$ du -sh images/
554M images/ # 3.官方建议将新版本的静态文件(如图片、CSS、JS)放置到独立的新目录
# 因此笔者这里创建新目录:/var/oled/app/apex/apex_images,并拷贝静态文件到新目录,后面会用到
[oracle@23ai-primary apex]$ mkdir apex_images
[oracle@23ai-primary apex]$ cp -r /var/oled/app/apex/images/* /var/oled/app/apex/apex_images/

2)在PDB下安装最新版APEX

这里为了保持测试环境干净,笔者选择在自己新建的一个PDB下安装最新版APEX。

PDB是alfred,新建表空间是tbs_alfred,新建应用用户是app1

PDB新建的命令和基础设置参考如下:

-- 1. Create a new PDB with specified parameters
CREATE PLUGGABLE DATABASE alfred
ADMIN USER pdbadmin IDENTIFIED BY "alfredzhao"
STORAGE (MAXSIZE 10G)
PATH_PREFIX = '/u01/app/oracle/oradata/alfred/'; -- 2. Open PDB and configure auto-start
ALTER PLUGGABLE DATABASE alfred OPEN;
ALTER PLUGGABLE DATABASE alfred SAVE STATE; -- 3. Switch to PDB container context
ALTER SESSION SET CONTAINER = alfred; -- 4. Create tablespace for application data
CREATE TABLESPACE tbs_alfred
DATAFILE '/u01/app/oracle/oradata/alfred/tbs_alfred01.dbf'
SIZE 100M AUTOEXTEND ON; -- 5. Create application user with privileges
CREATE USER app1 IDENTIFIED BY app1;
GRANT DB_DEVELOPER_ROLE TO app1;
ALTER USER app1 QUOTA UNLIMITED ON tbs_alfred; -- 6. Configure default tablespace and verify
ALTER USER app1 DEFAULT TABLESPACE tbs_alfred; SELECT username,
default_tablespace,
temporary_tablespace
FROM dba_users
WHERE username = 'APP1';

确认在apex目录中,然后进入sqlplus,切换到刚刚新建的PDBalfred下,调用SQL脚本安装APEX:

[oracle@23ai-primary apex]$ pwd
/var/oled/app/apex
[oracle@23ai-primary apex]$ sqlplus / as sysdba
08:08:36 PRIMARY @ORCL -> SYS @CDB$ROOT> ALTER SESSION SET CONTAINER = alfred;
08:08:54 PRIMARY @ORCL -> SYS @CDB$ROOT> @apexins.sql SYSAUX SYSAUX TEMP /i/

大概5分钟安装结束,关键显示如下:

Thank you for installing Oracle APEX 24.2.0
Oracle APEX is installed in the APEX_240200 schema.

3)APEX相关用户修改密码、按需解锁用户

修改APEX相关用户密码,因为密码强度有要求,这里演示均按 Apex_Test@2025设置来演示。

确认是在APEX安装目录下:

[oracle@23ai-primary ~]$ cd /var/oled/app/apex/
[oracle@23ai-primary apex]$ sqlplus / as sysdba

确认在pdb下面执行:

SQL>
ALTER SESSION SET CONTAINER = alfred;
@apxchpwd.sql
@apex_rest_config.sql

注意:这里的密码要求非常复杂,如果设置简单就会提示类似这样的提示:

--------------------------------------------------------------------------------
Password does not conform to this site's password complexity rules.
* Password must contain at least one numeric character (0123456789).
* Password must contain at least one upper-case alphabetic character.
--------------------------------------------------------------------------------

修改成功类似输出如下【只需要关注笔者标识为<<-- 只有这里输入密码的地方,其他都可以直接回车】:

-- @apxchpwd.sql
@apxchpwd.sql
...set_appun.sql
Elapsed: 00:00:00.00
================================================================================
This script can be used to change the password of an Oracle APEX
instance administrator. If the user does not yet exist, a user record will be
created.
================================================================================
Enter the administrator's username [ADMIN]
User "ADMIN" does not yet exist and will be created.
Elapsed: 00:00:00.00
Enter ADMIN's email [ADMIN]
Enter ADMIN's password [] <<-- 只有这里输入密码
... -- @apex_rest_config.sql
@apex_rest_config.sql
...
Enter a password for the APEX_LISTENER user [] <<-- 只有这里输入密码
Enter a password for the APEX_REST_PUBLIC_USER user [] <<-- 只有这里输入密码
...

然后按需解锁APEX相关用户,以下三个用户比较常用:

-- 1. 解锁 APEX 核心服务账户并重置密码(建议使用独立密码)
ALTER USER APEX_PUBLIC_USER
IDENTIFIED BY "Apex_Test@2025" -- 生产环境应为唯一强密码
ACCOUNT UNLOCK; ALTER USER APEX_LISTENER
IDENTIFIED BY "Apex_Test@2025" -- 不同账户建议设置不同密码
ACCOUNT UNLOCK; -- 2. 按需解锁 REST 服务账户(无 REST 需求时可跳过)
ALTER USER APEX_REST_PUBLIC_USER
IDENTIFIED BY "Apex_Test@2025"
ACCOUNT UNLOCK; -- 3. 创建专用密码策略并应用(生产环境慎用 UNLIMITED)
CREATE PROFILE PASSWORD_UNLIMITED LIMIT
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED; ALTER USER APEX_PUBLIC_USER
PROFILE PASSWORD_UNLIMITED;

说明:

  • APEX_PUBLIC_USER - 核心服务账户,用于处理 APEX 应用的 HTTP 请求(通过 ORDS 连接数据库)。若未解锁,所有 APEX 应用将无法访问。
  • APEX_LISTENER - 用于监听 APEX 的工作请求(如邮件发送、Web 服务调用)。若未解锁,部分后台作业和服务可能无法正常运行。
  • APEX_REST_PUBLIC_USER - 仅在使用 APEX REST 数据服务时需解锁。若您的应用未使用 REST 功能,可保持锁定以降低安全风险。

另外笔者这里测试这几个用户解锁操作是在CDB下执行的,在PDB中执行会提示报错:ORA-65066: The specified changes must apply to all containers,这里没深入研究,最终不影响测试。

4)禁用DB内置的PL/SQL网关,并检查端口状态

因为我们要用ORDS实现Web Server的功能,所以这里需要禁用DB内置的PL/SQL网关避免冲突:

SQL>
-- 禁用DB内置的PL/SQL网关
exec dbms_xdb.sethttpport(0);
exec dbms_xdb.setftpport(0); -- 检查 HTTP 端口状态(0 表示已禁用)
SELECT DBMS_XDB.GETHTTPPORT() FROM DUAL; -- 检查 FTP 端口状态(0 表示已禁用)
SELECT DBMS_XDB.GETFTPPORT() FROM DUAL;

5)中文包安装

SQL>
@builder/zh-cn/load_zh-cn.sql

6)开放用户外网访问权限

SQL>
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*', -- 允许访问所有主机(生产环境建议替换为具体域名或IP)
ace => xs$ace_type(
privilege_list => xs$name_list('connect'), -- 授予连接权限
principal_name => 'APEX_PUBLIC_USER', -- 授权给APEX公共用户
principal_type => xs_acl.ptype_db -- 指定主体类型为数据库用户
)
);
END;
/

3.ORDS安装

1)解压ORDS安装包

这里测试,和数据库部署在一起,另外因为空间有限,依然借用下这个目录:

[oracle@23ai-primary app]$ pwd
/var/oled/app
[oracle@23ai-primary app]$ mkdir ords
[oracle@23ai-primary app]$ unzip ords-latest.zip -d /var/oled/app/ords

2)创建ORDS配置目录

这里新建的目录和ords目录同级,即/var/oled/app/ords_config

mkdir ords_config

3)配置环境变量

$ vi ~/.bash_profile
-- 增加下面两个环境变量
export PATH=$PATH:/var/oled/app/ords/bin
export ORDS_CONFIG=/var/oled/app/ords_config $ source ~/.bash_profile

4)安装ORDS

输入命令ords install然后按照交互提示选择适合自己环境的选项:

[oracle@23ai-primary app]$ ords install
ORDS: Release 24.4 Production on Tue Feb 18 09:07:58 2025
...
Oracle REST Data Services - Interactive Install Cannot get the entries in tnsnames.ora located in /u01/oracle/product/23ai/dbhome/network/admin/tnsnames.ora. TNS-04610: No literals left, reached end of NV pair
Enter a number to select the database connection type to use
[1] Basic (host name, port, service name)
[2] TNS (TNS alias, TNS directory)
[3] Custom database URL
Choose [1]:

这里默认1回车继续..

Retrieving information.
ORDS is not installed in the database. ORDS installation is required. Enter a number to update the value or select option A to Accept and Continue
[1] Connection Type: Basic
[2] Basic Connection: HOST=localhost PORT=1521 SERVICE_NAME=alfred.***
Administrator User: SYS AS SYSDBA
[3] Database password for ORDS runtime user (ORDS_PUBLIC_USER): <generate>
[4] ORDS runtime user and schema tablespaces: Default: SYSAUX Temporary TEMP
[5] Additional Feature: Database Actions
[6] Configure and start ORDS in Standalone Mode: Yes
[7] Protocol: HTTP
[8] HTTP Port: 8080
[9] APEX static resources location:
[A] Accept and Continue - Create configuration and Install ORDS in the database
[Q] Quit - Do not proceed. No changes
Choose [A]: A

输入A回车继续..

2025-02-18T09:11:33.600Z INFO        Oracle REST Data Services initialized
Oracle REST Data Services version : 24.4.0.r3451601
Oracle REST Data Services server info: jetty/12.0.13
Oracle REST Data Services java info: Java HotSpot(TM) 64-Bit Server VM (build: 17.0.12+8-LTS-286 mixed mode, sharing)

ORDS安装成功。

5)配置APEX静态内容

使用 Ctrl+C 终止 ORDS 服务的运行状态,然后配置 APEX 静态内容:

$ ords config set --global standalone.static.context.path /i 

# 下面 /var/oled/app/apex/apex_images 这个是Apex的静态资源目录,之前在APEX安装前拷贝过的
$ ords config set --global standalone.static.path /var/oled/app/apex/apex_images # 配置JDBC 连接池(按需设置、可选)
$ ords config set jdbc.MaxLimit 90
$ ords config set jdbc.InitialLimit 90

6)防火墙策略放开8080端口

如果你配置开启了防火墙,需要放开8080端口:

# 开放8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 重载防火墙
firewall-cmd --reload
# 查看配置
firewall-cmd --list-all

笔者这里测试环境,没开防火墙:

# firewall-cmd --list-all
FirewallD is not running

所以直接跳过这步。

6)以 Oracle 用户身份在后台运行 ORDS 服务

nohup ords serve &

4.搞定收工

1)通过浏览器访问 ORDS 主页

确认ORDS所在机器的IP地址:xxx.xxx.xxx.xxx <<-- 替换为你真实的IP地址

默认主页地址:http://<ip_address>:8080/ords

使用浏览器访问:

可以看到界面了:

Oracle REST Data Services (ORDS) 是用于 Oracle 数据库的 HTTPS Web 网关。功能包括 SQL Developer Web、Oracle APEX 访问、用于数据和数据库的 REST API 以及 Oracle Database API for MongoDB 等。

2)在中间的APEX部分,直接点击开始

这里 Workspace,填写输入internal,首次登录必须使用 INTERNAL 工作区,这是 APEX 安装时自动创建的管理入口。

用户名:ADMIN(默认管理员账户)

初始密码:在安装 APEX 时通过脚本 apxchpwd.sql 设置的密码。

3)创建普通工作区,切换到新工作区进行日常操作

上步登录成功后,就会来到这个界面:

这里选择Create Workspace,创建普通工作区apex-demo

这里选择之前已经创建的app1用户,点击Next:

为这个普通工作区指定一个管理员密码,这个密码没啥强度要求。

然后指定一个email地址,这个email地址是我按blog地址随便编的:

继续下一步,确认信息没问题:

直接点击Create Workspace

创建完成,点击Done,然后退出管理员界面:

退出成功,点击返回登录页面

然后使用新建的普通工作区apex-demo,使用刚刚创建的admin用户和密码登录:

第一次登录会提示你修改密码,重新输入然后点击Change Password

终于,进入了自己的普通工作区:

至此,已完成本地部署拥有AI能力的APEX。

什么?你说AI能力在哪里?别急哈,我们先把这个环境给搭好,一步步来!

记住最后的登录界面,下次计划会基于此环境,利用AI演示开发一个简单的 APEX 程序,敬请期待。

此外,更多APEX 24.2资料可直接参考官方文档,一起学起来吧:

APEX实战第1篇:本地部署拥有AI能力的APEX的更多相关文章

  1. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  2. Docker虚拟化实战学习——基础篇(转)

    Docker虚拟化实战学习——基础篇 2018年05月26日 02:17:24 北纬34度停留 阅读数:773更多 个人分类: Docker   Docker虚拟化实战和企业案例演练 深入剖析虚拟化技 ...

  3. Docker实战 | 第四篇:Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结

    一. 前言 在之前的文章中 IDEA集成Docker插件实现一键自动打包部署微服务项目,其中开放了服务器2375端口监听,此做法却引发出来一个安全问题,在上篇文章评论也有好心的童鞋提示,但自己心存侥幸 ...

  4. Spring Cloud实战 | 第十篇 :Spring Cloud + Seata 1.4.1 + Nacos1.4.0 整合实现微服务架构中逃不掉的话题分布式事务

    Seata分布式事务在线体验地址:https://www.youlai.store 本篇完整源码地址:https://github.com/hxrui/youlai-mall 有想加入开源项目开发的童 ...

  5. Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制

    一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...

  6. Exceptionless 本地部署

    免费开源分布式系统日志收集框架 Exceptionless 前两天看到了这篇文章,亲身体会了下,确实不错,按照官方的文档试了试本地部署,折腾一番后终于成功,记下心得在此,不敢独享. 本地部署官方wik ...

  7. Sping Boot入门到实战之入门篇(一):Spring Boot简介

    该篇为Spring Boot入门到实战系列入门篇的第一篇.对Spring Boot做一个大致的介绍. 传统的基于Spring的Java Web应用,需要配置web.xml, applicationCo ...

  8. ArcGIS API for JavaScript 4.x 本地部署之Apache(含Apache官方下载方法)

    IIS.Nginx都说了,老牌的Apache和Tomcat也得说一说(如果喜欢用XAMPP另算) 本篇先说Apache. 安装Apache 这个...说实话,比Nginx难找,Apache最近的版本都 ...

  9. ArcGIS API for JavaScript 4.x 本地部署之Nginx法

    上篇ArcGIS API for JavaScript 4.x 离线配置之IIS法提到,如何用IIS配置ArcGIS jsAPI: 本篇则使用http下的Nginx配置,其原理基本一致.https的部 ...

  10. 升级本地部署的CRM到Dynamics 365及部分新特性介绍。

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复241或者20161226可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

随机推荐

  1. 如何解决Git合并冲突?

    讲个故事先: 一个晴朗的日子,Alex 把远程版本库的修改拉到他的本地版本库. 他修改了名为 abc.txt 的文件,将其暂存(staged),提交(committed),最后推送(pushed)回远 ...

  2. OpenEuler安装MongoDB并配置访问密码

    1. 下载MongoDB.安装 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-4.4.18.tgz tar zxv ...

  3. R数据分析:潜在转化分析LTA的做法和解释(一)

    之前给大家写了很多潜在类别分析的教程Mplus教程:如何做潜在类别分析LCA R数据分析:用R语言做潜类别分析LCA Mplus数据分析:潜在类别分析(LCA)流程(详细版) R数据分析:再写潜在类别 ...

  4. Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800!

    1.问题截图 cat /var/log/mysql/error.log 2019-01-28T09:49:57.076019Z 0 [ERROR] [FATAL] InnoDB: Table flag ...

  5. 巧用mask属性创建一个纯CSS图标库

    说明 mask 是CSS中的一个属性,它允许开发者在元素上设置图像作为遮罩层.这个属性的强大之处,在于它可以接受多种类型的值,包括关键字值.图像值.渐变色,甚至可以设置多个属性值. SVG(Scala ...

  6. SpringBoot项目请求路径中有正反斜杠的处理办法

    在Application中添加静态代码块: //默认情况下Tomcat等服务器是拒绝url中带%2F或者%5C的URL,因为它们经浏览器解析之后就变成了/和\, // 服务器默认是拒绝访问的,所以需要 ...

  7. 【转载】Netty堆外内存泄漏排查

    https://www.imooc.com/article/298943 上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章 ...

  8. Ubuntu终端输入异常、无法退格(删除文本)、使用方向键命令

    1 起因 为了学习嵌入式开发安装去安装的ncurses库,使用命令:sudo apt-get install libncurses5-dev导致系统自带的ncurses-base被自动删除. 2 出现 ...

  9. 在openEuler RISC-V上无痛部署Solidity

    近几年区块链很火,随着各国政府对加密技术的监管政策不断变化和BTC的暴涨,越来越多人对这项去中心化的技术充满着期待.这次我用openEuler 24.09 RISC-V的远程机器尝试编译了Solidi ...

  10. Qt音视频开发26-ffmpeg播放器

    一.前言 用ffmpeg来实现自己的播放器,这是一直以来的一个目标,之前的难点卡在音视频同步以及如何播放声音这两点(尽管之前已经进行过不少的尝试和探索,但是问题还是挺多,比如音视频同步不完美,有些文件 ...