自动安装

自动方式:从个人中心运行一个脚本即可完成整台服务器的准备工作 (Apache + PHP 网络栈、数据库、安全工具、cron)。之后只需 部署面板、签发 SSL 并输入许可证。适用于 Ubuntu/Debian:在全新 VPS 上从零配置一切,在已配置好的服务器上则仅做增量改动(配置文件“已配置服务器”,步骤 01)。 下方所有命令均按顺序排列,从上往下依次操作即可。在全新 VPS 上,每一步都可以逐一执行; 如果服务器已经配置过,或者上面装有主机控制面板,脚本会有意将一部分工作留给您—— 具体是哪些,它会在运行结束时写明(输出内容的解读见步骤 01)。

请将命令中的占位值替换为您自己的值:monitor.example.com 是您的域名;203.0.113.10 是服务器的真实 IP;/var/www/monitor 是面板根目录(存放 public/、assets/、config.php 的位置);数据库密码请自行设置。
完整套件(“全面防护”)面向全新 VPS。在纯净的 Ubuntu/Debian 上,它会从零配置安全系统——Fail2ban(jail.local)、root 的 crontab、UFW 规则、Apache 配置。如果服务器已经配置好(有正在运行的面板、网站、邮件、自定义 jail),请选择“已配置服务器”配置文件:它只做增量改动,不会触碰您的防火墙、Fail2ban、邮件、SSH 和 sysctl。当检测到主机控制面板时,脚本会自动切换到此模式。首次运行前可以开启试运行(在个人中心勾选)——它会显示将执行哪些操作,而不做任何更改。在生产服务器上,建议先创建一个快照(snapshot)以防万一。

01. 来自个人中心的自动配置命令

该命令请在您的个人中心 my.arciveo.com → “服务器配置”板块中获取(订购 Arcivéo Security Monitor 后即可使用)。它与您的账户绑定,并包含专属令牌。

该脚本会准备好整台服务器:Web 栈(Apache + PHP)、数据库、SSL 工具、完整的防护组件以及 cron 任务(Lynis、SMART、debsums、Logwatch、每日报告、ipsum 更新)。

1)选择防护级别(在个人中心中,复制命令前):

  • 完整防护(推荐)——UFW(防火墙)、Fail2ban、CrowdSec + bouncer、ipsum(IP 封锁列表)、Suricata(IDS/IPS)、Falco、ModSecurity + OWASP CRS(WAF)、PSAD、mod_evasive(防 DoS)、AIDE(文件完整性)、debsums、ClamAV + maldet(杀毒)、Auditd、AppArmor、Monit、Lynis(审计)、Logwatch、安全自动更新。
  • 精简版——适用于内存较小的 VPS:基础组件,不含重量级模块。
  • 已配置服务器(主机面板)——适用于已在运行、带面板(HestiaCP 等)、网站和邮件的服务器:仅做增量式改动(补装工具、cron、sudo 规则),而防火墙、Fail2ban、邮件、SSH 和 sysctl 保持原样。在带面板的服务器上,脚本会自动选择此模式。
试运行。在个人中心中可勾选“试运行”——此时命令只会显示脚本将安装和更改的内容,然后结束,不做任何改动。在已配置好的服务器上很有用:先试运行,再取消勾选进行实际运行。

2)在服务器上以 root 身份执行个人中心中的命令——它形如:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN" | sudo bash
请妥善保密该命令——它与您的账户绑定。链接有效期有限;若已过期,请在个人中心中点击“获取新链接”。
自动配置完成后,Web 服务器为 Apache + PHP-FPM,而安全工具和 cron 任务已安装并“开箱即用”。

