| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171 |
- #!/bin/bash
- # NetBox 一键安装脚本
- # 适用于 CentOS 9 Stream
- # 作者:Claude
- # 版本:1.0.1
- # 严格模式
- set -euo pipefail
- IFS=$'\n\t'
- # 定义变量
- BASE_DIR="/home"
- NETBOX_DIR="$BASE_DIR/netbox"
- VENV_DIR="$BASE_DIR/venv"
- NETBOX_CONFIG_DIR="$NETBOX_DIR/netbox/netbox"
- LOG_FILE="$BASE_DIR/netbox_install.log"
- DB_NAME="netbox"
- DB_USER="netbox"
- DB_PASS="your_secure_password"
- # 配置日志
- exec 1> >(tee -a "$LOG_FILE") 2>&1
- echo "开始安装 NetBox - $(date)"
- # 错误处理
- error_handler() {
- local line_no=$1
- echo "错误发生在第 ${line_no} 行"
- exit 1
- }
- trap 'error_handler ${LINENO}' ERR
- # 清理函数
- cleanup_services() {
- echo "清理现有服务和数据..."
-
- echo "停止服务..."
- sudo systemctl stop netbox nginx redis postgresql || true
-
- echo "清理运行时目录..."
- sudo rm -rf /var/run/netbox/* || true
-
- echo "清理 PostgreSQL 数据..."
- if [ -d "/var/lib/pgsql/data" ]; then
- sudo -u postgres dropdb netbox || true
- sudo -u postgres dropuser netbox || true
- fi
-
- echo "清理 NetBox 目录..."
- sudo rm -rf "$NETBOX_DIR" || true
-
- echo "清理 Python 虚拟环境..."
- sudo rm -rf "$VENV_DIR" || true
-
- echo "清理日志文件..."
- sudo rm -f /var/log/netbox*.log || true
-
- echo "清理 Redis 数据"
- sudo systemctl stop redis
- sudo rm -rf /var/lib/redis/* || true
-
- echo "清理 nginx 配置"
- sudo rm -f /etc/nginx/conf.d/netbox.conf || true
-
- echo "清理系统服务配置"
- sudo rm -f /etc/systemd/system/netbox.service || true
-
- echo "重新加载系统服务"
- sudo systemctl daemon-reload
-
- echo "清理完成"
- }
- # 检查依赖
- check_dependencies() {
- echo "检查并安装系统依赖..."
-
- # 添加必要的仓库
- sudo dnf install -y epel-release
- sudo dnf config-manager --set-enabled crb
-
- # 更新系统
- sudo dnf update -y
-
- # 安装开发工具组
- sudo dnf groupinstall -y "Development Tools"
-
- # 安装 SELinux 相关依赖
- echo "安装 SELinux 依赖..."
- sudo dnf install -y \
- policycoreutils-python-utils \
- python3-policycoreutils \
- python3-libselinux \
- python3-libsemanage \
- python3-setools \
- setroubleshoot-server \
- setools-console
-
- # 安装其他必要依赖
- echo "安装其他系统依赖..."
- sudo dnf install -y \
- python3.12 \
- python3.12-pip \
- python3.12-devel \
- postgresql-server \
- postgresql-contrib \
- postgresql-devel \
- nginx \
- redis \
- git \
- gcc \
- libpq-devel \
- libffi-devel \
- openssl-devel \
- libxml2-devel \
- libxslt-devel \
- libjpeg-devel \
- zlib-devel
-
- # 修改 Python 3.12 设置部分
- if [ -f "/usr/bin/python3.12" ]; then
- sudo alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 1
- sudo alternatives --set python3 /usr/bin/python3.12 || {
- echo "警告:无法设置 Python 3.12 为默认版本,但将继续安装..."
- }
- else
- echo "警告:未找到 Python 3.12,将使用系统默认的 Python 版本..."
- fi
-
- echo "系统依赖安装完成"
- }
- # 配置 PostgreSQL
- setup_database() {
- echo "配置 PostgreSQL 数据库..."
-
- # 确保 PostgreSQL 数据目录存在
- if [ ! -d "/var/lib/pgsql/data" ]; then
- sudo mkdir -p /var/lib/pgsql/data
- sudo chown postgres:postgres /var/lib/pgsql/data
- fi
-
- # 确 PostgreSQL 已初始化
- if [ ! -f /var/lib/pgsql/data/PG_VERSION ]; then
- echo "初始化 PostgreSQL 数据库..."
- # 使用 -E UTF8 显式指定编码,并使用 postgres 用户执行命令
- sudo -u postgres /usr/bin/postgresql-setup --initdb
-
- # 等待初始化完成
- sleep 5
- fi
-
- # 确保 PostgreSQL 服务已启动
- if ! systemctl is-active --quiet postgresql; then
- echo "启动 PostgreSQL 服务..."
- sudo systemctl start postgresql
- # 予服务足够的启动时间
- sleep 10
- fi
-
- # 验证 PostgreSQL 是否正在运行
- if ! pg_isready -q; then
- echo "错误:PostgreSQL 服务未能正确启动"
- sudo systemctl status postgresql
- exit 1
- fi
-
- # 修改 PostgreSQL 认证配置
- echo "配置 PostgreSQL 认证方式..."
- sudo cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.bak
-
- # 使用更安全的方式修改 pg_hba.conf
- sudo tee /var/lib/pgsql/data/pg_hba.conf > /dev/null <<EOF
- # TYPE DATABASE USER ADDRESS METHOD
- local all postgres trust
- local all all trust
- host all all 127.0.0.1/32 trust
- host all all ::1/128 trust
- EOF
- # 重启 PostgreSQL 服务以应用新配置
- sudo systemctl restart postgresql
-
- # 等待服务完全启动
- echo "等待 PostgreSQL 重新启动..."
- sleep 10
-
- # 再次验证服务状态
- if ! pg_isready -q; then
- echo "错误:PostgreSQL 服务重启后未能正确运行"
- sudo systemctl status postgresql
- exit 1
- fi
-
- # 设置 postgres 用户密码 (使用 trust 认证,无需密码)
- echo "设置 postgres 用户密码..."
- sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'postgres';"
-
- # 创建数据库和用户
- echo "创建数据库和用户..."
- sudo -u postgres psql <<EOF
- DROP DATABASE IF EXISTS $DB_NAME;
- DROP USER IF EXISTS $DB_USER;
- CREATE DATABASE $DB_NAME;
- CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';
- ALTER ROLE $DB_USER SET client_encoding TO 'utf8';
- ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';
- ALTER ROLE $DB_USER SET timezone TO 'UTC';
- GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
- \c $DB_NAME
- GRANT ALL ON SCHEMA public TO $DB_USER;
- EOF
-
- # 修改回 md5 认证
- sudo sed -i 's/trust/md5/g' /var/lib/pgsql/data/pg_hba.conf
-
- # 重启 PostgreSQL 使新配置生效
- sudo systemctl restart postgresql
-
- echo "数据库配置完成"
- }
- # 安装 NetBox
- install_netbox() {
- echo "安装 NetBox..."
-
- # 确保基础目录存在
- sudo mkdir -p "$BASE_DIR"
-
- # 克隆最新的 NetBox 代码
- if [ ! -d "$NETBOX_DIR" ]; then
- git clone https://github.com/netbox-community/netbox.git "$NETBOX_DIR"
- fi
-
- # 确保配置目录存在
- sudo mkdir -p "$NETBOX_CONFIG_DIR"
-
- # 创建并激活虚拟环境
- python3.12 -m venv "$VENV_DIR"
- source "$VENV_DIR/bin/activate"
-
- # 升级包管理工具
- pip install --upgrade pip wheel setuptools
- # 安装 gunicorn
- pip install gunicorn
-
- # 安装 NetBox 依赖
- cd "$NETBOX_DIR"
- pip install -r requirements.txt
- # 设置目录权限
- sudo chown -R netbox:netbox "$NETBOX_DIR"
- sudo chown -R netbox:netbox "$VENV_DIR"
- sudo chmod -R 755 "$NETBOX_DIR"
- sudo chmod -R 755 "$VENV_DIR"
-
- # 确保 gunicorn 可执行
- sudo chmod +x "$VENV_DIR/bin/gunicorn"
- sudo chmod +x "$VENV_DIR/bin/python"
- }
- # 配置 NetBox
- configure_netbox() {
- echo "配置 NetBox..."
-
- # 配置文件路径
- CONFIG_FILE="$NETBOX_CONFIG_DIR/configuration.py"
- EXAMPLE_CONFIG="$NETBOX_CONFIG_DIR/configuration.example.py"
-
- # 确保配置目录存在
- sudo mkdir -p "$NETBOX_CONFIG_DIR"
-
- # 如果找不到示例配置文件,尝试其他位置
- if [ ! -f "$EXAMPLE_CONFIG" ]; then
- ALTERNATE_PATHS=(
- "$NETBOX_DIR/netbox/configuration.example.py"
- "$NETBOX_DIR/configuration.example.py"
- "$NETBOX_CONFIG_DIR/configuration.example.py"
- )
-
- for path in "${ALTERNATE_PATHS[@]}"; do
- if [ -f "$path" ]; then
- EXAMPLE_CONFIG="$path"
- echo "找到示例配置文件:$EXAMPLE_CONFIG"
- break
- fi
- done
- fi
-
- if [ ! -f "$CONFIG_FILE" ]; then
- echo "正在创建配置文件..."
- # 直接创建配置文件,而不是复制示例文件
- sudo tee "$CONFIG_FILE" > /dev/null <<EOF
- import os
- import platform
- # 生成随机密钥
- SECRET_KEY = '$(python3 -c "import secrets; print(secrets.token_urlsafe(50))")'
- # 数据库配置
- DATABASE = {
- 'NAME': '$DB_NAME',
- 'USER': '$DB_USER',
- 'PASSWORD': '$DB_PASS',
- 'HOST': 'localhost',
- 'PORT': '5432',
- 'CONN_MAX_AGE': 300,
- }
- # Redis 配置
- REDIS = {
- 'tasks': {
- 'HOST': 'localhost',
- 'PORT': 6379,
- 'PASSWORD': '',
- 'DATABASE': 0,
- 'SSL': False,
- },
- 'caching': {
- 'HOST': 'localhost',
- 'PORT': 6379,
- 'PASSWORD': '',
- 'DATABASE': 1,
- 'SSL': False,
- }
- }
- # 允许所有主机访问
- ALLOWED_HOSTS = ['*']
- # 设置时区
- TIME_ZONE = 'Asia/Shanghai'
- EOF
- fi
-
- # 设置配置文件权限
- sudo chown -R netbox:netbox "$NETBOX_CONFIG_DIR"
- sudo chmod -R 755 "$NETBOX_CONFIG_DIR"
-
- # 激活虚拟环境
- source "$VENV_DIR/bin/activate"
-
- # 执行数据库迁移
- echo "执行数据库迁移..."
- cd "$NETBOX_DIR/netbox"
- python3 manage.py migrate
-
- # 创建超级用户
- echo "创建超级用户..."
- DJANGO_SUPERUSER_USERNAME=admin \
- DJANGO_SUPERUSER_EMAIL=admin@example.com \
- DJANGO_SUPERUSER_PASSWORD=admin \
- python3 manage.py createsuperuser --noinput || {
- echo "警告:创建超级用户失败,可能已存在。继续安装..."
- }
-
- # 收集静态文件
- echo "收集静态文件..."
- python3 manage.py collectstatic --no-input
-
- # 验证数据库连接
- echo "验证数据库连接..."
- python3 manage.py check || {
- echo "警告:数据库检查失败,请检查配置..."
- return 1
- }
- }
- # 配置系统服务
- setup_services() {
- echo "配置系统服务..."
-
- # 创建 netbox 用户和组
- sudo useradd -r -s /bin/false netbox || true
-
- # 创建并设置必要的目录权限
- sudo mkdir -p /var/run/netbox
- sudo mkdir -p /var/log/netbox
- sudo chown -R netbox:netbox /var/run/netbox
- sudo chown -R netbox:netbox /var/log/netbox
- sudo chmod 755 /var/run/netbox
- sudo chmod 755 /var/log/netbox
-
- # 设置目录权限
- sudo chown -R netbox:netbox "$NETBOX_DIR"
- sudo chown -R netbox:netbox "$VENV_DIR"
- sudo chmod -R 755 "$NETBOX_DIR"
- sudo chmod -R 755 "$VENV_DIR"
-
- # 确保 gunicorn 和 python 可执行
- sudo chmod +x "$VENV_DIR/bin/gunicorn"
- sudo chmod +x "$VENV_DIR/bin/python"
-
- # 配置 Gunicorn 服务
- sudo tee /etc/systemd/system/netbox.service <<EOF
- [Unit]
- Description=NetBox WSGI Service
- Documentation=https://netbox.readthedocs.io/
- After=network.target postgresql.service redis.service
- Wants=postgresql.service redis.service
- [Service]
- Type=simple
- User=netbox
- Group=netbox
- RuntimeDirectory=netbox
- PIDFile=/var/run/netbox/netbox.pid
- WorkingDirectory=$NETBOX_DIR/netbox
- Environment="PATH=$VENV_DIR/bin:/usr/local/bin:/usr/bin:/bin"
- Environment="PYTHONPATH=$NETBOX_DIR/netbox"
- Environment="HOME=/home/netbox"
- Environment="USER=netbox"
- ExecStart=/usr/bin/env $VENV_DIR/bin/gunicorn \\
- --pid /var/run/netbox/netbox.pid \\
- --bind 127.0.0.1:8001 \\
- --workers 4 \\
- --timeout 300 \\
- --access-logfile /var/log/netbox/access.log \\
- --error-logfile /var/log/netbox/error.log \\
- netbox.wsgi:application
- Restart=always
- RestartSec=30
- [Install]
- WantedBy=multi-user.target
- EOF
- # 重新加载服务
- sudo systemctl daemon-reload
- sudo systemctl enable --now redis postgresql nginx netbox
-
- # 等待服务启动
- echo "等待服务启动..."
- sleep 10
-
- # 检查服务状态和日志
- echo "检查服务状态..."
- sudo systemctl status netbox --no-pager
-
- if ! systemctl is-active --quiet netbox; then
- echo "NetBox 服务启动失败,检查日志..."
- sudo journalctl -u netbox --no-pager | tail -n 50
- sudo cat /var/log/netbox/error.log || true
- fi
-
- # 配置 Nginx
- echo "配置 Nginx..."
-
- # 删除所有默认配置
- sudo rm -f /etc/nginx/conf.d/*.conf
-
- sudo tee /etc/nginx/conf.d/netbox.conf <<EOF
- server {
- listen 80 default_server;
- listen [::]:80 default_server;
- server_name _;
- client_max_body_size 25m;
- # 修正静态文件路径
- location /static/ {
- alias $NETBOX_DIR/netbox/static/;
- access_log off;
- expires 30d;
- }
- location / {
- proxy_pass http://127.0.0.1:8001;
- proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
- proxy_set_header X-Real-IP \$remote_addr;
- proxy_set_header Host \$http_host;
- proxy_set_header X-Forwarded-Proto \$scheme;
- proxy_redirect off;
- proxy_buffering off;
- }
- }
- EOF
- # 配置 SELinux(只在 SELinux 启用时执行)
- if [ "$(getenforce)" != "Disabled" ]; then
- echo "配置 SELinux 权限..."
- sudo setsebool -P httpd_can_network_connect 1
- sudo chcon -Rt httpd_sys_content_t "$NETBOX_DIR/netbox/static/" || true
- else
- echo "SELinux 已禁用,跳过 SELinux 配置"
- fi
- # 确保 nginx 用户有权限访问静态文件
- sudo chown -R nginx:nginx $NETBOX_DIR/netbox/static
- sudo chmod -R 755 $NETBOX_DIR/netbox/static
- # 测试 Nginx 配置
- sudo nginx -t
- # 重启 Nginx 服务
- sudo systemctl restart nginx
- }
- # 配置 Redis
- setup_redis() {
- echo "配置 Redis..."
-
- # 确保 Redis 已安装
- if ! command -v redis-server &> /dev/null; then
- echo "安装 Redis..."
- sudo dnf install -y redis
- fi
-
- # 备份并修改 Redis 配置
- if [ -f /etc/redis.conf ]; then
- sudo cp /etc/redis.conf /etc/redis.conf.bak
-
- # 修改 Redis 配置
- sudo tee /etc/redis.conf > /dev/null <<EOF
- bind 127.0.0.1
- port 6379
- daemonize yes
- supervised systemd
- dir /var/lib/redis
- pidfile /var/run/redis/redis.pid
- logfile /var/log/redis/redis.log
- EOF
-
- # 创建必要的目录
- sudo mkdir -p /var/log/redis
- sudo mkdir -p /var/run/redis
-
- # 设置权限
- sudo chown -R redis:redis /var/lib/redis
- sudo chown -R redis:redis /var/log/redis
- sudo chown -R redis:redis /var/run/redis
- sudo chmod 755 /var/lib/redis
- sudo chmod 755 /var/log/redis
- sudo chmod 755 /var/run/redis
- fi
-
- # 重启 Redis 服务
- sudo systemctl enable redis
- sudo systemctl restart redis
-
- # 等待 Redis 启动并验证
- echo "等待 Redis 启动..."
- for i in {1..30}; do
- if redis-cli ping &>/dev/null; then
- echo "Redis 已成功启动"
- break
- fi
- if [ $i -eq 30 ]; then
- echo "Redis 启动失败,请检查日志: sudo journalctl -u redis"
- exit 1
- fi
- sleep 1
- done
- }
- # 主函数
- main() {
- echo "开始安装 NetBox..."
-
- # 询问是否需要清理
- read -p "是否清理现有安装?(y/n) " -n 1 -r
- echo
- if [[ $REPLY =~ ^[Yy]$ ]]; then
- cleanup_services
- fi
-
- check_dependencies
- setup_redis
- setup_database
- install_netbox
- configure_netbox
- setup_services
-
- echo "NetBox 安装成功完成!"
- echo "请使用以下凭据访问 NetBox:"
- echo "URL: http://your-server-ip"
- echo "用户名: admin"
- echo "密码: admin"
- echo "请务必在首次登录后修改密码!"
- echo "注意:如果无法访问,请确保已配置防火墙允许 HTTP 访问(端口 80)"
- }
- # 执行主函数
- main#!/bin/bash
- # NetBox 一键安装脚本
- # 适用于 CentOS 9 Stream
- # 作者:Claude
- # 版本:1.0.1
- # 严格模式
- set -euo pipefail
- IFS=$'\n\t'
- # 定义变量
- BASE_DIR="/home"
- NETBOX_DIR="$BASE_DIR/netbox"
- VENV_DIR="$BASE_DIR/venv"
- NETBOX_CONFIG_DIR="$NETBOX_DIR/netbox/netbox"
- LOG_FILE="$BASE_DIR/netbox_install.log"
- DB_NAME="netbox"
- DB_USER="netbox"
- DB_PASS="your_secure_password"
- # 配置日志
- exec 1> >(tee -a "$LOG_FILE") 2>&1
- echo "开始安装 NetBox - $(date)"
- # 错误处理
- error_handler() {
- local line_no=$1
- echo "错误发生在第 ${line_no} 行"
- exit 1
- }
- trap 'error_handler ${LINENO}' ERR
- # 清理函数
- cleanup_services() {
- echo "清理现有服务和数据..."
-
- echo "停止服务..."
- sudo systemctl stop netbox nginx redis postgresql || true
-
- echo "清理运行时目录..."
- sudo rm -rf /var/run/netbox/* || true
-
- echo "清理 PostgreSQL 数据..."
- if [ -d "/var/lib/pgsql/data" ]; then
- sudo -u postgres dropdb netbox || true
- sudo -u postgres dropuser netbox || true
- fi
-
- echo "清理 NetBox 目录..."
- sudo rm -rf "$NETBOX_DIR" || true
-
- echo "清理 Python 虚拟环境..."
- sudo rm -rf "$VENV_DIR" || true
-
- echo "清理日志文件..."
- sudo rm -f /var/log/netbox*.log || true
-
- echo "清理 Redis 数据"
- sudo systemctl stop redis
- sudo rm -rf /var/lib/redis/* || true
-
- echo "清理 nginx 配置"
- sudo rm -f /etc/nginx/conf.d/netbox.conf || true
-
- echo "清理系统服务配置"
- sudo rm -f /etc/systemd/system/netbox.service || true
-
- echo "重新加载系统服务"
- sudo systemctl daemon-reload
-
- echo "清理完成"
- }
- # 检查依赖
- check_dependencies() {
- echo "检查并安装系统依赖..."
-
- # 添加必要的仓库
- sudo dnf install -y epel-release
- sudo dnf config-manager --set-enabled crb
-
- # 更新系统
- sudo dnf update -y
-
- # 安装开发工具组
- sudo dnf groupinstall -y "Development Tools"
-
- # 安装 SELinux 相关依赖
- echo "安装 SELinux 依赖..."
- sudo dnf install -y \
- policycoreutils-python-utils \
- python3-policycoreutils \
- python3-libselinux \
- python3-libsemanage \
- python3-setools \
- setroubleshoot-server \
- setools-console
-
- # 安装其他必要依赖
- echo "安装其他系统依赖..."
- sudo dnf install -y \
- python3.12 \
- python3.12-pip \
- python3.12-devel \
- postgresql-server \
- postgresql-contrib \
- postgresql-devel \
- nginx \
- redis \
- git \
- gcc \
- libpq-devel \
- libffi-devel \
- openssl-devel \
- libxml2-devel \
- libxslt-devel \
- libjpeg-devel \
- zlib-devel
-
- # 修改 Python 3.12 设置部分
- if [ -f "/usr/bin/python3.12" ]; then
- sudo alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 1
- sudo alternatives --set python3 /usr/bin/python3.12 || {
- echo "警告:无法设置 Python 3.12 为默认版本,但将继续安装..."
- }
- else
- echo "警告:未找到 Python 3.12,将使用系统默认的 Python 版本..."
- fi
-
- echo "系统依赖安装完成"
- }
- # 配置 PostgreSQL
- setup_database() {
- echo "配置 PostgreSQL 数据库..."
-
- # 确保 PostgreSQL 数据目录存在
- if [ ! -d "/var/lib/pgsql/data" ]; then
- sudo mkdir -p /var/lib/pgsql/data
- sudo chown postgres:postgres /var/lib/pgsql/data
- fi
-
- # 确 PostgreSQL 已初始化
- if [ ! -f /var/lib/pgsql/data/PG_VERSION ]; then
- echo "初始化 PostgreSQL 数据库..."
- # 使用 -E UTF8 显式指定编码,并使用 postgres 用户执行命令
- sudo -u postgres /usr/bin/postgresql-setup --initdb
-
- # 等待初始化完成
- sleep 5
- fi
-
- # 确保 PostgreSQL 服务已启动
- if ! systemctl is-active --quiet postgresql; then
- echo "启动 PostgreSQL 服务..."
- sudo systemctl start postgresql
- # 予服务足够的启动时间
- sleep 10
- fi
-
- # 验证 PostgreSQL 是否正在运行
- if ! pg_isready -q; then
- echo "错误:PostgreSQL 服务未能正确启动"
- sudo systemctl status postgresql
- exit 1
- fi
-
- # 修改 PostgreSQL 认证配置
- echo "配置 PostgreSQL 认证方式..."
- sudo cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.bak
-
- # 使用更安全的方式修改 pg_hba.conf
- sudo tee /var/lib/pgsql/data/pg_hba.conf > /dev/null <<EOF
- # TYPE DATABASE USER ADDRESS METHOD
- local all postgres trust
- local all all trust
- host all all 127.0.0.1/32 trust
- host all all ::1/128 trust
- EOF
- # 重启 PostgreSQL 服务以应用新配置
- sudo systemctl restart postgresql
-
- # 等待服务完全启动
- echo "等待 PostgreSQL 重新启动..."
- sleep 10
-
- # 再次验证服务状态
- if ! pg_isready -q; then
- echo "错误:PostgreSQL 服务重启后未能正确运行"
- sudo systemctl status postgresql
- exit 1
- fi
-
- # 设置 postgres 用户密码 (使用 trust 认证,无需密码)
- echo "设置 postgres 用户密码..."
- sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'postgres';"
-
- # 创建数据库和用户
- echo "创建数据库和用户..."
- sudo -u postgres psql <<EOF
- DROP DATABASE IF EXISTS $DB_NAME;
- DROP USER IF EXISTS $DB_USER;
- CREATE DATABASE $DB_NAME;
- CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';
- ALTER ROLE $DB_USER SET client_encoding TO 'utf8';
- ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';
- ALTER ROLE $DB_USER SET timezone TO 'UTC';
- GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
- \c $DB_NAME
- GRANT ALL ON SCHEMA public TO $DB_USER;
- EOF
-
- # 修改回 md5 认证
- sudo sed -i 's/trust/md5/g' /var/lib/pgsql/data/pg_hba.conf
-
- # 重启 PostgreSQL 使新配置生效
- sudo systemctl restart postgresql
-
- echo "数据库配置完成"
- }
- # 安装 NetBox
- install_netbox() {
- echo "安装 NetBox..."
-
- # 确保基础目录存在
- sudo mkdir -p "$BASE_DIR"
-
- # 克隆最新的 NetBox 代码
- if [ ! -d "$NETBOX_DIR" ]; then
- git clone https://github.com/netbox-community/netbox.git "$NETBOX_DIR"
- fi
-
- # 确保配置目录存在
- sudo mkdir -p "$NETBOX_CONFIG_DIR"
-
- # 创建并激活虚拟环境
- python3.12 -m venv "$VENV_DIR"
- source "$VENV_DIR/bin/activate"
-
- # 升级包管理工具
- pip install --upgrade pip wheel setuptools
- # 安装 gunicorn
- pip install gunicorn
-
- # 安装 NetBox 依赖
- cd "$NETBOX_DIR"
- pip install -r requirements.txt
- # 设置目录权限
- sudo chown -R netbox:netbox "$NETBOX_DIR"
- sudo chown -R netbox:netbox "$VENV_DIR"
- sudo chmod -R 755 "$NETBOX_DIR"
- sudo chmod -R 755 "$VENV_DIR"
-
- # 确保 gunicorn 可执行
- sudo chmod +x "$VENV_DIR/bin/gunicorn"
- sudo chmod +x "$VENV_DIR/bin/python"
- }
- # 配置 NetBox
- configure_netbox() {
- echo "配置 NetBox..."
-
- # 配置文件路径
- CONFIG_FILE="$NETBOX_CONFIG_DIR/configuration.py"
- EXAMPLE_CONFIG="$NETBOX_CONFIG_DIR/configuration.example.py"
-
- # 确保配置目录存在
- sudo mkdir -p "$NETBOX_CONFIG_DIR"
-
- # 如果找不到示例配置文件,尝试其他位置
- if [ ! -f "$EXAMPLE_CONFIG" ]; then
- ALTERNATE_PATHS=(
- "$NETBOX_DIR/netbox/configuration.example.py"
- "$NETBOX_DIR/configuration.example.py"
- "$NETBOX_CONFIG_DIR/configuration.example.py"
- )
-
- for path in "${ALTERNATE_PATHS[@]}"; do
- if [ -f "$path" ]; then
- EXAMPLE_CONFIG="$path"
- echo "找到示例配置文件:$EXAMPLE_CONFIG"
- break
- fi
- done
- fi
-
- if [ ! -f "$CONFIG_FILE" ]; then
- echo "正在创建配置文件..."
- # 直接创建配置文件,而不是复制示例文件
- sudo tee "$CONFIG_FILE" > /dev/null <<EOF
- import os
- import platform
- # 生成随机密钥
- SECRET_KEY = '$(python3 -c "import secrets; print(secrets.token_urlsafe(50))")'
- # 数据库配置
- DATABASE = {
- 'NAME': '$DB_NAME',
- 'USER': '$DB_USER',
- 'PASSWORD': '$DB_PASS',
- 'HOST': 'localhost',
- 'PORT': '5432',
- 'CONN_MAX_AGE': 300,
- }
- # Redis 配置
- REDIS = {
- 'tasks': {
- 'HOST': 'localhost',
- 'PORT': 6379,
- 'PASSWORD': '',
- 'DATABASE': 0,
- 'SSL': False,
- },
- 'caching': {
- 'HOST': 'localhost',
- 'PORT': 6379,
- 'PASSWORD': '',
- 'DATABASE': 1,
- 'SSL': False,
- }
- }
- # 允许所有主机访问
- ALLOWED_HOSTS = ['*']
- # 设置时区
- TIME_ZONE = 'Asia/Shanghai'
- EOF
- fi
-
- # 设置配置文件权限
- sudo chown -R netbox:netbox "$NETBOX_CONFIG_DIR"
- sudo chmod -R 755 "$NETBOX_CONFIG_DIR"
-
- # 激活虚拟环境
- source "$VENV_DIR/bin/activate"
-
- # 执行数据库迁移
- echo "执行数据库迁移..."
- cd "$NETBOX_DIR/netbox"
- python3 manage.py migrate
-
- # 创建超级用户
- echo "创建超级用户..."
- DJANGO_SUPERUSER_USERNAME=admin \
- DJANGO_SUPERUSER_EMAIL=admin@example.com \
- DJANGO_SUPERUSER_PASSWORD=admin \
- python3 manage.py createsuperuser --noinput || {
- echo "警告:创建超级用户失败,可能已存在。继续安装..."
- }
-
- # 收集静态文件
- echo "收集静态文件..."
- python3 manage.py collectstatic --no-input
-
- # 验证数据库连接
- echo "验证数据库连接..."
- python3 manage.py check || {
- echo "警告:数据库检查失败,请检查配置..."
- return 1
- }
- }
- # 配置系统服务
- setup_services() {
- echo "配置系统服务..."
-
- # 创建 netbox 用户和组
- sudo useradd -r -s /bin/false netbox || true
-
- # 创建并设置必要的目录权限
- sudo mkdir -p /var/run/netbox
- sudo mkdir -p /var/log/netbox
- sudo chown -R netbox:netbox /var/run/netbox
- sudo chown -R netbox:netbox /var/log/netbox
- sudo chmod 755 /var/run/netbox
- sudo chmod 755 /var/log/netbox
-
- # 设置目录权限
- sudo chown -R netbox:netbox "$NETBOX_DIR"
- sudo chown -R netbox:netbox "$VENV_DIR"
- sudo chmod -R 755 "$NETBOX_DIR"
- sudo chmod -R 755 "$VENV_DIR"
-
- # 确保 gunicorn 和 python 可执行
- sudo chmod +x "$VENV_DIR/bin/gunicorn"
- sudo chmod +x "$VENV_DIR/bin/python"
-
- # 配置 Gunicorn 服务
- sudo tee /etc/systemd/system/netbox.service <<EOF
- [Unit]
- Description=NetBox WSGI Service
- Documentation=https://netbox.readthedocs.io/
- After=network.target postgresql.service redis.service
- Wants=postgresql.service redis.service
- [Service]
- Type=simple
- User=netbox
- Group=netbox
- RuntimeDirectory=netbox
- PIDFile=/var/run/netbox/netbox.pid
- WorkingDirectory=$NETBOX_DIR/netbox
- Environment="PATH=$VENV_DIR/bin:/usr/local/bin:/usr/bin:/bin"
- Environment="PYTHONPATH=$NETBOX_DIR/netbox"
- Environment="HOME=/home/netbox"
- Environment="USER=netbox"
- ExecStart=/usr/bin/env $VENV_DIR/bin/gunicorn \\
- --pid /var/run/netbox/netbox.pid \\
- --bind 127.0.0.1:8001 \\
- --workers 4 \\
- --timeout 300 \\
- --access-logfile /var/log/netbox/access.log \\
- --error-logfile /var/log/netbox/error.log \\
- netbox.wsgi:application
- Restart=always
- RestartSec=30
- [Install]
- WantedBy=multi-user.target
- EOF
- # 重新加载服务
- sudo systemctl daemon-reload
- sudo systemctl enable --now redis postgresql nginx netbox
-
- # 等待服务启动
- echo "等待服务启动..."
- sleep 10
-
- # 检查服务状态和日志
- echo "检查服务状态..."
- sudo systemctl status netbox --no-pager
-
- if ! systemctl is-active --quiet netbox; then
- echo "NetBox 服务启动失败,检查日志..."
- sudo journalctl -u netbox --no-pager | tail -n 50
- sudo cat /var/log/netbox/error.log || true
- fi
-
- # 配置 Nginx
- echo "配置 Nginx..."
-
- # 删除所有默认配置
- sudo rm -f /etc/nginx/conf.d/*.conf
-
- sudo tee /etc/nginx/conf.d/netbox.conf <<EOF
- server {
- listen 80 default_server;
- listen [::]:80 default_server;
- server_name _;
- client_max_body_size 25m;
- # 修正静态文件路径
- location /static/ {
- alias $NETBOX_DIR/netbox/static/;
- access_log off;
- expires 30d;
- }
- location / {
- proxy_pass http://127.0.0.1:8001;
- proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
- proxy_set_header X-Real-IP \$remote_addr;
- proxy_set_header Host \$http_host;
- proxy_set_header X-Forwarded-Proto \$scheme;
- proxy_redirect off;
- proxy_buffering off;
- }
- }
- EOF
- # 配置 SELinux(只在 SELinux 启用时执行)
- if [ "$(getenforce)" != "Disabled" ]; then
- echo "配置 SELinux 权限..."
- sudo setsebool -P httpd_can_network_connect 1
- sudo chcon -Rt httpd_sys_content_t "$NETBOX_DIR/netbox/static/" || true
- else
- echo "SELinux 已禁用,跳过 SELinux 配置"
- fi
- # 确保 nginx 用户有权限访问静态文件
- sudo chown -R nginx:nginx $NETBOX_DIR/netbox/static
- sudo chmod -R 755 $NETBOX_DIR/netbox/static
- # 测试 Nginx 配置
- sudo nginx -t
- # 重启 Nginx 服务
- sudo systemctl restart nginx
- }
- # 配置 Redis
- setup_redis() {
- echo "配置 Redis..."
-
- # 确保 Redis 已安装
- if ! command -v redis-server &> /dev/null; then
- echo "安装 Redis..."
- sudo dnf install -y redis
- fi
-
- # 备份并修改 Redis 配置
- if [ -f /etc/redis.conf ]; then
- sudo cp /etc/redis.conf /etc/redis.conf.bak
-
- # 修改 Redis 配置
- sudo tee /etc/redis.conf > /dev/null <<EOF
- bind 127.0.0.1
- port 6379
- daemonize yes
- supervised systemd
- dir /var/lib/redis
- pidfile /var/run/redis/redis.pid
- logfile /var/log/redis/redis.log
- EOF
-
- # 创建必要的目录
- sudo mkdir -p /var/log/redis
- sudo mkdir -p /var/run/redis
-
- # 设置权限
- sudo chown -R redis:redis /var/lib/redis
- sudo chown -R redis:redis /var/log/redis
- sudo chown -R redis:redis /var/run/redis
- sudo chmod 755 /var/lib/redis
- sudo chmod 755 /var/log/redis
- sudo chmod 755 /var/run/redis
- fi
-
- # 重启 Redis 服务
- sudo systemctl enable redis
- sudo systemctl restart redis
-
- # 等待 Redis 启动并验证
- echo "等待 Redis 启动..."
- for i in {1..30}; do
- if redis-cli ping &>/dev/null; then
- echo "Redis 已成功启动"
- break
- fi
- if [ $i -eq 30 ]; then
- echo "Redis 启动失败,请检查日志: sudo journalctl -u redis"
- exit 1
- fi
- sleep 1
- done
- }
- # 主函数
- main() {
- echo "开始安装 NetBox..."
-
- # 询问是否需要清理
- read -p "是否清理现有安装?(y/n) " -n 1 -r
- echo
- if [[ $REPLY =~ ^[Yy]$ ]]; then
- cleanup_services
- fi
-
- check_dependencies
- setup_redis
- setup_database
- install_netbox
- configure_netbox
- setup_services
-
- echo "NetBox 安装成功完成!"
- echo "请使用以下凭据访问 NetBox:"
- echo "URL: http://your-server-ip"
- echo "用户名: admin"
- echo "密码: admin"
- echo "请务必在首次登录后修改密码!"
- echo "注意:如果无法访问,请确保已配置防火墙允许 HTTP 访问(端口 80)"
- }
- # 执行主函数
- main
|