Ubuntu 22.04 安装 ITFlow 26.10 指南

在 Ubuntu 22.04 从零安装 ITFlow 26.10:Nginx + PHP 8.3 + MariaDB 全流程实测,Web 向导与官方 CLI 静默安装双方案,cron 托管与排障实录。

ITFlowITFlowPHP 应用自托管2026/10/23

Ubuntu 22.04 安装 ITFlow 26.10 指南

目标:在一台全新的 Ubuntu 22.04 服务器上,从零安装并跑通 ITFlow 26.10(MSP 客户门户/工单/财务一体化系统),覆盖 Nginx + PHP 8.3 + MariaDB 手动安装(主方案)、官方 CLI 静默安装(备方案)、Web 安装向导逐步操作、cron 后台任务托管与常见故障实录。本文全部命令与回显均在 Ubuntu 22.04.5 LTS 实机环境逐条实测采集。

一、环境信息

本文实测环境与版本基线如下:

项目值备注
操作系统Ubuntu 22.04.5 LTS(/etc/os-release 的 PRETTY_NAME 实测值)x86_64
ITFlowv26.10(git 标签,commit c05ccb738,2026-10-01 发布)全文版本统一为 26.10
Web 服务器nginx/1.18.0 (Ubuntu)Ubuntu 22.04 官方仓库版本
PHP8.3.36(ondrej/php PPA)v26.10 内置依赖要求 PHP ≥ 8.2.0,系统自带 8.1 不满足(见 FAQ 8.1)
数据库MariaDB 10.6.23官方强烈推荐 MariaDB,明确不建议 MySQL
站点根目录/var/www/html与官方安装文档一致
运行用户www-dataNginx/PHP-FPM 默认运行用户
示例地址192.0.2.10文档示例统一用该地址代指你的服务器,操作时替换为实际 IP 或域名

涉及的软件分工:Nginx 负责 HTTP 接入与 PHP 反代,PHP-FPM(8.3)执行应用代码,MariaDB 存储全部业务数据(安装完成后 141 张表),cron 负责每分钟拉起 ITFlow 的后台任务调度器。

二、前置条件

开始前请确认以下条件全部满足:

  1. 一台 Ubuntu 22.04 服务器,拥有 root shell(或可 sudo 的账号);
  2. 服务器可访问外网(apt 源、GitHub、launchpad PPA);GitHub 访问慢时可走代理,例如 git -c http.proxy=http://代理地址:端口 clone ...;
  3. 已开放 80 端口(HTTPS 部署则再加 443);
  4. 熟悉基本的 Linux shell 操作——官方文档对使用者的原话要求是 "Familiarity with the Linux shell" 与 "A little patience and willingness to troubleshoot when things go wrong"(来源:docs.itflow.org/installation,查询日期 2026-10-23)。

⚠️ 注意:ITFlow 官方明确 Windows 不受支持("ITFlow on Windows is unsupported"),也不要用 MySQL 替代 MariaDB——官方文档原话 "some pages do not load properly when using MySQL"。

三、版本选型说明

装哪个版本、用什么 PHP 版本,是 Ubuntu 22.04 上装 ITFlow 的第一个岔路口:

选型项推荐值依据
ITFlow 版本v26.102026-10-01 发布的最新稳定版(GitHub Releases 实查,查询日期 2026-10-23);官方自 2025-01 起进入 stable 月度发版
PHP 版本8.3(ondrej/php PPA)v26.10 内置 Composer 依赖的平台检查文件 libs/vendor/composer/platform_check.php 要求 PHP_VERSION_ID >= 80200,即 PHP ≥ 8.2;Ubuntu 22.04 自带 8.1,必须升级
数据库MariaDB 10.6(Ubuntu 22.04 仓库默认)官方安装文档明确推荐 MariaDB over MySQL
Web 服务器Nginx + PHP-FPM(本文主方案)/ Apache + mod_php(官方文档口径)官方 "works best on Apache",但 Nginx + PHP-FPM 在低内存服务器上资源占用更优;两者都可用