3)请阅读结尾处的输出——那里写明了还有哪些工作需要您完成。脚本会以一段检查结果和一份“接下来——安装面板”的清单结束运行。其中一部分步骤它是有意不做的:具体是哪些,取决于所选的配置文件以及它在服务器上发现的情况。请对照下方清单——只需执行那些在您的输出中确实出现了对应行的条目。

  • Control panel detected (…) —— 站点由主机控制面板自身创建,脚本不会创建虚拟主机。请见步骤 03 的“带主机控制面板的服务器”分支。
  • No vhost created (no domain given) —— “已配置服务器”配置文件且未提供域名:没有名称的虚拟主机会成为默认站点并抢占您自己的站点,因此脚本没有创建它。请见步骤 03 的“手动创建虚拟主机”分支。
  • sudo rules NOT written —— 脚本无法确定面板运行在哪个账户下。这是常见情况:面板文件是在自动配置之后才上传的,当时还没有可供判断的依据。缺少这些规则,各模块将读取不到系统数据。请见步骤 04 的“Web 服务器的 sudo”板块。
  • ! Nginx does not read .htaccess —— Apache 前面还有一层 Nginx,而自动把禁止规则写入其配置未能成功。请务必手动完成:否则 data/、keys/、database/ 和 config.php 会绕过 .htaccess 直接对外开放。请见步骤 03 的“如果 Apache 前面有 Nginx”板块。
  • UFW installed but inactive —— 防火墙已安装但未启用:在已配置好的服务器上,脚本不会自行启用它,以免切断您的访问。请自行启用,并务必放行您的 SSH 端口:
    sudo ufw allow OpenSSH # 非标准 SSH 端口:sudo ufw allow 2222/tcp sudo ufw allow 80,443/tcp sudo ufw enable
  • Fail2ban installed but not running —— 请启动它:sudo systemctl enable --now fail2ban。
  • Database server present … but not running —— 请在步骤 04 之前启动数据库服务:sudo systemctl enable --now mariadb(或 mysql——取决于所安装的版本)。
  • Certbot skipped — issue SSL in … —— 证书由主机控制面板中的 Let's Encrypt 开关签发;您无需执行步骤 06。
如果检查结果一切正常,最后一行会是 All checks passed。带 ! 的条目需要留意;详细信息会写入日志,脚本会在最末尾打印日志路径(Log: …)。

02. 域名与 DNS

要通过类似 monitor.example.com 的地址访问面板并获取免费 SSL,域名必须指向服务器。请在 DNS 管理面板(域名注册商或主机商处)创建一条 A 记录:

类型: A 名称: monitor (子域名 → monitor.example.com) 或 @ (根域名 → example.com) 值: 203.0.113.10 ← 您服务器的 IP TTL: 3600

几分钟后(有时需要一小时),请检查域名是否已指向服务器:

dig +short monitor.example.com # 应返回您的 IP # 或者,若没有 dig: getent hosts monitor.example.com
SSL 证书(步骤 06)只针对域名签发,因此在签发证书之前,DNS 必须已指向服务器。

03. 上传面板文件

常规情况(全新 VPS)。自动配置已经创建面板目录 /var/www/monitor 并配置好 Apache 站点(DocumentRoot 指向面板根目录、PHP-FPM、为 .htaccess 设置 AllowOverride)。在脚本输出中对应的是 vhost … → DocumentRoot … 这一行。无需另行创建目录和虚拟主机——只需上传文件并设置权限。
有两种情况不会创建虚拟主机——脚本会在运行结束时明确说明。此时请先执行下面对应的分支,然后再上传文件。

“带主机控制面板的服务器”分支(输出中为:Control panel detected (…))。这类服务器上的站点由面板统一管理,脚本有意不创建自己的虚拟主机——面板首次重建配置时就会把它覆盖掉。操作顺序如下:

  1. 在主机面板(HestiaCP 等)中创建一个 Web 域名——其 DocumentRoot 保持原样。
  2. 将发行版完整上传到该域名的 public_html 中:除 index.php、api/、assets/ 外,服务性的 config.php、includes/、data/、tmp/、logs/、keys/、cron/、database/ 也应放在同级目录中。无需把任何内容移到网站根目录之外:服务性目录已由发行版自带的 .htaccess 保护,在 Nginx 下则由脚本写入域名配置的禁止规则保护。
  3. SSL 由面板自身的 Let's Encrypt 开关签发——请跳过步骤 06。
  4. 接下来是权限(本步骤下文)、数据库(步骤 04)和 config.php(步骤 05)。请把命令中的路径替换为 /home/账号/web/域名/public_html,并把属主替换为该域名的用户,而不是 www-data。

