Ubuntu 22.04 安装 ITFlow 26.10 指南
在 Ubuntu 22.04 从零安装 ITFlow 26.10:Nginx + PHP 8.3 + MariaDB 全流程实测,Web 向导与官方 CLI 静默安装双方案,cron 托管与排障实录。
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 |
| ITFlow | v26.10(git 标签,commit c05ccb738,2026-10-01 发布) | 全文版本统一为 26.10 |
| Web 服务器 | nginx/1.18.0 (Ubuntu) | Ubuntu 22.04 官方仓库版本 |
| PHP | 8.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-data | Nginx/PHP-FPM 默认运行用户 |
| 示例地址 | 192.0.2.10 | 文档示例统一用该地址代指你的服务器,操作时替换为实际 IP 或域名 |
涉及的软件分工:Nginx 负责 HTTP 接入与 PHP 反代,PHP-FPM(8.3)执行应用代码,MariaDB 存储全部业务数据(安装完成后 141 张表),cron 负责每分钟拉起 ITFlow 的后台任务调度器。
二、前置条件
开始前请确认以下条件全部满足:
- 一台 Ubuntu 22.04 服务器,拥有 root shell(或可 sudo 的账号);
- 服务器可访问外网(apt 源、GitHub、launchpad PPA);GitHub 访问慢时可走代理,例如
git -c http.proxy=http://代理地址:端口 clone ...; - 已开放 80 端口(HTTPS 部署则再加 443);
- 熟悉基本的 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.10 | 2026-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 name | itflow | 4.4 节创建的库名 |
| Database Host | localhost | 默认值,保持不变 |
| Database user account | itflow | 4.4 节创建的账号 |
| Database user password | q1w2e3r4 | 对应口令 |
点击提交按钮后返回 HTTP 302 跳转下一步;若数据库信息填错,页面会停留在本步并显示连接错误,请回 4.4 节核对账号口令。
第 3 步:创建首个用户(卡片标题 Step 3 - Create your first user)。填写:
| 表单字段 | 填写值 |
|---|---|
| Full Name | Administrator |
| Email Address | admin@example.com |
| Enter a Password | q1w2e3r4(最少 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,本文不展开。
七、配置说明
安装完成后与「让系统正常转起来」直接相关的四类配置位置:
- 应用主配置
/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 配置参数详解》(同批交付)。 - PHP 运行时
/etc/php/8.3/fpm/php.ini:上传与超时三件套(4.8 节);CLI 侧对应/etc/php/8.3/cli/php.ini。 - Web 层
/etc/nginx/sites-available/itflow.conf:站点根目录、PHP 套接字路径、client_max_body_size。 - 后台任务: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
十、参考链接
- 官方安装文档(Debian 手动安装口径):https://docs.itflow.org/installation_apt (查询日期 2026-10-23)
- 官方安装方式总览:https://docs.itflow.org/installation (查询日期 2026-10-23)
- 官方 cron 配置文档:https://docs.itflow.org/cron (查询日期 2026-10-23)
- 官方 config.php 说明:https://docs.itflow.org/config_php (查询日期 2026-10-23)
- 源码仓库:https://github.com/itflow-org/itflow (v26.10 标签,查询日期 2026-10-23)
- 一键安装脚本仓库:https://github.com/itflow-org/itflow-install-script (查询日期 2026-10-23)
- ondrej/php PPA:https://launchpad.net/~ondrej/+archive/ubuntu/php (PHP 8.3 来源,查询日期 2026-10-23)
- 同专栏 A 篇 《ITFlow 26.10 介绍与选型指南》