关键差异解读:版本选型的核心约束是 PHP ≥ 8.2。这条要求不来自 ITFlow 本体(它没有 composer.json),而来自其打包进仓库的第三方库(如 PHPMailer 等,位于 libs/vendor/)。因此哪怕应用页面上没报错,只要 PHP 是 8.1,涉及这些库的功能(典型如 cron 邮件队列)就会失败——这是 Ubuntu 22.04 用户最容易踩的坑,实录见 8.1 节。

四、方案 A:Nginx + PHP-FPM + MariaDB 手动安装(推荐,全流程实测)

本方案是官方 "Manual Installation"(apt 手动安装)在 Ubuntu 22.04 + Nginx 形态下的完整落地:先装基础栈,再升级 PHP 8.3,建库,克隆代码,走 Web 向导,最后托管服务与 cron。

4.1 更新系统与安装基础软件包

先刷新 apt 索引,再一次性安装 Nginx、MariaDB、PHP-FPM 及 ITFlow 必需的 PHP 扩展、git、cron:

# 更新软件源索引
sudo apt update

实测回显(节选):

Hit:1 http://security.ubuntu.com/ubuntu jammy-security InRelease
Hit:2 http://archive.ubuntu.com/ubuntu jammy InRelease
Hit:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease
Reading package lists... Done
# 安装 Nginx、MariaDB、git、cron、whois(域名刷新任务依赖 whois 客户端)
sudo apt install -y nginx mariadb-server git cron whois
# 安装 PHP 8.3 全家桶(PPA,见 4.2)及 ITFlow 必需扩展
sudo apt install -y php8.3-fpm php8.3-intl php8.3-mysql php8.3-curl \
  php8.3-gd php8.3-mbstring php8.3-zip php8.3-xml php8.3-cli

💡 说明:官方 Debian 文档的扩展清单是 php php-intl php-mysqli php-curl php-gd php-mbstring php-zip php-xml。在 Ubuntu 上对应的包名是 php8.3-intl、php8.3-mysql(提供 mysqli 驱动)等,逐项对应,一个不能少。

4.2 升级 PHP 到 8.3(Ubuntu 22.04 必做)

Ubuntu 22.04 官方仓库的 PHP 是 8.1,不满足 v26.10 依赖要求,需添加 ondrej/php PPA 安装 8.3:

# 安装 PPA 管理工具并添加 ondrej/php 源
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
sudo apt install -y php8.3-fpm php8.3-intl php8.3-mysql php8.3-curl \
  php8.3-gd php8.3-mbstring php8.3-zip php8.3-xml php8.3-cli

验证版本与扩展:

php8.3 -v | head -1

实测回显:

PHP 8.3.36 (cli) (built: Oct 21 2026 14:31:50) (NTS)
# 核对 7 个必需扩展全部就位
php8.3 -m | grep -E '^(intl|mysqli|curl|gd|mbstring|zip|xml)$'

实测回显:

curl
gd
intl
mbstring
mysqli
xml
zip

7 个扩展全部命中,前置依赖满足。

4.3 启动并托管基础服务

用 systemd 启动 MariaDB、PHP-FPM 8.3,并设置开机自启(每条命令只操作一个服务单元):

# 启动并自启 MariaDB
sudo systemctl enable --now mariadb

实测回显:

Synchronizing state of mariadb.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable mariadb
# 启动并自启 PHP-FPM 8.3
sudo systemctl enable --now php8.3-fpm
# 确认两个服务均为运行态
systemctl is-active mariadb
systemctl is-active php8.3-fpm

实测回显(各一行):

active
active

PHP-FPM 的 Unix 套接字路径确认(Nginx 反代要用):

ls /run/php/ | grep 8.3

实测回显:

php8.3-fpm.sock

4.4 创建数据库与专用账号

进入 MariaDB 命令行,创建 ITFlow 专用库与账号(示例口令 q1w2e3r4,生产请换成强口令):

sudo mysql -u root
CREATE DATABASE itflow;
CREATE USER 'itflow'@'localhost' IDENTIFIED BY 'q1w2e3r4';
GRANT ALL PRIVILEGES ON itflow.* TO 'itflow'@'localhost';
FLUSH PRIVILEGES;
SHOW DATABASES;

实测回显(SHOW DATABASES 部分):

+--------------------+
| Database           |
+--------------------+
| information_schema |
| itflow             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
EXIT;

