OcsNG基于debian一键部署脚本

发布于:2025-07-14 ⋅ 阅读:(16) ⋅ 点赞:(0)

🤔 为什么有了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/
🎯 下一步建议
  1. 客户端部署:下载并部署 OCS Agent 到需要监控的计算机
  2. 网络发现:配置 IP 网段发现
  3. 定制化:根据需要配置标签、分组等
  4. 监控告警:配置日志监控和告警
  5. SSL 证书:配置正式的 SSL 证书
  6. 注意事项: Aget客户端提交数据服务端无法接收,是perl的处理结果写入数据的配置文件异常,请修改如下路径的数据库部分密码与数据库密码一致:
vim /etc/apache2/conf-available/z-ocsinventory-server.conf
vim /etc/apache2/conf-available/zz-ocsinventory-restapi.conf
  1. 客户端封装 : 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连接

  1. 启用插件

    GLPI → 设置 → 插件 → OCS Inventory NG → 安装 → 启用
    
  2. 配置连接

    设置 → 插件 → OCS Inventory NG → 配置
    
    添加OCSNG服务器:
    - 服务器名称:OCS-NG主服务器
    - 数据库主机:192.168.1.100
    - 数据库名:ocsweb
    - 数据库用户:ocs_glpi_user
    - 数据库密码:secure_password_123
    
  3. 测试连接

    点击"测试连接"按钮,确保连接成功
    

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 "$@" 

网站公告

今日签到

点亮在社区的每一天
去签到