🤔 为什么有了GLPI还要部署OCS-NG?
核心问题:数据收集的风险
GLPI直接收集的问题:
- Agent直接向GLPI报告数据时,任何收集异常都会直接影响资产数据库
- 网络问题、Agent故障可能导致重复资产、错误数据、资产丢失
- 无法对收集的数据进行预处理和验证
OCS-NG作为中间层的价值:
传统方式:终端Agent → GLPI → 资产数据库 (有风险)
推荐方式:终端Agent → OCS-NG → 数据验证 → GLPI → 资产数据库 (安全)
实际场景举例
场景1:网络异常
- 没有OCS-NG:Agent因网络问题重复提交 → GLPI创建重复资产
- 有OCS-NG:Agent重复提交到OCS-NG → OCS-NG去重后同步到GLPI
场景2:Agent故障
- 没有OCS-NG:Agent报告错误硬件信息 → GLPI资产数据被污染
- 有OCS-NG:错误数据进入OCS-NG → 管理员发现异常 → 修正后同步到GLPI
场景3:批量部署
- 没有OCS-NG:1000台设备同时向GLPI报告 → GLPI压力过大
- 有OCS-NG:1000台设备向OCS-NG报告 → 分批同步到GLPI → 系统稳定
🚀 OCS-NG脚本部署
1. 环境准备
# 系统要求
- Debian 12 / Ubuntu 22.04
- 最小4GB内存,8GB推荐
- 50GB硬盘空间
# 网络规划
OCS-NG服务器:192.168.1.100
GLPI服务器: 192.168.1.101
2. 脚本部署步骤
第一步:下载并执行安装脚本
# 使用项目中提供的脚本
chmod +x install_ocs_inventory_debian12.sh
# 以root权限执行
sudo ./install_ocs_inventory_debian12.sh
第二步:安装过程中的关键选择
# 1. 环境清理(推荐选择Y)
是否执行完整清理?(y/N): y
# 2. 数据库配置
数据库名称 [ocsweb]: ocsweb
数据库用户名 [ocs]: ocs_user
数据库密码: [设置强密码]
# 3. 性能优化(推荐选择Y)
是否应用性能优化配置?(推荐) (Y/n): Y
# 4. 安全配置(推荐选择Y)
是否应用安全加固配置?(推荐) (Y/n): Y
第三步:验证安装
# 检查服务状态
systemctl status apache2
systemctl status mariadb
# 访问Web界面
浏览器打开:http://192.168.1.100/ocsreports
默认用户名:admin
默认密码:admin
📋 OCS-NG安装检查清单
✅ 安装前准备 (Pre-Installation Checklist)
步骤 1:环境准备
- 下载并运行
install_ocs_inventory_debian12.sh
- 确认脚本执行完成,显示 “环境准备完成!”
- 记录显示的 MySQL Root 密码
- 保存
OCS-NG安装路径配置清单.md
到本地
步骤 2:服务状态检查
# 检查服务状态
systemctl status apache2 # 应显示 active (running)
systemctl status mariadb # 应显示 active (running)
# 检查端口监听
netstat -tuln | grep :80 # Apache 端口
netstat -tuln | grep :3306 # MySQL 端口
- Apache 服务正常运行
- MariaDB 服务正常运行
- 端口 80 和 3306 正常监听
步骤 3:数据库连接测试
# 测试 OCS 数据库连接
mysql -u ocs -p'OcsPass123!' ocsweb -e "SELECT 1;"
- 数据库连接测试成功
🔧 OCS Server 安装 (Server Installation)
步骤 4:启动 Server 安装
cd /tmp/ocs_installation/OCSInventory-Server
./setup.sh
步骤 5:安装过程问答 (复制粘贴使用)
Apache 配置询问
问题 | 答案 |
---|---|
Where is Apache daemon binary? | /usr/sbin/apache2 |
Where is Apache main configuration file? | /etc/apache2/apache2.conf |
Where is Apache modules directory? | /usr/lib/apache2/modules |
What is Apache daemon running user? | www-data |
What is Apache daemon running group? | www-data |
Where is Apache Include configuration directory? | /etc/apache2/conf-available |
- Apache 路径配置完成
Perl 配置询问
问题 | 答案 |
---|---|
Where is Perl interpreter? | /usr/bin/perl |
Do you wish to continue installing OCS Inventory NG Server? | y |
Where to copy Communication server files? | /usr/share/ocsinventory-reports |
Where to copy Administration console files? | /usr/share/ocsinventory-reports |
Do you allow Setup to create these directories? | y |
- Perl 配置完成
数据库配置询问
问题 | 答案 |
---|---|
Database server address? | localhost |
Database server port? | 3306 |
Database name? | ocsweb |
Database user? | ocs |
Database user password? | OcsPass123! |
- 数据库配置完成
服务组件询问
问题 | 答案 |
---|---|
Do you wish to setup Communication server on this computer? | y |
Do you wish to setup Administration server on this computer? | y |
Do you wish to setup Rest API server on this computer? | y |
Do you wish to setup a new database server? | n |
Do you wish to update Communication server on this computer? | n |
- 服务组件配置完成
- Server 安装脚本执行完成
🌐 OCS Reports 安装 (Web Interface Installation)
步骤 6:复制 Reports 文件
cd /tmp/ocs_installation/OCSInventory-ocsreports
cp -r . /usr/share/ocsinventory-reports/
ln -sf /usr/share/ocsinventory-reports /var/www/html/ocsreports
- Reports 文件复制完成
- Apache 符号链接创建完成
步骤 7:重启服务
systemctl restart apache2
systemctl restart mariadb
- 服务重启完成
🔗 Web 界面配置 (Web Configuration)
步骤 8:访问 Web 安装界面
- 访问地址:
http://192.168.1.100/ocsreports/
- Web 界面可正常访问
步骤 9:数据库配置
在 Web 界面中填入以下信息:
配置项 | 值 |
---|---|
MySQL server | localhost |
MySQL user | ocs |
MySQL password | OcsPass123! |
Name of Database | ocsweb |
MySQL Port | 3306 |
- 数据库连接测试成功
- 数据库表结构创建完成
步骤 10:完成安装
- Web 安装向导完成
- 显示 “Installation is complete” 或类似成功信息
🔐 安装后安全配置 (Post-Installation Security)
步骤 11:删除安装文件
rm -f /usr/share/ocsinventory-reports/install.php
- install.php 文件已删除
步骤 12:登录测试
- 访问:
http://192.168.1.100/ocsreports/
- 用户名:
admin
- 密码:
admin
- 成功登录 OCS 管理界面
步骤 13:更改默认密码
- 进入用户管理
- 修改 admin 用户密码
- 默认密码已更改
✅ 安装验证 (Installation Verification)
步骤 14:功能验证
# 检查 Apache 配置
apache2ctl configtest
# 检查数据库表
mysql -u ocs -p'OcsPass123!' ocsweb -e "SHOW TABLES;"
# 检查 Web 服务
curl -I http://localhost/ocsreports/
# 检查日志
tail -f /var/log/apache2/ocs_error.log
- Apache 配置语法正确
- 数据库表创建成功
- Web 服务响应正常
- 无严重错误日志
🔄 备份和维护 (Backup & Maintenance)
步骤 15:验证自动备份
# 检查备份脚本
ls -la /usr/local/bin/ocs-backup.sh
# 检查定时任务
cat /etc/cron.d/ocs-backup
# 手动执行一次备份测试
/usr/local/bin/ocs-backup.sh
# 检查备份结果
ls -la /var/backups/ocs/
- 备份脚本存在且可执行
- 定时任务配置正确
- 手动备份测试成功
- 备份文件生成正常
📊 安装完成总结
✅ 系统状态概览
- Web 界面:http://192.168.1.100/ocsreports/ ✅
- 管理员登录:admin/[新密码] ✅
- 数据库:ocsweb ✅
- 自动备份:每日 2:00AM ✅
- 性能优化:已配置 ✅
- 安全加固:已应用 ✅
📁 重要文件位置
配置信息: /root/ocs_db_info.txt
MySQL 密码: /root/.my.cnf
备份脚本: /usr/local/bin/ocs-backup.sh
日志文件: /var/log/apache2/ocs_*.log
数据目录: /var/lib/ocsinventory-reports/
🎯 下一步建议
- 客户端部署:下载并部署 OCS Agent 到需要监控的计算机
- 网络发现:配置 IP 网段发现
- 定制化:根据需要配置标签、分组等
- 监控告警:配置日志监控和告警
- SSL 证书:配置正式的 SSL 证书
- 注意事项: Aget客户端提交数据服务端无法接收,是perl的处理结果写入数据的配置文件异常,请修改如下路径的数据库部分密码与数据库密码一致:
vim /etc/apache2/conf-available/z-ocsinventory-server.conf
vim /etc/apache2/conf-available/zz-ocsinventory-restapi.conf
- 客户端封装 : OcsNG Agent可以单独封装(将服务器参数等直接写入到客户端中,域控等可以直接部署),并且按特定的参数运行提交数据(如静默后台运行/通过域控管理员安装等),文章资源附件有封装工具和安装包及使用说明,欢迎下载使用,如有问题,随时加入Q群1097440406交流
🔗 GLPI连接OCS-NG配置
1. 在GLPI服务器上安装OCS-NG插件
# 下载并安装插件
cd /var/www/html/glpi/plugins/
wget https://github.com/pluginsGLPI/ocsinventoryng/releases/latest/download/ocsinventoryng.tar.gz
tar -xzf ocsinventoryng.tar.gz
chown -R www-data:www-data ocsinventoryng/
2. 配置数据库连接权限
在OCS-NG服务器上执行:
# 登录MySQL
mysql -u root -p
# 创建GLPI连接用户
CREATE USER 'ocs_glpi_user'@'192.168.1.101' IDENTIFIED BY 'secure_password_123';
CREATE USER 'ocs_glpi_user'@'192.168.1.%' IDENTIFIED BY 'secure_password_123';
# 授予权限
GRANT SELECT ON ocsweb.* TO 'ocs_glpi_user'@'192.168.1.101';
GRANT SELECT ON ocsweb.* TO 'ocs_glpi_user'@'192.168.1.%';
GRANT INSERT, UPDATE ON ocsweb.locks TO 'ocs_glpi_user'@'192.168.1.101';
GRANT INSERT, UPDATE ON ocsweb.locks TO 'ocs_glpi_user'@'192.168.1.%';
FLUSH PRIVILEGES;
# 配置远程访问
vim /etc/mysql/mariadb.conf.d/50-server.cnf
# 修改:bind-address = 0.0.0.0
# 重启MariaDB
systemctl restart mariadb
3. 在GLPI中配置OCS-NG连接
启用插件
GLPI → 设置 → 插件 → OCS Inventory NG → 安装 → 启用
配置连接
设置 → 插件 → OCS Inventory NG → 配置 添加OCSNG服务器: - 服务器名称:OCS-NG主服务器 - 数据库主机:192.168.1.100 - 数据库名:ocsweb - 数据库用户:ocs_glpi_user - 数据库密码:secure_password_123
测试连接
点击"测试连接"按钮,确保连接成功
4. 配置同步规则
工具 → OCS-NG → 导入规则
推荐设置:
- 自动导入新计算机:✓
- 自动同步现有计算机:✗ (建议手动)
- 自动删除过期计算机:✗ (建议手动)
- 同步间隔:每天
📊 数据同步管理
手动同步(推荐)
工具 → OCS-NG → 同步计算机
- 选择要同步的设备
- 点击"同步"按钮
- 确认同步结果
自动同步监控
# 创建监控脚本
cat > /usr/local/bin/check_ocs_sync.sh << 'EOF'
#!/bin/bash
# 检查OCS-NG到GLPI的同步状态
# 检查OCS-NG中的设备数量
OCS_COUNT=$(mysql -h 192.168.1.100 -u ocs_glpi_user -p'secure_password_123' ocsweb -se "SELECT COUNT(*) FROM hardware WHERE lastcome > DATE_SUB(NOW(), INTERVAL 7 DAY)")
# 检查GLPI中的设备数量
GLPI_COUNT=$(mysql -u glpi_user -p'glpi_password' glpi -se "SELECT COUNT(*) FROM glpi_computers WHERE is_deleted = 0")
echo "OCS-NG设备数量: $OCS_COUNT"
echo "GLPI设备数量: $GLPI_COUNT"
# 如果差异过大,发送告警
DIFF=$((OCS_COUNT - GLPI_COUNT))
if [ $DIFF -gt 10 ] || [ $DIFF -lt -10 ]; then
echo "警告:设备数量差异过大,请检查同步状态"
fi
EOF
chmod +x /usr/local/bin/check_ocs_sync.sh
# 设置定时检查
echo "0 8 * * * root /usr/local/bin/check_ocs_sync.sh" >> /etc/crontab
🛡️ 最佳实践
1. 数据保护策略
# 定期备份OCS-NG数据
mysqldump --single-transaction ocsweb > /var/backups/ocsweb_$(date +%Y%m%d).sql
# 监控同步状态
# 建议人工审核重要的同步操作
2. 同步建议
- 新设备:可以自动同步
- 设备更新:建议手动确认后同步
- 设备删除:必须人工审核
3. 故障处理
# 常见问题检查
# 1. 检查网络连接
ping 192.168.1.100
# 2. 检查数据库连接
mysql -h 192.168.1.100 -u ocs_glpi_user -p ocsweb
# 3. 检查服务状态
systemctl status apache2
systemctl status mariadb
# 4. 查看日志
tail -f /var/log/apache2/error.log
tail -f /var/log/mysql/error.log
💡 总结
为什么需要OCS-NG?
- 🛡️ 保护GLPI资产数据不被收集异常污染
- 🔄 提供可控的数据同步机制
- 📊 支持数据验证和清洗
- 🚀 提高系统整体稳定性
部署价值:
- 一次部署,长期受益
- 降低资产数据管理风险
- 提高数据质量和系统可靠性
使用OCS-NG作为中间层,您可以安心收集资产数据,不用担心异常情况影响GLPI的生产数据。
#!/bin/bash
# OCS Inventory NG 环境准备脚本
# 适用于 Debian 12 最小安装
# 自动安装所有依赖环境,下载 OCS-NG 安装包
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_step() {
echo -e "${BLUE}[STEP]${NC} $1"
}
# 检查是否以root权限运行
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "此脚本必须以root权限运行"
exit 1
fi
}
# 检查Debian版本
check_debian_version() {
log_step "检查Debian版本..."
if ! grep -q "ID=debian" /etc/os-release; then
log_error "此脚本仅支持Debian系统"
exit 1
fi
VERSION_ID=$(grep -o 'VERSION_ID="[0-9]*"' /etc/os-release | cut -d'"' -f2)
if [[ "$VERSION_ID" != "12" ]]; then
log_warning "检测到Debian $VERSION_ID,脚本针对Debian 12优化"
else
log_info "检测到Debian 12,版本匹配"
fi
}
# 配置中国软件源
configure_china_mirrors() {
log_step "配置中国软件源..."
# 备份原始sources.list
if [[ ! -f /etc/apt/sources.list.bak ]]; then
cp /etc/apt/sources.list /etc/apt/sources.list.bak
log_info "已备份原始sources.list"
fi
# 配置清华大学镜像源
cat > /etc/apt/sources.list << 'EOF'
# 清华大学镜像源
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
EOF
log_info "已配置清华大学镜像源"
}
# 完整环境清理
perform_complete_cleanup() {
log_step "执行完整环境清理..."
# 停止所有相关服务
log_info "停止相关服务..."
local services=("apache2" "apache-htcacheclean" "mariadb" "mysql" "httpd")
for service in "${services[@]}"; do
if systemctl is-active --quiet "$service" 2>/dev/null; then
log_info "停止服务: $service"
systemctl stop "$service" 2>/dev/null || true
systemctl disable "$service" 2>/dev/null || true
fi
done
# 卸载所有相关软件包
log_info "卸载相关软件包..."
apt remove --purge -y \
ocsinventory-* \
apache2* \
mariadb-* mysql-* \
php* \
libapache2-mod-* \
perl-* libperl* \
2>/dev/null || true
# 清理配置目录
log_info "清理配置和数据目录..."
local dirs_to_remove=(
"/etc/apache2"
"/etc/mysql"
"/etc/mariadb"
"/var/lib/mysql"
"/var/lib/mariadb"
"/var/log/mysql"
"/var/log/mariadb"
"/var/log/apache2"
"/etc/php"
"/var/lib/php"
"/usr/share/ocsinventory-reports"
"/var/lib/ocsinventory-reports"
"/etc/ocsinventory-server"
"/var/www/html"
"/tmp/ocs_*"
)
for dir in "${dirs_to_remove[@]}"; do
if [[ -d "$dir" ]]; then
log_info "删除目录: $dir"
rm -rf "$dir" 2>/dev/null || true
fi
done
# 最终清理
apt autoremove -y 2>/dev/null || true
apt autoclean 2>/dev/null || true
systemctl daemon-reload 2>/dev/null || true
log_info "环境清理完成"
}
# 更新系统
update_system() {
log_step "更新系统..."
apt update
apt upgrade -y
log_info "系统更新完成"
}
# 安装基础工具
install_basic_tools() {
log_step "安装基础工具..."
apt install -y \
wget \
curl \
gnupg \
lsb-release \
ca-certificates \
apt-transport-https \
software-properties-common \
unzip \
git \
openssl \
tar \
build-essential \
cpanminus \
composer
log_info "基础工具安装完成"
}
# 安装MariaDB
install_mariadb() {
log_step "安装MariaDB数据库..."
# 预配置MariaDB(避免交互式提示)
echo "mariadb-server mysql-server/root_password password " | debconf-set-selections
echo "mariadb-server mysql-server/root_password_again password " | debconf-set-selections
# 安装MariaDB
apt install -y mariadb-server mariadb-client
# 启动服务
systemctl start mariadb
systemctl enable mariadb
# 生成随机密码并配置
MYSQL_ROOT_PASSWORD=$(openssl rand -base64 32)
# 安全配置
mysql -e "UPDATE mysql.user SET authentication_string = PASSWORD('$MYSQL_ROOT_PASSWORD') WHERE User = 'root';" 2>/dev/null || true
mysql -e "UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE User = 'root';" 2>/dev/null || true
mysql -e "DELETE FROM mysql.user WHERE User='';"
mysql -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
mysql -e "DROP DATABASE IF EXISTS test;"
mysql -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';"
mysql -e "FLUSH PRIVILEGES;"
# 保存密码
cat > /root/.my.cnf << EOF
[client]
user = root
password = $MYSQL_ROOT_PASSWORD
EOF
chmod 600 /root/.my.cnf
# 将密码存储为全局变量供后续使用
export MYSQL_ROOT_PASSWORD
log_info "MariaDB安装完成,密码已保存到 /root/.my.cnf"
log_info "MySQL Root密码: $MYSQL_ROOT_PASSWORD"
}
# 安装Apache
install_apache() {
log_step "安装Apache Web服务器..."
# 安装Apache和模块
apt install -y \
apache2 \
apache2-utils \
apache2-dev \
libapache2-mod-perl2 \
libapache2-mod-php
# 启用必要模块
a2enmod rewrite
a2enmod ssl
a2enmod perl
a2enmod php8.2
# 启动服务
systemctl start apache2
systemctl enable apache2
# 创建基本Web目录
mkdir -p /var/www/html
chown -R www-data:www-data /var/www/html
log_info "Apache安装完成"
}
# 安装PHP
install_php() {
log_step "安装PHP及扩展..."
apt install -y \
php \
php-cli \
php-common \
php-mysql \
php-gd \
php-zip \
php-xml \
php-mbstring \
php-curl \
php-soap \
php-ldap \
php-imap \
php-snmp \
php-intl \
php-json \
php-opcache
# 配置PHP
local php_ini="/etc/php/8.2/apache2/php.ini"
if [[ -f "$php_ini" ]]; then
# 备份原配置
cp "$php_ini" "$php_ini.bak"
# 应用OCS优化配置
sed -i 's/memory_limit = .*/memory_limit = 512M/' "$php_ini"
sed -i 's/max_execution_time = .*/max_execution_time = 300/' "$php_ini"
sed -i 's/upload_max_filesize = .*/upload_max_filesize = 300M/' "$php_ini"
sed -i 's/post_max_size = .*/post_max_size = 300M/' "$php_ini"
sed -i 's/;date.timezone =.*/date.timezone = Asia\/Shanghai/' "$php_ini"
fi
log_info "PHP安装完成"
}
# 安装Perl模块
install_perl_modules() {
log_step "安装Perl及模块..."
# 安装Perl基础包
apt install -y \
perl \
perl-base \
perl-modules-5.36 \
libperl-dev
# 安装OCS必需的Perl模块
apt install -y \
libxml-simple-perl \
libdbi-perl \
libdbd-mysql-perl \
libapache-dbi-perl \
libnet-ip-perl \
libsoap-lite-perl \
libarchive-zip-perl \
libio-compress-perl \
libmojolicious-perl \
libplack-perl \
libswitch-perl \
libxml-entities-perl \
libipc-run-perl \
libproc-daemon-perl \
libproc-pid-file-perl \
libuniversal-require-perl
# 使用cpan安装部分模块
log_info "安装额外的Perl模块..."
cpan -i Apache::DBI XML::Entities 2>/dev/null || true
log_info "Perl模块安装完成"
}
# 配置数据库
setup_database() {
log_step "配置数据库..."
# 创建OCS数据库和用户
local db_name="ocsweb"
local db_user="ocs"
local db_password="OcsPass123!"
mysql << EOF
CREATE DATABASE IF NOT EXISTS $db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '$db_user'@'localhost' IDENTIFIED BY '$db_password';
GRANT ALL PRIVILEGES ON $db_name.* TO '$db_user'@'localhost';
FLUSH PRIVILEGES;
EOF
# 保存数据库信息
cat > /root/ocs_db_info.txt << EOF
=== OCS Inventory 数据库信息 ===
数据库名: $db_name
用户名: $db_user
密码: $db_password
主机: localhost
端口: 3306
创建时间: $(date)
=== MySQL Root 密码 ===
MySQL Root密码: ${MYSQL_ROOT_PASSWORD:-请查看 /root/.my.cnf}
配置文件: /root/.my.cnf
=== 远程访问配置 ===
GLPI服务器可使用以下信息远程连接:
- 主机: OCS服务器IP地址
- 端口: 3306
- 数据库: $db_name
- 用户名: ocs (仅限SELECT权限)
- 密码: $db_password
EOF
chmod 600 /root/ocs_db_info.txt
log_info "数据库配置完成"
log_info "OCS数据库密码: $db_password"
}
# 下载OCS-NG安装包并安装Composer依赖
download_ocs_packages() {
log_step "下载OCS Inventory NG安装包..."
# 创建下载目录
local download_dir="/tmp/ocs_installation"
mkdir -p "$download_dir"
cd "$download_dir"
log_info "正在下载OCS Inventory NG最新版本..."
# 下载OCS Server组件
log_info "下载OCS Server组件..."
if ! git clone --depth 1 https://github.com/OCSInventory-NG/OCSInventory-Server.git; then
log_error "下载OCS Server失败,请检查网络连接"
exit 1
fi
# 下载OCS Reports组件
log_info "下载OCS Reports组件..."
if ! git clone --depth 1 https://github.com/OCSInventory-NG/OCSInventory-ocsreports.git; then
log_error "下载OCS Reports失败,请检查网络连接"
exit 1
fi
# 下载OCS Agent(可选)
log_info "下载OCS Agent组件..."
git clone --depth 1 https://github.com/OCSInventory-NG/UnixAgent.git 2>/dev/null || log_warning "OCS Agent下载失败(可选组件)"
# 安装OCS Reports的Composer依赖
log_step "安装OCS Reports的Composer依赖..."
if [[ -d "OCSInventory-ocsreports" ]]; then
cd OCSInventory-ocsreports
# 检查composer.json文件是否存在
if [[ -f "composer.json" ]]; then
log_info "发现composer.json,正在安装PHP依赖..."
# 使用--no-dev避免安装开发依赖,--optimize-autoloader优化自动加载
if composer install --no-dev --optimize-autoloader --no-interaction; then
log_info "✓ Composer依赖安装成功"
else
log_warning "✗ Composer依赖安装失败,可能需要手动安装"
fi
else
log_info "未找到composer.json文件,跳过Composer依赖安装"
fi
cd "$download_dir"
fi
# 设置正确的权限
chown -R root:root "$download_dir"
chmod -R 755 "$download_dir"
log_info "OCS Inventory NG安装包下载完成"
echo "下载位置: $download_dir"
}
# 创建安装指导文档
create_installation_guide() {
log_step "创建安装指导文档..."
cat > /root/ocs_installation_guide.txt << 'EOF'
=== OCS Inventory NG 手动安装指导 ===
📁 安装文件位置:/tmp/ocs_installation/
🔧 安装步骤:
1. 安装OCS Server组件:
cd /tmp/ocs_installation/OCSInventory-Server
./setup.sh
2. 安装OCS Reports组件:
cd /tmp/ocs_installation/OCSInventory-ocsreports
# 复制文件到Web目录
cp -r . /usr/share/ocsinventory-reports/
# 注意:必要目录和权限已自动配置
# 注意:Composer依赖已自动安装
# 创建Apache配置符号链接
ln -sf /usr/share/ocsinventory-reports /var/www/html/ocsreports
3. 配置Apache虚拟主机(可选):
# 已在环境准备中自动配置
4. 访问Web界面完成配置:
http://your-server-ip/ocsreports/
使用以下数据库信息:
- 数据库: ocsweb
- 用户名: ocs
- 密码: OcsPass123!
- 主机: localhost
5. 默认登录信息:
- 用户名: admin
- 密码: admin
✅ 自动完成的配置:
- Composer依赖已自动安装
- 目录权限已自动设置
- MariaDB性能优化已配置
- Apache性能优化已启用
- PHP OPCache已优化
- 自动备份脚本已创建 (/usr/local/bin/ocs-backup.sh)
- 定时备份任务已配置 (每日2:00AM)
- 日志轮转已配置
⚠️ 重要提示:
- 安装完成后请立即更改admin密码
- 删除install.php文件确保安全
- 配置防火墙允许80和443端口
- 数据库已配置远程访问 (bind-address = 0.0.0.0)
📄 相关文件:
- 数据库信息: /root/ocs_db_info.txt
- MySQL配置: /root/.my.cnf
- 备份脚本: /usr/local/bin/ocs-backup.sh
- 性能配置: /etc/mysql/mariadb.conf.d/99-ocs-optimization.cnf
EOF
log_info "安装指导文档创建完成: /root/ocs_installation_guide.txt"
}
# 配置Apache基础设置
configure_apache_basics() {
log_step "配置Apache基础设置..."
# 创建基础配置
cat > /etc/apache2/sites-available/ocs.conf << 'EOF'
<VirtualHost *:80>
ServerAdmin admin@localhost
DocumentRoot /var/www/html
# OCS Reports别名
Alias /ocsreports /usr/share/ocsinventory-reports
<Directory "/usr/share/ocsinventory-reports">
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 日志配置
ErrorLog ${APACHE_LOG_DIR}/ocs_error.log
CustomLog ${APACHE_LOG_DIR}/ocs_access.log combined
</VirtualHost>
EOF
# 启用站点
a2ensite ocs
a2dissite 000-default
# 重启Apache
systemctl restart apache2
log_info "Apache基础配置完成"
}
# 自动权限配置和优化设置
configure_automatic_optimizations() {
log_step "配置自动权限和优化设置..."
# 1. 创建OCS必要目录并设置权限
log_info "创建OCS目录结构和权限..."
# 创建主要目录
mkdir -p /usr/share/ocsinventory-reports
mkdir -p /var/lib/ocsinventory-reports/{download,ipd,snmp,scripts,logs}
mkdir -p /var/log/ocsinventory-server
mkdir -p /etc/ocsinventory
# 设置正确的所有者和权限
chown -R www-data:www-data /usr/share/ocsinventory-reports
chown -R www-data:www-data /var/lib/ocsinventory-reports
chown -R www-data:www-data /var/log/ocsinventory-server
chown -R root:www-data /etc/ocsinventory
chmod -R 755 /usr/share/ocsinventory-reports
chmod -R 750 /var/lib/ocsinventory-reports
chmod -R 755 /var/log/ocsinventory-server
chmod -R 750 /etc/ocsinventory
# 2. 配置MariaDB性能优化
log_info "配置MariaDB性能优化..."
cat > /etc/mysql/mariadb.conf.d/99-ocs-optimization.cnf << 'EOF'
# OCS Inventory NG MariaDB Optimization
[mysqld]
# 基础设置
default_storage_engine = InnoDB
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci
# 连接设置
max_connections = 200
max_user_connections = 190
thread_cache_size = 8
table_open_cache = 2048
# InnoDB设置
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table = 1
# 临时表
tmp_table_size = 64M
max_heap_table_size = 64M
# 日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2
# 安全
local_infile = 0
bind-address = 0.0.0.0
EOF
# 3. 配置Apache性能优化
log_info "配置Apache性能优化..."
cat > /etc/apache2/conf-available/ocs-performance.conf << 'EOF'
# OCS Inventory NG Performance Optimization
# 启用压缩
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
AddOutputFilterByType DEFLATE application/xml application/xhtml+xml application/rss+xml
AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>
# 浏览器缓存
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType text/html "access plus 1 hour"
</IfModule>
# 安全头部
<IfModule mod_headers.c>
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options SAMEORIGIN
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>
# 隐藏Apache版本
ServerTokens Prod
ServerSignature Off
EOF
# 启用Apache模块和配置
a2enmod expires
a2enmod headers
a2enmod deflate
a2enconf ocs-performance
# 4. 配置PHP性能优化
log_info "应用PHP额外优化配置..."
local php_ini="/etc/php/8.2/apache2/php.ini"
if [[ -f "$php_ini" ]]; then
# 添加额外的PHP优化配置
cat >> "$php_ini" << 'EOF'
; OCS Inventory NG 额外优化配置
; 会话设置
session.gc_maxlifetime = 3600
session.cookie_lifetime = 0
; 安全设置
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
; 性能设置
realpath_cache_size = 4096K
realpath_cache_ttl = 600
; OPCache设置
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 2
opcache.validate_timestamps = 1
EOF
fi
# 5. 创建自动备份脚本
log_info "创建自动备份脚本..."
cat > /usr/local/bin/ocs-backup.sh << 'EOF'
#!/bin/bash
# OCS Inventory NG 自动备份脚本
BACKUP_DIR="/var/backups/ocs"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="ocsweb"
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 数据库备份
echo "开始数据库备份..."
mysqldump --single-transaction --routines --triggers "$DB_NAME" | gzip > "$BACKUP_DIR/ocs_db_$DATE.sql.gz"
# 配置文件备份
echo "开始配置文件备份..."
tar -czf "$BACKUP_DIR/ocs_config_$DATE.tar.gz" \
/etc/apache2 \
/etc/mysql \
/usr/share/ocsinventory-reports \
/var/lib/ocsinventory-reports \
2>/dev/null
# 保留最近7天的备份
find "$BACKUP_DIR" -name "ocs_*" -mtime +7 -delete
echo "备份完成: $DATE"
EOF
chmod +x /usr/local/bin/ocs-backup.sh
# 6. 创建cron定时任务
log_info "配置定时备份任务..."
cat > /etc/cron.d/ocs-backup << 'EOF'
# OCS Inventory NG 每日备份
0 2 * * * root /usr/local/bin/ocs-backup.sh >> /var/log/ocs-backup.log 2>&1
EOF
# 7. 配置logrotate
log_info "配置日志轮转..."
cat > /etc/logrotate.d/ocs-inventory << 'EOF'
/var/log/apache2/ocs_*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 644 www-data adm
postrotate
systemctl reload apache2 > /dev/null 2>&1 || true
endscript
}
/var/log/ocsinventory-server/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 www-data adm
}
EOF
log_info "自动权限和优化配置完成"
}
# 重启服务
restart_services() {
log_step "重启相关服务应用所有配置..."
# 重启MariaDB加载新配置
log_info "重启MariaDB服务..."
if systemctl restart mariadb; then
log_info "✓ MariaDB服务重启成功"
else
log_error "✗ MariaDB服务重启失败"
fi
# 重启Apache加载新配置和模块
log_info "重启Apache服务..."
if systemctl restart apache2; then
log_info "✓ Apache服务重启成功"
else
log_error "✗ Apache服务重启失败"
fi
# 等待服务完全启动
sleep 3
log_info "服务重启完成,所有配置已生效"
}
# 最终检查
final_check() {
log_step "执行最终检查..."
# 检查服务状态
local services=("mariadb" "apache2")
for service in "${services[@]}"; do
if systemctl is-active --quiet "$service"; then
log_info "✓ $service 服务运行正常"
else
log_error "✗ $service 服务异常"
fi
done
# 检查端口监听
if netstat -tuln | grep -q ":80 "; then
log_info "✓ Apache监听端口80正常"
else
log_warning "✗ Apache端口80未监听"
fi
if netstat -tuln | grep -q ":3306 "; then
log_info "✓ MariaDB监听端口3306正常"
else
log_warning "✗ MariaDB端口3306未监听"
fi
# 检查PHP
if php -v >/dev/null 2>&1; then
log_info "✓ PHP安装正常"
else
log_error "✗ PHP安装异常"
fi
# 检查Perl
if perl -v >/dev/null 2>&1; then
log_info "✓ Perl安装正常"
else
log_error "✗ Perl安装异常"
fi
log_info "最终检查完成"
}
# 显示完成信息
show_completion_info() {
local server_ip=$(hostname -I | awk '{print $1}')
echo
echo "========================================"
echo "🎉 OCS Inventory NG 环境准备完成!"
echo "========================================"
echo
echo "📋 环境信息:"
echo " - ✅ MariaDB 10.x 已安装并配置"
echo " - ✅ Apache 2.4 已安装并配置"
echo " - ✅ PHP 8.2 及扩展已安装"
echo " - ✅ Perl 及必要模块已安装"
echo " - ✅ OCS数据库已创建"
echo
echo "📦 安装文件已准备:"
echo " - OCS Server: /tmp/ocs_installation/OCSInventory-Server/"
echo " - OCS Reports: /tmp/ocs_installation/OCSInventory-ocsreports/"
echo " - ✅ Composer依赖已自动安装"
echo
echo "🔐 重要信息:"
echo " - MySQL root密码: ${MYSQL_ROOT_PASSWORD:-查看 /root/.my.cnf}"
echo " - OCS数据库信息: 查看 /root/ocs_db_info.txt"
echo " - 安装指导: 查看 /root/ocs_installation_guide.txt"
echo
echo "🚀 下一步操作:"
echo " 1. 阅读安装指导: cat /root/ocs_installation_guide.txt"
echo " 2. 进入Server目录: cd /tmp/ocs_installation/OCSInventory-Server"
echo " 3. 运行安装脚本: ./setup.sh"
echo " 4. 按照指导完成Reports组件安装"
echo " 5. 访问 http://$server_ip/ocsreports 完成Web配置"
echo
echo "⚡ 自动优化配置:"
echo " - ✅ MariaDB性能优化已配置"
echo " - ✅ Apache性能优化已启用"
echo " - ✅ PHP OPCache已优化"
echo " - ✅ 目录权限已自动设置"
echo " - ✅ 自动备份脚本已创建 (/usr/local/bin/ocs-backup.sh)"
echo " - ✅ 定时备份任务已配置 (每日2:00AM)"
echo " - ✅ 日志轮转已配置"
echo
echo "📁 重要目录:"
echo " - OCS主目录: /usr/share/ocsinventory-reports"
echo " - 数据目录: /var/lib/ocsinventory-reports"
echo " - 日志目录: /var/log/ocsinventory-server"
echo " - 备份目录: /var/backups/ocs"
echo
echo "⚠️ 安全提醒:"
echo " - 请立即更改默认admin密码"
echo " - 安装完成后删除install.php文件"
echo " - 配置防火墙和SSL证书"
echo " - 数据库已配置远程访问 (bind-address = 0.0.0.0)"
echo
echo "========================================="
}
# 主函数
main() {
echo "========================================"
echo "🔧 OCS Inventory NG 环境准备脚本"
echo "适用于 Debian 12"
echo "========================================"
echo
check_root
check_debian_version
# 询问是否继续
echo "此脚本将:"
echo "1. 清理现有Web/数据库环境"
echo "2. 安装MariaDB、Apache、PHP、Perl"
echo "3. 配置OCS数据库"
echo "4. 下载OCS-NG安装包"
echo "5. 提供详细的安装指导"
echo
read -p "是否继续?(y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_info "安装已取消"
exit 0
fi
# 执行安装步骤
configure_china_mirrors
update_system
# 询问是否清理环境
echo
log_warning "检测到可能存在的旧环境,是否执行完整清理?"
read -p "清理环境?(推荐) (Y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
perform_complete_cleanup
fi
install_basic_tools
install_mariadb
install_apache
install_php
install_perl_modules
setup_database
configure_apache_basics
configure_automatic_optimizations
download_ocs_packages
create_installation_guide
restart_services
final_check
show_completion_info
echo
log_info "环境准备完成!请按照指导文档完成OCS-NG安装。"
}
# 错误处理
trap 'log_error "脚本在第$LINENO行执行失败"' ERR
# 脚本入口
main "$@"