验证专用账号可连库:

mariadb -u itflow -pq1w2e3r4 itflow -e 'SELECT 1;'

实测回显:

1
1

💡 说明:sudo mysql -u root 之所以免密,是因为 Ubuntu 的 MariaDB 默认对 root 启用 unix_socket 认证(仅限本机 root 系统账号)。生产上建议随后跑一次 sudo mysql_secure_installation 做基础加固(移除匿名用户、禁用 root 远程等),过程是交互式问答,按提示选 Y 即可。

4.5 克隆 ITFlow 代码到站点目录

以官方 Git 仓库为源头部署(ITFlow 的自更新机制依赖 Git 仓库形态,不要用 zip 包覆盖部署):

cd /var/www/html
sudo rm -f index.nginx-debian.html
sudo git clone https://github.com/itflow-org/itflow.git .

实测回显(进度行为交互终端实时刷新,此处为关键行节选):

Cloning into '.'...
remote: Enumerating objects: 71104, done.
remote: Total 71104 (delta 2159), reused 1941 (delta 1879), pack-reused 68585 (from 3)
Receiving objects: 100% (71104/71104), 140.21 MiB | 16.91 MiB/s, done.
Resolving deltas: 100% (47713/47713), done.

锁定到 v26.10 标签并核对版本:

sudo git checkout v26.10
sudo git describe --tags

实测回显:

Note: switching to 'v26.10'.
v26.10
sudo git log -1 --format='%h %ci %s'

实测回显:

c05ccb738 2026-10-01 15:25:55 -0400 Merge pull request #1303 from itflow-org/develop

版本号以应用内常量二次确认:

grep APP_VERSION /var/www/html/includes/app_version.php

实测回显:

DEFINE("APP_VERSION", "26.10");

4.6 设置目录属主与权限

Web 安装向导要以 www-data 身份写入 config.php、uploads/ 等路径,且 ITFlow 自更新靠 Git 拉取——官方要求把站点目录交给 www-data 并放开组写:

sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 775 /var/www/html

两条命令成功时无输出(Linux 惯例:静默即成功),可用下面命令复核属主已变更:

ls -ld /var/www/html

实测回显:

drwxrwxr-x 20 www-data www-data 4096 Oct 23 23:30 /var/www/html

4.7 配置 Nginx 站点

写入 ITFlow 站点配置(PHP 交给 8.3-FPM 套接字;上传上限按官方文档建议放宽到 500M):

sudo tee /etc/nginx/sites-available/itflow.conf > /dev/null <<'EOF'
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;
    root /var/www/html;
    index index.php index.html;

    client_max_body_size 500M;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}
EOF
# 停用默认站点,启用 ITFlow 站点,并做语法检查
sudo rm -f /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/itflow.conf /etc/nginx/sites-enabled/itflow.conf
sudo nginx -t

实测回显:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl reload nginx

4.8 调整 PHP 上传限制(官方建议值)

官方安装文档建议把上传/POST 上限调到 500M、脚本超时放宽到 300 秒(备份恢复、大附件场景需要)。编辑 /etc/php/8.3/fpm/php.ini,修改三处:

upload_max_filesize = 500M
post_max_size = 500M
max_execution_time = 300

修改后重启 FPM 并验证生效:

sudo systemctl restart php8.3-fpm
grep -E '^(upload_max_filesize|post_max_size|max_execution_time)' /etc/php/8.3/fpm/php.ini

实测回显:

max_execution_time = 300
post_max_size = 500M
upload_max_filesize = 500M

4.9 Web 安装向导:逐步实测

浏览器打开 http://192.0.2.10/setup/,进入安装向导。实测过程(每步的页面标题、表单字段、提交后的提示均为实测采集):

第 1 步:欢迎页。页面标题 ITFlow Setup,正文含 "Thank you for choosing to try ITFlow!",点击 Continue Setup 按钮进入下一步。

第 2 步:连接数据库(页面卡片标题 Step 2 - Connect your Database)。填写:

表单字段填写值说明
Database nameitflow4.4 节创建的库名
Database Hostlocalhost默认值,保持不变
Database user accountitflow4.4 节创建的账号
Database user passwordq1w2e3r4对应口令