“手动创建虚拟主机”分支(输出中为:No vhost created (no domain given))。这只会出现在“已配置服务器”配置文件且未传入域名的情况下。最简单的办法是带上域名重新执行个人中心里的命令:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN&profile=existing" | sudo bash -s -- monitor.example.com

重复运行是安全的:已完成的操作不会重复执行。如果确实需要手动创建虚拟主机——下面就是安装程序所写入的同一份配置:

sudo mkdir -p /var/www/monitor # PHP-FPM 套接字自动识别——各服务器上的 PHP 版本不同。 PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) sudo tee /etc/apache2/sites-available/arciveo-monitor.conf > /dev/null <<'EOF' <VirtualHost *:80> ServerName monitor.example.com DocumentRoot /var/www/monitor <Directory /var/www/monitor> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> <FilesMatch "\.php$"> SetHandler "proxy:unix:__PHPSOCK__|fcgi://localhost" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/arciveo-monitor_error.log CustomLog ${APACHE_LOG_DIR}/arciveo-monitor_requests.log combined </VirtualHost> EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/apache2/sites-available/arciveo-monitor.conf sudo a2ensite arciveo-monitor.conf sudo apache2ctl configtest sudo systemctl reload apache2
这里的 ServerName 是必需的。没有名称的虚拟主机会成为 Apache 的默认站点,并开始响应同一台服务器上其他域名的请求。出于同样的原因,在已配置好的服务器上请不要停用 000-default.conf:该站点有可能已被改造成某个正在使用的站点——在全新 VPS 上安装程序会自行移除它,而这里不需要这么做。
如果 Apache 前面有 Nginx(输出中为:! Nginx does not read .htaccess)。Nginx 直接从磁盘返回静态文件,并且不读取 .htaccess——即便 Apache 已正确保护,服务性目录仍会对外开放。脚本已预先准备好一份包含禁止规则的文件;需要把它引入您站点的 server{} 块中并重新加载 Nginx:
include /etc/nginx/snippets/arciveo-deny.conf;
sudo nginx -t && sudo systemctl reload nginx # 验证:应返回 403,而不是文件内容 curl -sI https://monitor.example.com/config.php | head -1
购买后可在 my.arciveo.com 的个人中心 → “下载”下载面板文件(发行版压缩包)。上传到服务器前请先解压。

请将发行版内容上传到 /var/www/monitor(使 public/、assets/、config.php 等位于其中)——通过 SFTP/SCP(FileZilla / WinSCP)或从本地计算机执行 scp 命令:

scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
若想让虚拟主机中立即写入您的域名(ServerName),可在步骤 01 就将其传入自动配置命令:… | sudo bash -s -- monitor.example.com(或在个人中心的“面板域名”字段中填写域名)。若未传入域名——面板会响应任意主机和 IP 访问,而 ServerName 将在签发 SSL 时由 certbot 写入(步骤 06);无需重新安装任何内容。
请设置文件权限——这是必需步骤。若以 root 身份或通过 SFTP 上传,文件将归 root 所有,Web 服务器(www-data)将无法读取——面板会打开为空白页或出现 403 错误(日志中:.htaccess unreadable / directory not executable)。下面的命令可修复此问题:
# 规范化整个 web 根目录的权限:由 root 创建的目录 # Web 服务器(www-data)无法访问——否则面板会返回空白页或 403。 cd /var/www/monitor # 请在 chown 之前创建工作目录——否则新目录仍归 root:root 所有, # 在 chmod 750 时 Web 服务器(www-data)将无法写入。 sudo mkdir -p data/lynis data/logwatch tmp logs sudo chown -R www-data:www-data /var/www/monitor sudo find /var/www/monitor -type d -exec chmod 755 {} \; sudo find /var/www/monitor -type f -exec chmod 644 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 750 data tmp logs

