跳转到内容

项目常见问题

项目启动失败

点击日志查看错误信息。 常见原因:

权限问题

项目目录应在 /opt/ace/projects/ 下,所有者为 www:

shell
chown -R www:www /opt/ace/projects/项目名

如果部署在 /root 下,需使用 root 用户运行(不推荐)。

找不到命令

node: No such file or directory,表示运行时不在服务的 PATH 中。

解决方法:

  1. 启动命令中使用带版本前缀的可执行文件,例如 node22 app.jsgo1.23 run main.gophp8.3 artisan serve。 创建项目时选择语言版本和框架后,面板会自动生成这个带前缀的命令。
  2. 或在编辑 -> 运行设置 -> 环境变量中添加 PATH(或其他任意变量)。

端口被占用

修改应用监听端口,或停止占用端口的进程:

shell
lsof -i:3000  # 查看占用端口的进程

项目类型与框架预设

创建项目时需要先选择一个项目类型。 支持的类型有通用GoJavaNode.jsPHPPython.NET。 项目列表也为每种类型提供了对应的标签页,便于筛选项目。

选择语言类型(通用除外)后会显示一个版本选择器,其中列出你已安装的运行时,以及一个框架预设。 选择版本和框架后会自动填充启动命令,使用带版本前缀的可执行文件,确保它能在服务最小化的 PATH 下运行。 你随时可以将框架切换为自定义并自行编写命令。

各类型可用的框架预设:

类型预设
Go运行模式:源代码go<version> run <entry file>,例如 main.go)或二进制(运行编译后的 <root_dir>/main
JavaSpring Boot (JAR)、Spring Boot (WAR)、Quarkus、Micronaut、Vert.x、Dropwizard
Node.jsExpress、Koa、Fastify、NestJS、Next.js、Nuxt.js、Hapi、AdonisJS
PHPLaravel Octane、Laravel (Artisan Serve)、ThinkPHP、Webman、Hyperf、Swoole HTTP、RoadRunner
PythonDjango、Flask、FastAPI (Uvicorn)、Tornado、Sanic、aiohttp、Gunicorn
.NETASP.NET Core Web、ASP.NET Core API、Blazor Server、gRPC Service、Worker Service

例如,选择 Node.js、版本 22Express 预设会生成 node22 app.js;选择 PHP、版本 8.3Laravel (Artisan Serve) 会生成 php8.3 artisan serve

配置环境变量

编辑 -> 运行设置 -> 环境变量,点击添加

常用配置:

  • NODE_ENV=production
  • PORT=3000

预启动命令

编辑 -> 运行设置 -> 启动前命令中配置。 在项目启动前执行,如安装依赖:

  • Node.js:npm installyarn
  • Python:pip install -r requirements.txt
  • Go:go build

启动前和启动后命令与服务本身使用相同的最小化 PATH(生成的单元不会设置自定义 PATH)。 如果某个裸命令在你的 shell 中可用,但启动前命令报告 command not found,请使用带版本前缀的可执行文件(例如 npm22 installpip3.12 install -r requirements.txt)或绝对路径,与启动命令的处理方式相同。

如果你需要覆盖 systemd 的默认行为,同一面板中还提供了启动后命令(启动后运行)、停止命令重载命令

查看项目日志

  1. 面板:项目列表点击日志
  2. 命令行:journalctl -u project-name -f(systemd 单元以项目命名,例如 myapp.service

项目自动重启

运行设置 -> 重启策略中配置:

  • 重启策略:不重启 / 总是重启 / 失败时重启 / 异常时重启 / 中止时重启 / 成功时重启
  • 重启间隔:两次重启之间的等待时间(例如 5s1min
  • 最大重启次数:防止无限重启

服务依赖

编辑 -> 依赖中,你可以控制相对于其他 systemd 单元的启动顺序(常见服务:network.targetmysqld.servicepostgresql.serviceredis.service):

  • Requires:强依赖。 如果所需的单元不可用,本服务将启动失败。
  • Wants:弱依赖。 即使这些单元启动失败,本服务仍会启动。
  • After:在所列单元之后启动本服务。
  • Before:在所列单元之前启动本服务。

资源限制

编辑 -> 资源限制中,你可以限制服务的资源占用:

  • 内存限制 (MB):最大内存。 设为 0 表示不限制。
  • CPU 配额:以百分比表示的 CPU 时间,100% 等于一个 CPU 核心(例如 50% = 半个核心,200% = 两个核心)。 留空表示不限制。

安全设置

编辑 -> 安全设置中,你可以加强服务隔离。 这些设置对应 systemd 的沙箱指令,可能导致功能异常,因此在依赖它们之前请先测试。

权限控制:

  • 禁止新权限:阻止服务及其子进程获取新权限(例如通过 setuid)。
  • 保护 /tmp:为服务提供独立的 /tmp
  • 保护 /home:使 /home/root/run/user 不可访问。
  • 保护系统:将部分文件系统挂载为只读 —— true/usr/boot 只读;full:同时将 /etc 设为只读;strict:整个文件系统只读。

路径访问控制:

  • 读写路径:允许服务读取和写入的路径(在启用保护系统时可用于开放例外)。
  • 只读路径:服务仅可读取的路径。

反向代理配置

创建项目时启用反向代理,然后填写域名项目端口。 系统会自动创建一个监听 80 端口的反向代理网站,将请求代理到 http://127.0.0.1:project-port

手动配置:创建反向代理网站,上游地址填 http://127.0.0.1:项目端口