点击提交按钮后返回 HTTP 302 跳转下一步;若数据库信息填错,页面会停留在本步并显示连接错误,请回 4.4 节核对账号口令。

第 3 步:创建首个用户(卡片标题 Step 3 - Create your first user)。填写:

表单字段填写值
Full NameAdministrator
Email Addressadmin@example.com
Enter a Passwordq1w2e3r4(最少 8 位)

头像图片为可选项,留空即可。提交后实测返回 HTTP 302。

第 4 步:公司信息(卡片标题 Step 4 - Company Details)。必填项仅 Company Name 与 Country,本实测填写 Demo MSP Ltd / China,其余地址、电话、网址、税号按需填写。提交成功后页面顶部出现实测提示横幅:

Company Demo MSP Ltd created

第 5 步:区域与语言(卡片标题 Step 5 - Region and Language)。三选一表单:Language 选 en_US、Currency 选 USD、Timezone 选 Asia/Shanghai,提交返回 HTTP 302。

第 6 步:遥测选择(卡片标题 Step 6 - Telemetry)。"Would you like to share some data with us?" 按需勾选 Share;页面下方同时给出安装后必做的 crontab 条目(实测原文):

* * * * * php /var/www/html/cron/cron.php >/dev/null

点击 Finish and Sign in 提交(实测返回 HTTP 302),向导关闭。

安装完成的物证核验:向导最后一步会生成配置文件并建完全部数据表,逐一确认:

sudo cat /var/www/html/config.php

实测回显:

<?php

$dbhost = 'localhost';
$dbusername = 'itflow';
$dbpassword = 'q1w2e3r4';
$database = 'itflow';
$mysqli = mysqli_connect($dbhost, $dbusername, $dbpassword, $database) or die('Database Connection Failed');
$config_app_name = 'ITFlow';
$config_base_url = 'localhost:8146';
$config_https_only = TRUE;
$repo_branch = 'master';
$installation_id = 'Xldc1Vdqw7vWWAtRqfNghYhiOkh_wz4J';
$config_enable_setup = 0;

💡 说明:$config_base_url 是向导根据你浏览器访问所用的地址自动生成的(本实测环境为 localhost:8146,你的机器上会是 192.0.2.10 或你的域名)。$installation_id 每次安装随机生成,仅用于遥测标识。$config_enable_setup = 0 表示安装向导已关闭。

# 数据表数量核验(含表头行共 142 行 = 141 张表)
sudo mariadb -u root itflow -e 'SHOW TABLES;' | wc -l

实测回显:

142
# 数据库 schema 版本核验(26.10 对应 2.7.9)
sudo mariadb -u root itflow -e "SELECT config_current_database_version FROM settings;"

实测回显:

config_current_database_version
2.7.9

最后按官方建议收紧 config.php 权限:

sudo chmod 640 /var/www/html/config.php

4.10 首次登录与运行验证

浏览器打开 http://192.0.2.10/login.php,用第 3 步创建的账号(admin@example.com / q1w2e3r4)登录。实测登录成功后服务端返回 302 跳转到 /agent/clients.php,页面标题显示公司名 Demo MSP Ltd,右上角显示当前用户 Administrator,仪表盘加载正常即安装成功。

命令行侧的复核(HTTP 状态 + 页面标题):

curl -s -o /dev/null -w '%{http_code}\n' http://localhost/login.php

实测回显:

200

4.11 托管后台任务(cron)

ITFlow 的邮件队列、邮件转工单、SLA 监控、循环发票、备份、更新检查全部依赖每分钟一次的调度器拉起,共需两步:

第一步:安装 crontab 条目。 以站点文件属主用户(www-data)身份运行调度器,写入系统 cron:

echo '* * * * * www-data php /var/www/html/cron/cron.php >/dev/null' | sudo tee /etc/cron.d/itflow
sudo chmod 644 /etc/cron.d/itflow
sudo systemctl enable --now cron

实测 systemctl is-active cron 回显:

active

等一个调度周期(约 1 分钟)后,验证调度器确实被 cron 拉起过:

sudo mariadb -u root itflow -e "SELECT config_cron_last_dispatch_at FROM settings;"

实测回显:

+-----------------------------+
| config_cron_last_dispatch_at |
+-----------------------------+
| 2026-10-23 23:37:01         |
+-----------------------------+

系统日志里也能看到对应 CMD 记录(实测节选):

Oct 23 15:37:01 itflow-server CRON[27105]: (www-data) CMD (php /var/www/html/cron/cron.php >/dev/null)

第二步:在应用内打开 cron 总开关。 以管理员登录 Web 界面,进入 Maintenance > Cron(管理后台 admin/cron.php 页面,实测可访问、页面含 Mail Queue / Nightly Tasks / Backup 等任务卡片),把 Cron 开关打开。该开关存储于数据库 settings 表,打开后回显核验:

sudo mariadb -u root itflow -e "SELECT config_enable_cron FROM settings;"

实测回显(1 = 已开启):

+-------------------+
| config_enable_cron |
+-------------------+
|                 1 |
+-------------------+

第三步(可选但强烈建议):开启备份任务。 备份任务出厂默认关闭(cron_jobs 表 backup 行 cron_job_enabled=0),在同一名为 Maintenance > Cron 的页面打开 Backup 任务,或直接执行计划备份的验证运行:

sudo -u www-data php /var/www/html/cron/backup.php

实测回显(任务开启时):

Scheduled Full Backup complete

生成的备份包落在 uploads/backups/ 并登记进 backups 表:

sudo mariadb -u root itflow -e "SELECT backup_file_name, backup_size, backup_status, backup_source FROM backups;"

实测回显:

+--------------------------------------------------------------+-------------+---------------+----------------+
| backup_file_name                                             | backup_size | backup_status | backup_source  |
+--------------------------------------------------------------+-------------+---------------+----------------+
| itflow_20261023-233527_full_m-gi5Kk0HsVtFbW7qhioTff0oEhjrpaW.zip |       19260 | Complete      | Cron           |
+--------------------------------------------------------------+-------------+---------------+----------------+

⚠️ 注意:首次运行备份后,ITFlow 会在 config.php 追加一行备份加密密钥(实测:$config_backup_key = 'RLieWPf4cnw33NViIAS7zSbjEQ9Holnw';)。该密钥与备份文件一一绑定,丢失即备份不可恢复,请立即将其抄录到密码库之外的安全位置并纳入备份清单。

五、方案 B:官方 CLI 脚本静默安装(无人值守/批量部署适用)

除了 Web 向导,ITFlow 官方还提供 CLI 安装脚本 scripts/setup_cli.php(仓库自带,非第三方),适合脚本化、批量或在无图形终端的纯 SSH 环境部署。它完成与 Web 向导等价的工作:写 config.php、导入 141 张表的数据结构、建首个管理员。

5.1 前置

与方案 A 完全一致:4.1–4.7 节的基础栈、PHP 8.3、空数据库(建库建号命令同 4.4)、代码已克隆(4.5–4.6)。唯一区别是不需要浏览器。

5.2 查看参数

php /var/www/html/scripts/setup_cli.php --help

实测回显(全文):

ITFlow CLI Setup Script

Usage:
  php setup_cli.php [options]

Options:
  --host        Database host (required)
  --username    Database username (required)
  --password    Database password (required)
  --database    Database name (required)
  --base-url    Base URL (without protocol, e.g. example.com/itflow) (required)
  --locale      Locale (e.g. en_US) (required)
  --timezone    Timezone (e.g. UTC) (required)
  --currency    Currency code (e.g. USD) (required)
  --company-name        Company name (required)
  --country     Company country (e.g. United States) (required)
  --user-name   Admin user full name (required)
  --user-email  Admin user email (required)
  --user-password       Admin user password (min 8 chars) (required)
  --address     Company address (optional)
  --city        Company city (optional)
  --state       Company state (optional)
  --zip Company postal code (optional)
  --phone       Company phone (optional)
  --company-email       Company email (optional)
  --website     Company website (optional)
  --repo-branch Git repo branch to track (optional, default master)
  --non-interactive     Run in non-interactive mode (fail if required args missing)
  --help                Show this help message

If running interactively (without --non-interactive), any missing required arguments will be prompted.
If running non-interactively, all required arguments must be provided.

5.3 执行静默安装