为自己开通 SFTP 上传权限。执行上面的命令后,所有文件都归 www-data 所有,而 FileZilla / WinSCP 是以您自己的用户连接的——上传时会报 SSH_FX_PERMISSION_DENIED(Permission denied)。请从以下两种方案中选择一种。

方案 A——仅为您的用户设置 ACL(推荐)。只有您获得写入权限,Web 服务器仍然无法覆盖面板代码:

sudo apt install -y acl # 为您的用户授予整个面板目录的写入权限: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # 同一规则作为默认值——适用于之后创建的文件和目录: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

方案 B——通过 www-data 组。更简单,但 Web 服务器同样获得对面板文件的写入权限:一旦 PHP 出现漏洞,代码就可能被替换。命令顺序很重要——config.php 和工作目录最后收紧:

sudo usermod -aG www-data deploy # 组写入权限 + setgid(数字 2):通过 SFTP 上传的文件仍留在 # www-data 组中,否则面板将无法覆盖它们。 sudo find /var/www/monitor -type d -exec chmod 2775 {} \; sudo find /var/www/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 2750 /var/www/monitor/data /var/www/monitor/tmp /var/www/monitor/logs
采用方案 B 后,请在 FileZilla 中重新连接(服务器 → 断开连接,然后重新登录)——新的用户组只在重新登录后生效,在此之前依然没有权限。检查:id deploy,组列表中应出现 www-data;ls -ld /var/www/monitor,权限为 drwxrwsr-x,用 s 代替 x 表示 setgid 已设置。

04. 数据库

请先创建数据库和用户,然后导入表结构。数据库代码块整体粘贴到终端即可(sudo mysql 通过 unix 套接字以 root 身份登录——无需 root 密码)。monitor_db 和 monitor_user 仅为示例名称,您可自定义;请记住数据库名、用户名和密码——下一步需要填入 config.php:

# 1. 数据库。数据库名、用户和密码只需在下面设置一次,会自动填入所有相关行。 # 整块粘贴到终端;sudo mysql 通过 unix 套接字以 root 身份登录 # (无需 root 密码)。请勿使用交互式的 `sudo mysql -u root -p` # 再粘贴——粘贴时 SQL 语句会进入密码输入而丢失。 DBNAME='monitor_db' # ← 数据库名,可保持不变 DBUSER='monitor_user' # ← 数据库用户,可保持不变 DBPASS='CHOOSE_A_PASSWORD' # ← 密码,请自行设置 sudo mysql <<SQL CREATE DATABASE IF NOT EXISTS $DBNAME CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS '$DBUSER'@'localhost' IDENTIFIED BY '$DBPASS'; GRANT ALL ON $DBNAME.* TO '$DBUSER'@'localhost'; FLUSH PRIVILEGES; SQL # 验证(应显示 $DBNAME): mysql -u "$DBUSER" -p"$DBPASS" -e "SHOW DATABASES;" # 请将这三个值填入 config.php → DB_NAME、DB_USER、DB_PASS。
通常无需导入表结构——首次在浏览器打开面板时,若数据库为空,面板会自动创建数据表和 admin 账户(来自 database/db.sql)。

如果数据表没有创建成功(面板显示数据库连接错误,或本应是登录表单的位置是一片空白)——请手动导入表结构。命令需在面板根目录下执行,取值来自上面的代码块:

# 导入表结构: cd /var/www/monitor && mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" < database/db.sql # 验证——应显示数据表列表: mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" -e "SHOW TABLES;"
如果 $DBNAME / $DBUSER / $DBPASS 这几个变量已经“失效”(换了新的终端会话)——请在命令中手动填入实际值,或用上面代码块中的那三行重新设置一遍。
Web 服务器的 sudo。通常这些规则已由自动配置写入,各模块可立即读取系统数据。但如果脚本输出中出现过 sudo rules NOT written 这一行——说明当时没有依据可以判定面板账户(文件尚未上传),因此规则并未创建。缺少它们,防火墙、Fail2ban、CrowdSec 等板块会一直是空的。现在文件已经就位,请重新执行个人中心里的命令,并显式指明账户:
curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN&profile=existing" | sudo ARCIVEO_USER=www-data bash -s -- monitor.example.com
请把 www-data 替换为您站点的 PHP 实际运行用户(在主机控制面板上通常是该域名的属主)。可以这样查看:
ps -o user= -C php-fpm8.3 | sort -u # 请替换为您自己的版本 # 或者:ps aux | grep -m3 '[p]hp-fpm'
重新运行后的检查:文件 /etc/sudoers.d/monitor 存在,且其中含有带您用户名的条目。

05. 配置 config.php

面板根目录下的 config.php(/var/www/monitor/config.php)是唯一需要手动编辑的文件。面板的所有设置都以 define() 常量的形式定义在其中。用编辑器打开它:

sudo nano /var/www/monitor/config.php

在有高亮的地方填入您自己的值,其余保持原样:

// --- 数据库(来自第 04 步)--- define('DB_HOST', 'localhost'); // 保持不变 define('DB_NAME', 'db_name'); // 第 04 步中创建的库 define('DB_USER', 'user'); // 第 04 步中创建的用户 define('DB_PASS', 'db_password'); // 第 04 步中设置的密码 define('DB_CHARSET', 'utf8mb4'); // 保持不变 // --- 应用 --- define('APP_URL', 'https://monitor.example.com'); // 面板地址,末尾不加斜杠 define('TIMEZONE', 'Asia/Shanghai'); // 您的时区 // --- 会话时长 --- define('SESSION_LIFETIME', 28800); // 重新登录前的空闲时间,秒(28800 = 8 小时)

需要修改的内容:

  • DB_NAME、DB_USER、DB_PASS —— 与您在第 04 步创建数据库时设置的库名、用户和密码完全一致(若保留了示例值 —— monitor_db / monitor_user)。请勿改动 DB_HOST 和 DB_CHARSET。
  • APP_URL —— 面板的完整地址,带 https://,末尾不加斜杠,也不带 www。必须与您激活许可证所用的域名一致(第 07 步),否则密钥将被拒绝。
  • TIMEZONE —— 您的时区(列表见 timedatectl list-timezones)。它只影响面板显示日期的方式;对 cron 任务的启动时间没有影响(那里使用系统时区)。
  • SESSION_LIFETIME —— 空闲多少秒后面板要求重新登录(默认 8 小时)。例如 3600 = 1 小时,86400 = 一天。
  • 错误日志相关部分(display_errors、log_errors、error_log)—— 保持默认即可。

保存文件(Ctrl+O、Enter,再按 Ctrl+X)并重启 PHP-FPM —— 否则由于 OPcache,改动不会生效:

sudo systemctl restart php*-fpm
config.php 是机密文件(其中含数据库密码)。它位于面板根目录,也就是网站根目录,但已被保护:权限为 640(在第 03 步设置)并在根 .htaccess 中明确禁止访问。请勿将其上传到公开仓库,也不要带着真实密码发给支持团队。
所有参数的详细说明见 FAQ:“config.php 文件 —— 面板的全部设置”。

06. 签发 SSL 证书(HTTPS)

面板仅支持通过 HTTPS 访问。 登录会话使用安全 cookie,而 WebAuthn(2FA)按标准也只在 HTTPS 下工作。通过 http:// 您将无法登录。
在带主机控制面板的服务器上无需执行此步骤(脚本输出中为:Certbot skipped — issue SSL in …)。证书由面板自身 Web 域名上的 Let's Encrypt 开关签发——这样续期也由面板负责。