先清空数据库与旧 config.php(仅限全新安装场景;已投产实例严禁执行 DROP DATABASE),再以一条命令完成安装:

sudo mariadb -u root -e "DROP DATABASE IF EXISTS itflow; CREATE DATABASE itflow; GRANT ALL PRIVILEGES ON itflow.* TO 'itflow'@'localhost'; FLUSH PRIVILEGES;"
sudo rm -f /var/www/html/config.php
sudo php /var/www/html/scripts/setup_cli.php \
  --host=localhost --username=itflow --password=q1w2e3r4 --database=itflow \
  --base-url=192.0.2.10 --locale=en_US --timezone=Asia/Shanghai --currency=USD \
  --company-name="Demo MSP Ltd" --country=China \
  --user-name=Administrator --user-email=admin@example.com --user-password=q1w2e3r4 \
  --address="1 Server Street" --city=Beijing --phone="+86-10-00000000" \
  --non-interactive

实测回显(全文):

Welcome to the ITFlow CLI Setup.

=== Database Setup ===
Git repo branch to track [master]:
=== Localization ===

=== Company Details ===
State/Province (optional): Postal Code (optional): Company Email (optional): Website (optional):
=== Create First User ===
Importing database schema...
Database imported successfully.
User Administrator created successfully.

Setup complete!
You can now log in with the user you created at: https://localhost:8146/login.php

Two things left before ITFlow can send mail, parse tickets or bill anyone:

  1. Add this single entry to the crontab of the user that owns the ITFlow files:

     * * * * * php /var/www/html/cron/cron.php >/dev/null

  2. Turn cron on in Maintenance > Cron. It ships off, and every job stops
     itself until it is enabled. Per-job schedules live on the same page.

💡 说明:① 结尾提示的 https://... 链接按 base-url 参数拼接显示,实际用 HTTP 时按 8.2 节处理 $config_https_only;② 可选参数未提供时脚本会打出空提示继续(见回显中 State/Province (optional): 等),属正常行为;③ 安装完成后同样要执行 4.6 节的属主收紧(CLI 以 root 运行时 config.php 属主为 root,建议 sudo chown www-data:www-data /var/www/html/config.php && sudo chmod 640 /var/www/html/config.php)与 4.11 节的 cron 托管两步。

5.4 安装结果验证

sudo git -C /var/www/html describe --tags
sudo mariadb -u root itflow -e 'SHOW TABLES;' | wc -l

实测回显:

v26.10
142

浏览器登录 admin@example.com / q1w2e3r4 能进入仪表盘即成功(实测 302 → /agent/clients.php)。

六、方案对比与选择建议

维度方案 A:手动 + Web 向导方案 B:setup_cli.php 静默安装
适用场景首次部署、想逐项确认向导语义无人值守、批量脚本化、纯 SSH 环境
是否需浏览器需要不需要
可配置项向导表单(公司信息、本地化、遥测)与向导等价,且多出 --repo-branch 等 CLI 参数
交互性表单逐步提交一条命令,--non-interactive 缺参即失败
安装产物相同(config.php + 141 张表 + 首个管理员)相同
后续步骤cron 托管 + Maintenance 开关同左