certbot 及其 Apache 插件已在自动配置时安装完成。域名的 DNS 应已指向本服务器(步骤 02)。一条命令即可签发:

sudo certbot --apache -d monitor.example.com

如果面板还需要通过 www. 访问——请在同一条命令中列出两个名称,否则浏览器在第二个地址上会显示证书警告:

sudo certbot --apache -d monitor.example.com -d www.monitor.example.com
只有在第二个名称同样有指向本服务器的 A 记录时才可以添加它(步骤 02)。否则 Let's Encrypt 将无法验证它,整张证书都签发不出来——包括主域名在内。
certbot 会询问:
  1. Enter email address — 您的电子邮箱(证书到期通知将发送至此)。
  2. Terms of Service … (Y)es/(N)o — 输入 Y。
  3. Share email with the EFF … (Y)es/(N)o — 由您自行决定。
之后 certbot 会自动签发证书、写入 <VirtualHost *:443>、配置 http→https 重定向并启用自动续期。最后会显示 Successfully enabled HTTPS。
如果签发失败,请检查 dig +short monitor.example.com 是否返回服务器的 IP,以及 80/443 端口是否已开放(sudo ufw allow 80,443/tcp)。

签发完成后:https://monitor.example.com 打开时会显示锁形图标,http:// 会重定向到 https://。

07. 登录与初始设置

打开 https://monitor.example.com,使用 admin / useradmin 登录并完成以下清单:

  1. 修改 admin 密码 — 菜单中的“用户”板块。
  2. 启用 WebAuthn(2FA) — “WebAuthn 密钥”→ 注册安全密钥/passkey(需要 HTTPS)。请一次注册两个:若唯一的密钥丢失,将无法用它登录。了解更多。
  3. 按 IP 限制访问 — “设置”→“按 IP 限制访问”(启用前请先填入您自己的 IP,否则会将自己拒之门外)。
  4. 输入许可证 — 将个人中心中的激活码 ARCIVEO-… 激活到您的域名,并将密钥填入“设置”→“许可证”。了解更多。
  5. 配置通知 — 在“设置”中配置 Telegram 和/或 Email。了解更多。
  6. 删除安装程序 public/start_db.php(如仍存在):它允许无需授权即可重建数据库。只要该文件仍位于面板根目录或 public/ 中,面板就会以红色横幅提示您。
  7. 手动运行首次检查 — 否则在当晚之前部分板块会是空的(见下方说明)。
为什么“Lynis 审计”和“Logwatch”一开始是空的。自动配置安装了工具并创建了 cron 任务,但没有运行检查本身——它们会按计划执行:Lynis 在 03:00,Logwatch 在 06:00,debsums 在 04:30,ClamAV 在 01:30。在此之前,这些板块会如实显示尚无报告。若不想等上一整天,可以手动运行一次:
# Lynis 审计——首份报告(需要几分钟): sudo /usr/local/bin/lynis-scan.sh # Logwatch 的当日报告: sudo /usr/local/bin/logwatch_daily.sh # 软件包完整性(debsums)——在大型服务器上耗时较长: sudo /usr/local/bin/debsums-scan.sh
Lynis 也可以直接从面板启动——“Lynis 审计”页面上的“开始审计”按钮:它会在后台执行同一个脚本并自动更新报告。之后一切都按计划进行,无需再手动运行。
首次杀毒扫描(sudo /usr/local/bin/clamav-scan.sh)会大量占用磁盘和 CPU,可能持续一小时以上——在生产服务器上最好等待 01:30 的夜间任务。“磁盘(SMART)”“性能”和“安全更新”板块会自行填充:分别为每 30 分钟、每 5 分钟和每小时一次。
完成。各工具的说明请见 FAQ。
如果需要在这台服务器上再放一个带自有域名的站点,请参见 FAQ:“在这台服务器上再建第二个站点(再加一个域名)”。