选择建议:一次性部署、希望照着页面核对每一步语义 → 方案 A;要写进 Ansible/自动化脚本、或在同一台机器反复重建测试实例 → 方案 B。两条路线产出的实例完全等价,后续运维与升级路径一致。另外,官方还维护着一个面向 Debian 的一键安装脚本(仓库 itflow-org/itflow-install-script,含 Let's Encrypt 与 crontab 配置),Ubuntu 服务器如坚持官方脚本路线可参考其仓库 README,本文不展开。

七、配置说明

安装完成后与「让系统正常转起来」直接相关的四类配置位置:

  1. 应用主配置 /var/www/html/config.php:数据库连接($dbhost/$dbusername/$dbpassword/$database)、站点名($config_app_name)、站点 URL($config_base_url)、HTTPS 强制开关($config_https_only)、更新分支($repo_branch)、备份加密密钥($config_backup_key,首跑备份后自动生成)。逐参数含义与改法见同专栏 C 篇《ITFlow 26.10 配置参数详解》(同批交付)。
  2. PHP 运行时 /etc/php/8.3/fpm/php.ini:上传与超时三件套(4.8 节);CLI 侧对应 /etc/php/8.3/cli/php.ini。
  3. Web 层 /etc/nginx/sites-available/itflow.conf:站点根目录、PHP 套接字路径、client_max_body_size。
  4. 后台任务:crontab 条目 /etc/cron.d/itflow(每分钟拉起 cron.php)+ 应用内 Maintenance > Cron 页(总开关与逐任务启停/调度)。

出站邮件(SMTP)、邮件转工单(IMAP)是安装后另需在 Web 后台配置的两块:前者在 Settings 相关页填写 SMTP 服务器与凭据,否则发票/工单邮件发不出;后者在工单设置里启用 Email-to-ticket 解析(未启用时 cron 的 ticket_email_parser 任务会提示 "Feature is not enabled",属正常提示非故障)。

八、常见问题(FAQ)

以下问题均为本实测过程中真实触发、真实解决,回显为原样采集。

Q1:页面/cron 报 "Composer detected issues in your platform",PHP 版本不达标?

现象(在 PHP 8.1 下运行 cron 调度器时的实测原文):

Composer detected issues in your platform:

Your Composer dependencies require a PHP version ">= 8.2.0". You are running 8.1.2-1ubuntu2.28.

Cron: job 'mail_queue' failed - Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.2.0". You are running 8.1.2-1ubuntu2.28.

定位:/var/www/html/libs/vendor/composer/platform_check.php 强制 PHP_VERSION_ID >= 80200。解决:按 4.2 节加装 PHP 8.3,把 Nginx 的 fastcgi_pass 指到 /run/php/php8.3-fpm.sock,并以 php8.3 作为 CLI 默认版本(update-alternatives 或直接用 php8.3 全路径),重启 FPM 后恢复。

Q2:安装完成后登录页提示 "Login is restricted as ITFlow defaults to HTTPS-only...",无法登录?

现象(纯 HTTP 访问登录时的实测原文,页面替代了登录表单):

Login is restricted as ITFlow defaults to HTTPS-only for enhanced security. To login using HTTP, modify the config.php file by setting config_https_only to false. However, this is strongly discouraged, especially when accessing from potentially unsafe networks like the internet.

原因:向导生成的 config.php 里 $config_https_only = TRUE,登录 Cookie 被标记 secure,HTTP 下无法回传。解决(仅限内网/测试环境,生产应配 HTTPS):

sudo sed -i 's/$config_https_only = TRUE;/$config_https_only = FALSE;/' /var/www/html/config.php

改完无需重启(PHP 每请求重新加载配置),实测立即恢复登录(POST /login.php 返回 302 → /agent/clients.php)。

Q3:cron 手动跑过一次后,系统 cron 的调度不再执行任务?

现象:曾以 root 身份手动执行 php cron/cron.php,之后 www-data 的系统调度只写 config_cron_last_dispatch_at、任务却不动。直接以 www-data 运行得到实测报错:

PHP Warning:  fopen(/tmp/itflow_cron_696309544e04e1eb7f6819c8a312c17f.lock): Failed to open stream: Permission denied in /var/www/html/cron/includes/cron_lock.php on line 80
Cannot open the cron lock file at /tmp/itflow_cron_696309544e04e1eb7f6819c8a312c17f.lock - check permissions and open_basedir.

原因:调度器在 /tmp 建安装专属锁文件,先被 root 跑过一次后锁文件属主是 root,www-data 打不开。解决:删除残留锁文件并统一运行身份:

sudo rm -f /tmp/itflow_cron_*.lock

实测清理后,下一分钟的系统调度即恢复正常(cron_jobs 表 mail_queue 行 last_run 更新为当分钟、状态 Stopped/Completed)。经验法则:cron.php 永远只由站点文件属主用户(www-data)运行,包括手动排障时。

Q4:CLI 脚本报 "This script must be run by the file owner"?

现象(root 运行 update_cli.php 的实测原文):

Error: This script must be run by the file owner (www-data) to proceed.
You could try sudo -u www-data php update_cli.php

解决:按提示切换属主身份运行,如 sudo -u www-data php /var/www/html/scripts/update_cli.php --help。

Q5:git 操作报 "dubious ownership"?

现象(root 在 www-data 属主的站点目录执行 git 的实测原文):

fatal: detected dubious ownership in repository at '/var/www/html'
To add an exception for this directory, call:

        git config --global --add safe.directory /var/www/html

解决:按提示执行 git config --global --add safe.directory /var/www/html,或始终用 sudo -u www-data git ... 操作仓库。

Q6:cron 跑了,但 ticket_email_parser 一直提示功能未启用?

实测状态(cron_jobs 表):

Stopped: Email Parser: Feature is not enabled - check Settings > Ticketing > Email-to-ticket parsing. See https://docs.itflow.org/ticket_email_parse  -- Quitting..

这不是故障:邮件转工单需要先在后台 Settings 的工单设置里启用并配好 IMAP 收信,未启用前任务每次自行跳过属预期行为。

Q7:backup.php 输出 "Scheduled backups are switched off - built queued work only"?

同 Q6 逻辑:备份任务出厂关闭( Maintenance > Cron 里 backup 任务默认 enabled=0),打开开关后才会按计划构建备份;排队备份(Web 端发起)则始终会被该脚本构建。

Q8:能不能用 MySQL 代替 MariaDB?

不能。官方安装文档明确 "We highly recommend MariaDB over MySQL. They are very similar but some pages do not load properly when using MySQL."。已误装 MySQL 的,最省事的路是换装 mariadb-server 后重建库并重导向。

Q9:如何升级到下一个月度版本?

两条路径:① Web 界面 Maintenance > Update 页排队更新("Queue Update" 把任务交给 cron 的 app_update 任务,26.10 官方升级说明原文即如此);② 命令行 sudo -u www-data php /var/www/html/scripts/update_cli.php——不带参数时先更新代码(硬重置到所跟踪分支)再应用数据库迁移,--update_db 则只跑数据库部分不碰 git。多版本管理依托 git 标签(git tag 可列出 v25.01 起全部版本);官方无降级流程,数据库迁移仅向前,回退唯一可靠方式是用备份包恢复(scripts/restore_cli.php,支持 --inspect 先查看包内容)。

九、卸载与清理

彻底移除 ITFlow 分四步(按需执行):

1. 停后台任务与站点:

sudo rm -f /etc/cron.d/itflow
sudo rm -f /etc/nginx/sites-enabled/itflow.conf && sudo systemctl reload nginx

2. 删除代码与上传文件:

sudo rm -rf /var/www/html

3. 删除数据库与账号:

sudo mariadb -u root -e "DROP DATABASE IF EXISTS itflow; DROP USER IF EXISTS 'itflow'@'localhost'; FLUSH PRIVILEGES;"

删除核验(先建一个演示库再删除,观察同名查询由有到无的真实变化):

sudo mariadb -u root -e "CREATE DATABASE itflow_demo; SHOW DATABASES LIKE 'itflow_demo';"

实测回显:

Database (itflow_demo)
itflow_demo
sudo mariadb -u root -e "DROP DATABASE itflow_demo; SHOW DATABASES LIKE 'itflow_demo';"

实测回显(返回空集,无任何行输出,仅回到命令提示符)。

4. (可选)卸载运行栈:

sudo apt remove -y nginx mariadb-server 'php8.3-*' && sudo apt autoremove -y

十、参考链接

  1. 官方安装文档(Debian 手动安装口径):https://docs.itflow.org/installation_apt (查询日期 2026-10-23)
  2. 官方安装方式总览:https://docs.itflow.org/installation (查询日期 2026-10-23)
  3. 官方 cron 配置文档:https://docs.itflow.org/cron (查询日期 2026-10-23)
  4. 官方 config.php 说明:https://docs.itflow.org/config_php (查询日期 2026-10-23)
  5. 源码仓库:https://github.com/itflow-org/itflow (v26.10 标签,查询日期 2026-10-23)
  6. 一键安装脚本仓库:https://github.com/itflow-org/itflow-install-script (查询日期 2026-10-23)
  7. ondrej/php PPA:https://launchpad.net/~ondrej/+archive/ubuntu/php (PHP 8.3 来源,查询日期 2026-10-23)
  8. 同专栏 A 篇 《ITFlow 26.10 介绍与选型指南》