Skip to content

部署指南

本文档提供了 ShopeX OMS 系统的完整部署指南,包括生产环境部署、Docker 容器化部署和云平台部署方案。


📋 目录


⚠️ 订单流量说明(商派矩阵收单)

🚨 重要提示:以下订单流量费用 仅在使用商派矩阵收单时产生。如果商家使用 自研收单,则 不产生订单流量费用

📦 首次使用赠送

  • 首次使用赠送 500 条订单流量,超出部分按增量包购买。

💰 订单流量价格(仅商派矩阵收单产生费用

🏢 部署在商派聚石塔

订单量价格
1万 订单300 元/年
10万 订单2000 元/年
100万 订单10000 元/年

🌐 非部署在商派聚石塔

订单量价格
1万 订单1500 元/年
10万 订单10000 元/年
100万 订单50000 元/年

🚨 再次提醒:以上订单流量费用 仅在使用商派矩阵收单时产生。如果商家使用 自研收单,则 不产生订单流量费用


🖥️ 生产环境部署

系统要求

服务器环境

  • 操作系统:Linux(推荐 Alibaba Cloud Linux release 3 (Soaring Falcon))
  • PHP:8.2(推荐)
  • MySQL:8.0(推荐)
  • Redis:6.2(推荐)
  • Memcached:1.5(推荐)
  • Web 服务器:Apache 2.4+ 或 OpenResty 1.21.4.2(推荐)

PHP 扩展

  • 必需:mysqlimbstringgdcurljsonopensslredisxlswriterswoole
  • 推荐:memcachedpdo_mysql(如需 PDO 方式)

部署步骤

1. 准备服务器环境

bash
# 更新系统
sudo apt-get update && sudo apt-get upgrade -y  # Ubuntu/Debian
# 或
sudo yum update -y  # CentOS/RHEL

# 安装基础工具
sudo apt-get install -y git curl wget unzip  # Ubuntu/Debian
# 或
sudo yum install -y git curl wget unzip  # CentOS/RHEL

2. 安装 PHP 8.2

Ubuntu/Debian

bash
sudo apt-get install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install -y php8.2 php8.2-fpm php8.2-mysql php8.2-mbstring \
    php8.2-gd php8.2-curl php8.2-xml php8.2-zip php8.2-redis php8.2-memcached

CentOS/RHEL

bash
sudo yum install -y epel-release
sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
sudo yum-config-manager --enable remi-php82
sudo yum install -y php php-fpm php-mysql php-mbstring php-gd \
    php-curl php-xml php-zip php-redis php-memcached

安装必需扩展

bash
# xlswriter(必需)
pecl install xlswriter
echo "extension=xlswriter.so" >> $(php --ini | grep "Loaded Configuration File" | sed -e "s|.*:\s*||")

# Swoole(必需)
pecl install swoole
echo "extension=swoole.so" >> $(php --ini | grep "Loaded Configuration File" | sed -e "s|.*:\s*||")

3. 安装 OpenResty 1.21.4.2

Alibaba Cloud Linux / CentOS / RHEL

bash
# 添加 OpenResty 仓库
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

# 安装 OpenResty
sudo yum install -y openresty openresty-opm

# 启动 OpenResty
sudo systemctl enable openresty
sudo systemctl start openresty

Ubuntu/Debian

bash
# 添加 OpenResty 仓库
sudo apt-get install -y software-properties-common
wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
sudo add-apt-repository -y "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main"
sudo apt-get update

# 安装 OpenResty
sudo apt-get install -y openresty

# 启动 OpenResty
sudo systemctl enable openresty
sudo systemctl start openresty

验证安装

bash
openresty -v
# 应该显示:openresty/1.21.4.2

4. 部署应用代码

说明:MySQL、Redis、Memcached 等服务:

  • 开发环境:使用 Docker Compose 中的本地服务(见 Docker 容器化部署章节)
  • 生产环境:使用云PAAS服务(RDS、云Redis、云Memcached),详见"配置数据库和缓存服务"章节
bash
# 克隆项目
cd /var/www
sudo git clone https://github.com/your-org/oms.git
cd oms

# 设置目录权限
sudo chown -R www-data:www-data /var/www/oms  # Ubuntu/Debian
# 或
sudo chown -R apache:apache /var/www/oms  # CentOS/RHEL

sudo chmod -R 755 /var/www/oms
sudo chmod -R 777 /var/www/oms/data
sudo chmod -R 777 /var/www/oms/config
sudo chmod -R 777 /var/www/oms/public

5. 安装 Composer 依赖

bash
cd /var/www/oms
composer install --no-dev --optimize-autoloader

6. 配置 Web 服务器

重要:项目根目录提供了 .htaccess.examplenginx.conf.example 配置文件示例,建议参考这些文件进行配置。

Apache 配置/etc/apache2/sites-available/oms.conf,使用 Apache 2.4+ 语法):

apache
<VirtualHost *:80>
    DocumentRoot "/var/www/oms"
    ServerName your-domain.com

    # 禁止访问敏感目录(Apache 2.4+ 语法:Require)
    <LocationMatch "^\/(\.git|script|data|config|vendor|cgi-bin|tools|docs|docker|tests|upgrade)\/">
        Require all denied
    </LocationMatch>

    <Directory "/var/www/oms">
        Options FollowSymLinks
        AllowOverride FileInfo
        Require all granted
        
        # 启用 Rewrite 引擎
        RewriteEngine On
        
        # 拒绝访问敏感目录(通过 RewriteRule,优先级更高)
        RewriteRule ^(\.git|script|data|config|vendor|cgi-bin|tools|docs|docker|tests|upgrade)(/.*)?$ - [F,L]
        
        # 如果文件或目录不存在,重定向到 index.php
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        
        # 特殊路由规则
        RewriteRule ^m- /index.html [NC,L]
        RewriteRule ^home$ /index.html [NC,L]
    </Directory>

    # 禁止访问 PHP 配置文件(Apache 2.4+ 语法)
    <FilesMatch "^(config|secrets|defined_ext)\.php$">
        Require all denied
    </FilesMatch>

    # 禁止访问隐藏文件(以 . 开头,除了 .htaccess)
    <FilesMatch "^\.">
        Require all denied
    </FilesMatch>

    # 允许访问 .htaccess 文件本身
    <Files ".htaccess">
        Require all granted
    </Files>

    # 安全头设置
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set X-Content-Type-Options "nosniff"

    ErrorLog ${APACHE_LOG_DIR}/oms_error.log
    CustomLog ${APACHE_LOG_DIR}/oms_access.log combined
</VirtualHost>

启用站点:

Ubuntu/Debian

bash
# 启用必要的模块
sudo a2enmod rewrite
sudo a2enmod headers
sudo a2ensite oms.conf
sudo systemctl restart apache2

CentOS/RHEL

bash
# 编辑 Apache 配置文件
sudo vi /etc/httpd/conf/httpd.conf

# 找到以下行并取消注释(如果被注释了)
# LoadModule rewrite_module modules/mod_rewrite.so
# 确保该行没有被注释(没有 # 号)

# 启用 headers 模块(如果被注释了)
# LoadModule headers_module modules/mod_headers.so

# 重启 Apache
sudo systemctl restart httpd
sudo systemctl enable httpd

⚠️ 重要:使用 Apache 时,必须启用 mod_rewrite 模块,否则 URL 重写功能无法正常工作,系统将无法正常访问。

使用 .htaccess 文件(可选,如果允许 AllowOverride):

bash
# 复制示例文件
cp .htaccess.example .htaccess

# 根据实际部署路径调整配置
# .htaccess 文件会自动保护敏感目录和配置文件
# 注意:.htaccess.example 使用 Apache 2.4+ 的 Require 语法

说明

  • .htaccess.example 使用 Apache 2.4+ 的 Require 语法(推荐)
  • 如果使用 Apache 2.2,文件中也包含了兼容配置(Order allow,deny
  • 建议升级到 Apache 2.4+ 以获得更好的安全性和性能

OpenResty/Nginx 配置(配置文件路径:/usr/local/openresty/nginx/conf/sites-available/oms):

重要:项目根目录提供了 nginx.conf.example 配置文件示例,包含了完整的安全配置和性能优化选项,强烈建议参考该文件进行配置。

nginx
server {
    listen 80;
    server_name your-domain.com;
    root /var/www/oms;
    index index.html index.php;
    
    # 字符集设置
    charset UTF-8;
    charset_types text/plain text/xml text/css text/javascript application/json application/javascript;
    
    # 请求体大小限制
    client_max_body_size 20M;
    
    # ========== 生产环境性能优化(开发环境可注释)==========
    # 隐藏 Nginx 版本号(安全优化)
    # server_tokens off;
    
    # 连接优化
    # keepalive_timeout 65;
    # keepalive_requests 100;
    
    # 性能优化:启用 sendfile 和 tcp_nopush
    # sendfile on;
    # tcp_nopush on;
    # tcp_nodelay on;
    
    # 文件描述符缓存(性能优化)
    # open_file_cache max=10000 inactive=30s;
    # open_file_cache_valid 60s;
    # open_file_cache_min_uses 2;
    # open_file_cache_errors on;
    
    # Gzip 压缩配置(性能优化)
    # gzip on;
    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
    # gzip_min_length 1000;
    # gzip_disable "msie6";
    
    # 日志配置(开发环境建议启用)
    # access_log /var/log/nginx/oms_access.log;
    # error_log /var/log/nginx/oms_error.log;
    
    # 安全头设置(生产环境推荐,开发环境可注释)
    # add_header X-Frame-Options "SAMEORIGIN" always;
    # add_header X-XSS-Protection "1; mode=block" always;
    # add_header X-Content-Type-Options "nosniff" always;
    # add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    # 如果已配置 SSL,取消下面的注释
    # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
    # ========== 安全规则(按优先级排序,最具体的规则在前)==========
    
    # 禁止访问敏感文件扩展名(优先匹配)
    location ~ \.(sql|log|bak|backup|old|tmp|ini|conf)$ {
        deny all;
        return 403;
    }
    
    # 禁止访问隐藏文件(以 . 开头)
    location ~ /\. {
        deny all;
        return 403;
    }
    
    # 禁止访问敏感目录
    location ~ ^/(\.git|script|data|config|vendor|cgi-bin|tools|docs|docker|tests|upgrade)/ {
        deny all;
        return 403;
    }
    
    # 禁止访问 PHP 配置文件
    location ~ ^/.*/(config|secrets|defined_ext)\.php$ {
        deny all;
        return 403;
    }
    
    # ========== 特殊路由规则 ==========
    
    # 修复重复的 index.php - 将多个连续的 /index.php 重写为单个 /index.php
    location ~ ^/index\.php(/index\.php)+ {
        rewrite ^/index\.php(/index\.php)+(.*)$ /index.php$2 last;
    }
    
    # 将 '/home' 的请求重写到 index.html
    location = /home {
        rewrite ^ /index.html last;
    }
    
    # 将以 'm-' 开头的请求重写到 index.html
    location ~ ^/m- {
        rewrite ^/m- /index.html last;
    }
    
    # ========== 静态文件处理 ==========
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot|webp|avif)$ {
        # 开发环境:禁用缓存,方便调试
        add_header Cache-Control "no-cache, no-store, must-revalidate";
        add_header Pragma "no-cache";
        add_header Expires "0";
        
        # 生产环境:启用缓存(取消下面的注释)
        # expires 30d;
        # add_header Cache-Control "public, immutable";
        # access_log off;
        # etag off;
    }
    
    # ========== PHP 文件处理 ==========
    location ~ \.php$ {
        # 禁止直接访问敏感配置文件
        if ($request_uri ~* "/(config|secrets|defined_ext)\.php$") {
            return 403;
        }
        
        # fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        # 或使用 TCP 连接:
        fastcgi_pass 127.0.0.1:9000;
        
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        
        # FastCGI 超时设置
        fastcgi_read_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_connect_timeout 60;
        
        # FastCGI 缓冲优化(生产环境推荐,开发环境可注释)
        # fastcgi_buffers 16 16k;
        # fastcgi_buffer_size 32k;
        # fastcgi_busy_buffers_size 64k;
        # fastcgi_temp_file_write_size 64k;
        
        # FastCGI 缓存(可选,根据需求启用)
        # fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2 keys_zone=php_cache:100m inactive=60m;
        # fastcgi_cache php_cache;
        # fastcgi_cache_valid 200 60m;
        # fastcgi_cache_bypass $skip_cache;
        # fastcgi_no_cache $skip_cache;
    }
    
    # ========== 主路由处理 ==========
    # fallback 到 index.html 用于 SPA 路由
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    
    # ========== 错误页面配置 ==========
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
        internal;
    }
    location = /404.html {
        root /usr/share/nginx/html;
        internal;
    }
}

# HTTPS 配置示例(如果已配置 SSL 证书)
# server {
#     listen 443 ssl http2;
#     server_name your-domain.com;
#     root /var/www/oms;
#     
#     # SSL 证书配置
#     ssl_certificate /path/to/certificate.crt;
#     ssl_certificate_key /path/to/private.key;
#     ssl_protocols TLSv1.2 TLSv1.3;
#     ssl_ciphers HIGH:!aNULL:!MD5;
#     ssl_prefer_server_ciphers on;
#     
#     # 其他配置与 HTTP 配置相同
#     # ...
# }

启用站点:

bash
# 创建配置目录(如果不存在)
sudo mkdir -p /usr/local/openresty/nginx/conf/sites-available
sudo mkdir -p /usr/local/openresty/nginx/conf/sites-enabled

# 创建符号链接
sudo ln -s /usr/local/openresty/nginx/conf/sites-available/oms /usr/local/openresty/nginx/conf/sites-enabled/

# 在 nginx.conf 中引入 sites-enabled
# 编辑 /usr/local/openresty/nginx/conf/nginx.conf,在 http 块中添加:
# include /usr/local/openresty/nginx/conf/sites-enabled/*;

# 测试配置
sudo /usr/local/openresty/nginx/sbin/nginx -t

# 重启 OpenResty
sudo systemctl restart openresty

使用 nginx.conf.example(推荐):

bash
# 参考项目根目录的 nginx.conf.example 文件
# 该文件包含了完整的安全配置和性能优化选项,包括:
# - 字符集设置
# - 请求体大小限制
# - 性能优化配置(sendfile、gzip、文件缓存等)
# - 安全头设置(X-Frame-Options、X-XSS-Protection 等)
# - 禁止访问敏感文件扩展名(.sql、.log、.bak 等)
# - 禁止访问敏感目录(config、data、vendor、.git 等)
# - 禁止访问 PHP 配置文件(config.php、secrets.php、defined_ext.php 等)
# - 特殊路由规则(修复重复的 index.php、/home 重写、m- 开头的请求)
# - 静态文件处理(开发/生产环境缓存策略)
# - PHP 文件处理(FastCGI 配置、超时设置、缓冲优化)
# - 错误页面配置
# - HTTPS 配置示例
#
# 使用方法:
# 1. 复制 nginx.conf.example 到目标位置
# 2. 根据实际部署路径调整 root、fastcgi_pass 等配置
# 3. 根据环境(开发/生产)启用或注释相应的性能优化选项

6.1. Web 服务器安全配置

保护配置文件

Web 服务器配置必须禁止直接访问敏感配置文件和目录,防止配置文件泄露。

Apache 配置要点(使用 Apache 2.4+ 的 Require 语法):

  1. 禁止访问 config/ 目录:使用 <LocationMatch> + Require all denied
  2. 禁止访问 config.phpsecrets.phpdefined_ext.php 等配置文件:使用 <FilesMatch> + Require all denied
  3. 禁止访问 .gitvendordata 等敏感目录:使用 RewriteRule<LocationMatch>
  4. 禁止访问隐藏文件:使用 <FilesMatch> + Require all denied
  5. 设置安全响应头(X-Frame-Options、X-XSS-Protection、X-Content-Type-Options 等)

Apache 2.4+ 语法示例

apache
# 禁止访问目录
<LocationMatch "^/config/">
    Require all denied
</LocationMatch>

# 禁止访问文件
<FilesMatch "^(config|secrets)\.php$">
    Require all denied
</FilesMatch>

Nginx/OpenResty 配置要点

  1. 使用 location ~ 规则禁止访问敏感目录和文件(按优先级排序,最具体的规则在前)
  2. 禁止访问敏感文件扩展名(.sql、.log、.bak、.backup、.old、.tmp、.ini、.conf 等)
  3. 禁止访问隐藏文件(以 . 开头)
  4. 禁止访问敏感目录(.git、script、data、config、vendor、cgi-bin、tools、docs、docker、tests、upgrade 等)
  5. 禁止访问 PHP 配置文件(config.php、secrets.php、defined_ext.php)
  6. 在 PHP 处理块中额外检查敏感配置文件(双重保护)
  7. 设置安全响应头(X-Frame-Options、X-XSS-Protection、X-Content-Type-Options 等)
  8. 配置特殊路由规则(修复重复的 index.php、/home 重写、m- 开头的请求)
  9. 配置静态文件缓存策略(开发环境禁用缓存,生产环境启用缓存)
  10. 配置 FastCGI 超时和缓冲优化(生产环境推荐)

验证配置

部署后,请验证以下 URL 是否返回 403 错误:

  • http://your-domain.com/config/config.php
  • http://your-domain.com/config/secrets.php
  • http://your-domain.com/config/defined_ext.php
  • http://your-domain.com/config/
  • http://your-domain.com/.git/
  • http://your-domain.com/data/
  • http://your-domain.com/vendor/
  • http://your-domain.com/.htaccess(隐藏文件)
  • http://your-domain.com/config.php(如果存在)
  • http://your-domain.com/test.sql(敏感文件扩展名)
  • http://your-domain.com/log.txt(敏感文件扩展名)

文件权限设置

确保配置文件权限正确:

bash
# 配置文件权限(仅所有者可读写)
chmod 600 config/config.php
chmod 600 config/secrets.php

# 目录权限
chmod 755 config/
chmod 755 data/
chmod 755 public/

# 日志目录权限(仅应用用户可读写)
chmod 750 data/logs/

参考文件

  • Apache 配置示例:.htaccess.example(项目根目录)
  • Nginx 配置示例:nginx.conf.example(项目根目录)

7. 初始化系统

方式1:浏览器安装(推荐)

  1. 访问:http://your-domain.com/index.php/setup
  2. 按照安装向导完成配置

安装锁定补充:生产或已完成安装的环境可以设置环境变量 ONEX_OMS_INSTALL=LOCK,系统会强制阻止再次进入安装向导(等效于存在正确的 config/install.lock.php)。

方式2:命令行安装

bash
cd /var/www/oms
php app/base/cmd install base

8. 配置任务服务

bash
# 启动任务服务
cd /var/www/oms
php app/taskmgr/sw.php worker:start -d

# 检查状态
php app/taskmgr/sw.php worker:status

🐳 Docker 容器化部署

环境准备

在开始部署前,请确保满足以下要求:

  • Docker >= 20.10(支持Linux/macOS/Windows)
  • Docker Compose >= 2.0

不同操作系统的Docker安装方式

  • Linux:下载Docker Desktop for Linux
  • macOS:下载Docker Desktop for Mac
  • Windows:下载Docker Desktop for Windows

重要说明:项目已提供完整的 Dockerfile,可直接使用无需自行创建。

🚀 容器化部署四步完成

按照以下明确步骤操作,可快速完成系统部署:

第一步:环境检查与配置准备(5分钟)

  1. 验证Docker环境

    bash
    # 检查Docker版本
    docker --version
    docker-compose --version
    
    # 启动Docker服务(根据操作系统选择对应命令)
    
    # Linux系统(systemd)
    sudo systemctl start docker
    sudo systemctl enable docker
    
    # macOS系统
    # Docker Desktop会自动启动,无需手动启动
    
    # Windows系统
    # 通过Docker Desktop应用启动,或使用Windows服务管理器
  2. 授权docker目录访问权限授权docker目录访问权限

  3. 创建必要目录结构

    根据您的操作系统执行对应的命令:

    Linux/macOS用户

    bash
    # 创建目录
    mkdir -p /opt/oms/conf
    mkdir -p /opt/oms/mysql
    mkdir -p /opt/oms/logs
    mkdir -p /opt/oms/project
    
    # 设置目录权限
    chmod 755 /opt/oms/conf
    chmod 755 /opt/oms/mysql

    Windows用户

    powershell
    # 在PowerShell中执行以下命令
    mkdir -Force "C:\oms\conf"
    mkdir -Force "C:\oms\mysql"
    mkdir -Force "C:\oms\logs"
    mkdir -Force "C:\oms\project"

    说明:请根据您的操作系统将配置中的路径占位符替换为实际路径:

    • Linux/macOS系统:建议使用 /opt/oms/ 相关路径
    • Windows系统:建议使用 C:\oms\ 相关路径
    • 具体路径请参考前面步骤中创建的目录结构

    说明:这些目录用于存放配置文件、MySQL初始化脚本和日志文件,确保Docker容器能够正确挂载和访问。

  4. 准备核心配置文件

    • 下载源码

      bash
        git clone git clone https://gitee.com/ShopeX/OMS.git /opt/oms/project
      
      
      
        git clone https://github.com/ShopeX/OMS.git /opt/oms/project
      
        cp /opt/oms/project/app/taskmgr/config/config.sample.php /opt/oms/project/app/taskmgr/config/config.php
      
        # 仅限本地开发环境,用于安装composer.lock
        chmod 777 /opt/oms/project
        chmod -R 777 /opt/oms/project/config /opt/oms/project/data /opt/oms/project/public
    • Apache虚拟主机配置

      bash
      cat << 'EOF' | sudo tee -a /opt/oms/conf/opensource.conf > /dev/null
      LoadModule rewrite_module modules/mod_rewrite.so
      
      <VirtualHost *:80>
          DocumentRoot "/var/www/html/oms"
          ServerName opensource-oms.local
          CustomLog /dev/stdout ttlog
          
          # 处理 OPTIONS 预检请求
          RewriteEngine On
          RewriteCond %{REQUEST_METHOD} OPTIONS
          RewriteRule ^(.*)$ $1 [R=200,L]
      
          # 安全设置:禁止访问敏感目录
          <Location /.git/>
              Require all denied
          </Location>
          <Location /script/>
              Require all denied
          </Location>
          <Location /data/>
              Require all denied
          </Location>
          <Location /config/>
              Require all denied
          </Location>
          
          <Directory "/var/www/html/oms">
              Options FollowSymLinks
              AllowOverride None
              Require all granted
      
              RewriteEngine On
      
              # 前端路由规则
              RewriteCond %{REQUEST_FILENAME} !-f
              RewriteCond %{REQUEST_FILENAME} !-d
              RewriteRule ^m- /index.html [NC,L]
      
              RewriteRule ^home$ /index.html [NC,L]
              RewriteRule ^login$ /index.html [NC,L]
          </Directory>
      </VirtualHost>
      EOF
      • 重要说明 - Apache 虚拟主机配置 opensource.conf

      opensource.conf 是 Apache 虚拟主机配置文件,用于配置 OMS 应用的 Web 服务器设置,包括文档根目录、URL 重写规则和安全设置。

      • 配置说明

        • DocumentRoot:应用代码根目录,容器内路径为 /var/www/html/oms
        • ServerName:虚拟主机名称,与 extra_hosts 中的域名对应
        • 安全设置:禁止直接访问 .gitscriptdataconfig 等敏感目录
        • URL 重写:支持前端路由,将特定路径重定向到 index.html
        • OPTIONS 预检:处理 CORS 预检请求
      • 注意事项

        • 如需修改配置,编辑后需要重启容器:docker restart oms-app
        • ServerName 需要与 docker-compose.yml 中的 extra_hosts 配置一致
        • 重要:必须在宿主机的 /etc/hosts 文件中添加域名解析:127.0.0.1 opensource-oms.local
    • MySQL初始化脚本

      bash
      cat << 'EOF' | sudo tee -a /opt/oms/mysql/init.sql > /dev/null
      -- 初始化 root 远程访问(仅首次初始化时执行)
      ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
      CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY '123456';
      GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
      FLUSH PRIVILEGES;
      EOF
      • 重要说明 - MySQL 初始化脚本 init.sql

        1. init.sql 文件会在 MySQL 容器首次初始化时自动执行(仅当数据卷为空时),用于创建 root@% 用户并授权,确保应用容器可以远程连接 MySQL。
      • 注意事项

        1. 如果 MySQL 数据卷已存在,init.sql 不会再次执行

        2. 确保 init.sql 中的密码与 docker-compose.yml 中的 MYSQL_ROOT_PASSWORD 一致

    • MySQL配置文件

      bash
      cat << 'EOF' | sudo tee -a /opt/oms/mysql/custom_my.cnf > /dev/null
      [mysqld]
      sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
      EOF
      • 重要说明 - MySQL 自定义配置文件 custom_my.cnf

        1. custom_my.cnf 是 MySQL 的自定义配置文件,用于设置 MySQL 服务器的运行参数,特别是 sql_mode 配置,确保数据一致性和 SQL 标准兼容性。
      • 配置说明

        1. sql_mode:SQL 模式配置,用于控制 MySQL 的 SQL 语法检查和数据验证行为
          • STRICT_TRANS_TABLES:启用严格模式,防止无效数据插入
          • NO_ZERO_IN_DATE/NO_ZERO_DATE:禁止使用零日期,避免日期数据异常
          • ERROR_FOR_DIVISION_BY_ZERO:除零错误处理,提高数据准确性
          • NO_ENGINE_SUBSTITUTION:防止 MySQL 自动替换存储引擎
      • 注意事项

        • 此配置文件会在 MySQL 容器启动时自动加载
        • 修改配置后需要重启 MySQL 容器:docker restart mysql80
        • 如果不需要自定义配置,可以不挂载此文件,MySQL 会使用默认配置
        • 注意:docker-compose.yml 中的 sql_mode 环境变量会覆盖此文件中的配置
    • 创建 docker-compose.yml 配置文件

      bash
      cat << 'EOF' | sudo tee -a /opt/oms/docker-compose.yml > /dev/null
      version: '3.7'
      
      services:
        # 主应用服务
        oms-app:
            image: shopexhub/httpd2:oms-8.2.29-apache-alpine3.18-v1.0
            container_name: oms-app
            restart: always        
            extra_hosts:
              - "opensource-oms.local:127.0.0.1"
            # ⚠️ 重要:需要在宿主机 /etc/hosts 文件中添加以下行:
            # 127.0.0.1    opensource-oms.local
            ports:
              - 80:80
            volumes:
              - /opt/oms/conf/opensource.conf:/etc/apache2/conf.d/opensource.conf
              - /opt/oms/project:/var/www/html/oms
              - /opt/oms/project/app/taskmgr/config/config.php:/var/www/html/oms/app/taskmgr/config/config.php  # 任务服务配置需持久化挂载
      
            command: >
              sh -c "
                if [ ! -f /var/www/html/oms/vendor/autoload.php ]; then
                  echo '>>> Installing Composer and dependencies...';
      
                  # 1. 安装 composer
                  cp /var/www/html/oms/tools/composer.phar /usr/local/bin/composer && \
                  chmod +x /usr/local/bin/composer && \
      
                  # 2. 配置阿里云镜像(HTTPS 在部分环境会握手失败)
                  composer config -g secure-http false && \
                  composer config -g repo.packagist composer http://mirrors.aliyun.com/composer/ && \
      
                  # 3. 安装依赖
                  cd /var/www/html/oms && \
                  composer install --no-dev --optimize-autoloader;
      
                  echo '>>> Composer install completed.';
                fi;
                exec apache2-foreground
              "
            environment:
                # ONEX_OMS_INSTALL: 'LOCK'  # 生产必须,防止重复安装
                # 聚石塔 RDS
                ONEX_OMS_DB_HOST: 'mysql80'
                ONEX_OMS_DB_USER: 'root'
                ONEX_OMS_DB_PASSWORD: '123456'
                ONEX_OMS_DB_NAME: 'opensource-oms'
                # 聚石塔 Redis
                # ONEX_OMS_KVSTORE_STORAGE: 'base_kvstore_redis'
                # ONEX_OMS_KVSTORE_REDIS_CONFIG: 'redis:6379'
                # ONEX_OMS_CACHE_STORAGE: 'base_cache_redis'
                # ONEX_OMS_CACHE_REDIS_CONFIG: 'redis:6379:1'
                # 如需 Memcached,可改为:
                # ONEX_OMS_CACHE_STORAGE: 'base_cache_memcached'
                # ONEX_OMS_CACHE_MEMCACHED_CONFIG: 'your-memcached-host:11211'
            privileged: true
            depends_on:
              - mysql
              - redis
              - memcached
            networks:
              - oms-network
      
        # 任务服务
        oms-worker:
          image: shopexhub/httpd2:supervisor-php82-alpine3.22
          container_name: oms-worker
          volumes:
            - /opt/oms/project:/var/www/html/oms                # 开发环境挂载代码目录(容器内路径 /var/www/html/oms)
            - /opt/oms/project/app/taskmgr/config/config.php:/var/www/html/oms/app/taskmgr/config/config.php  # 任务服务配置需持久化挂载
          environment:
            - TZ=Asia/Shanghai
            # 生产(聚石塔)同样可用环境变量注入
            # ONEX_OMS_INSTALL=LOCK
            # ONEX_OMS_DB_HOST=rm-xxxxx.mysql.rds.aliyuncs.com
            # ONEX_OMS_DB_USER=oms_user
            # ONEX_OMS_DB_PASSWORD=your_password
            # ONEX_OMS_DB_NAME=oms
            # ONEX_OMS_KVSTORE_STORAGE=base_kvstore_redis
            # ONEX_OMS_KVSTORE_REDIS_CONFIG=r-xxxxx.redis.rds.aliyuncs.com:6379
            # ONEX_OMS_CACHE_STORAGE=base_cache_redis
            # ONEX_OMS_CACHE_REDIS_CONFIG=r-xxxxx.redis.rds.aliyuncs.com:6379:1
            # 如需 Memcached:
            # ONEX_OMS_CACHE_STORAGE=base_cache_memcached
            # ONEX_OMS_CACHE_MEMCACHED_CONFIG=your-memcached-host:11211
          # 开发环境:使用本地服务时,取消下面的注释
          # 生产环境:使用云PAAS服务时,注释掉 depends_on,并在 config/config.php 中配置云服务地址
          depends_on:
            - mysql
            - redis
            - memcached
          networks:
            - oms-network
      
        # Redis 服务(生产环境推荐使用云PAAS服务,开发环境可以使用本地服务)
        # 开发环境:取消下面的注释使用本地Redis
        # 生产环境:注释掉,使用云Redis服务,并在 config/config.php 中配置
        redis:
          image: redis:6.2-alpine
          container_name: oms-redis
          ports:
            - "6379:6379"
          volumes:
            - redis-data:/data
          command: redis-server --appendonly yes
          networks:
            - oms-network
      
        # Memcached 服务(生产环境推荐使用云PAAS服务,开发环境可以使用本地服务)
        # 开发环境:取消下面的注释使用本地Memcached
        # 生产环境:注释掉,使用云Memcached或云Redis服务,并在 config/config.php 中配置
        memcached:
          image: memcached:1.5-alpine
          container_name: oms-memcached
          ports:
            - "11211:11211"
          networks:
            - oms-network
      
        # MySQL 服务(生产环境强烈推荐使用云PAAS服务,开发环境可以使用本地服务)
        # 开发环境:取消下面的注释使用本地MySQL
        # 生产环境:注释掉,使用RDS、TencentDB等云数据库,并在 config/config.php 中配置
        # ⚠️ 重要:sql_mode 配置是必须的,用于确保数据一致性和 SQL 标准兼容性
        #   - ONLY_FULL_GROUP_BY: 确保 GROUP BY 查询的列必须出现在 SELECT 中或使用聚合函数
        #   - STRICT_TRANS_TABLES: 启用严格模式,防止无效数据插入
        #   - NO_ZERO_IN_DATE/NO_ZERO_DATE: 禁止使用零日期,避免日期数据异常
        #   - ERROR_FOR_DIVISION_BY_ZERO: 除零错误处理,提高数据准确性
        #   - NO_ENGINE_SUBSTITUTION: 防止 MySQL 自动替换存储引擎
        # ⚠️ 重要:MYSQL_ROOT_HOST=% 允许 root 从任何主机连接,MYSQL_ROOT_PASSWORD 不要加引号
        # ⚠️ 重要:init.sql 会在首次初始化时执行,用于创建 root@% 用户并授权,确保容器间可访问
        mysql:
          image: mysql:8.0
          command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --bind-address=0.0.0.0
          restart: always
          privileged: true
          ports:
              - 3307:3306
          environment:
              - MYSQL_ROOT_PASSWORD=123456
              - MYSQL_ROOT_HOST=%
              - TZ=Asia/Shanghai
              - sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
          volumes:
              - mysql-data:/var/lib/mysql
              - /opt/oms/mysql/custom_my.cnf:/etc/mysql/conf.d/custom_my.cnf
              - /opt/oms/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
          container_name: mysql80
          networks:
            - oms-network
      
        # phpMyAdmin 服务(可选,用于数据库管理)
        # 访问地址:http://localhost:8080
        # 注意:PMA_HOSTS 使用容器名称 mysql80,PMA_PORTS 使用容器内端口 3306
        phpmyadmin:
          image: phpmyadmin
          restart: always
          ports:
              - 8080:80
          environment:
              PMA_ARBITRARY: 1
              PMA_USER: root
              PMA_PASSWORD: 123456
              PMA_HOSTS: mysql80
              PMA_PORTS: 3306
          container_name: phpmyadmin
          networks:
              - oms-network
          depends_on:
              - mysql
          privileged: true
      
      volumes:
        redis-data:
        mysql-data:
      
      networks:
        oms-network:
          driver: bridge
      EOF
  5. 完成配置 确保所有配置文件中的路径占位符已正确替换为您的实际路径。

第二步:服务启动(3分钟)

bash
# 进入配置目录并启动服务
cd /opt/oms
docker-compose up -d

# 验证服务状态
docker-compose ps

第三步:系统初始化配置(2分钟)

推荐方式:浏览器安装向导

  1. 访问安装地址:http://opensource-oms.local/index.php/setup(需先在 /etc/hosts 中配置域名解析)
  2. 按提示完成:
    • 数据库连接配置
    • 管理员账号设置
    • 系统基础配置
    • 安装确认

备选方式:命令行安装

bash
# 进入应用容器
docker exec -it oms-app sh

# 执行安装命令
php /var/www/html/oms/app/base/cmd install

⚠️ 命令行安装需提前配置数据库参数,建议仅在自动化部署时使用

第四步:任务服务启动(1分钟)

bash
# 进入任务容器
docker exec -it oms-worker sh

# 启动任务服务
php /var/www/html/oms/app/taskmgr/sw.php worker:start -d

# 验证任务服务状态
php /var/www/html/oms/app/taskmgr/sw.php worker:status

环境说明

  • 生产环境:优先推荐使用阿里云聚石塔托管(官方唯一推荐方案);下方 Docker Compose 更适合开发/测试验证,若自管生产请自行评估高可用和运维成本
  • 开发环境:可以使用本地服务(Docker中的MySQL、Redis、Memcached),便于本地开发和测试

生产环境推荐(聚石塔)

  • 使用聚石塔提供的数据库/Redis/缓存等云服务
  • 如需自管,请改用云数据库和云Redis,避免在容器内自建单点

开发环境可选

  • 可以使用Docker Compose中的MySQL、Redis、Memcached服务进行本地开发

⚡ 部署优化建议

  • 时间预估:完整部署约需11分钟(环境准备5分钟 + 服务启动3分钟 + 系统初始化2分钟 + 任务启动1分钟)
  • 跨平台支持:文档适用于Linux、macOS、Windows系统
  • 生产环境:强烈推荐使用阿里云聚石塔托管服务,降低运维成本
  • 开发环境:可使用本地Docker服务,便于调试和测试
  • 资源建议:4核8G以上配置,确保服务稳定运行
  • 备份策略:定期备份MySQL数据和配置文件

配置数据库和缓存服务

环境区分

  • 生产环境:只推荐使用云PAAS(阿里云聚石塔),不要在容器内自建 MySQL/Redis,避免单点和运维成本
  • 开发环境:可以使用本地服务(Docker中的MySQL、Redis、Memcached),便于本地开发和测试

开发环境配置(使用本地服务)

如果使用 Docker Compose 中的本地服务,无需额外配置,服务会自动启动。确保 depends_on 配置已启用。

非容器化部署 MySQL 配置(本地安装)

如果需要在非容器化环境中本地安装 MySQL,必须配置 sql_mode,以确保数据一致性和 SQL 标准兼容性。

安装 MySQL 8.0

Ubuntu/Debian

bash
sudo apt-get update
sudo apt-get install -y mysql-server
sudo systemctl start mysql
sudo systemctl enable mysql

CentOS/RHEL

bash
sudo yum install -y mysql-server
sudo systemctl start mysqld
sudo systemctl enable mysqld

配置 sql_mode(必须配置):

编辑 MySQL 配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或 /etc/my.cnf(CentOS/RHEL),在 [mysqld] 段添加:

ini
[mysqld]
# ⚠️ 重要:sql_mode 配置是必须的,用于确保数据一致性和 SQL 标准兼容性
#   - ONLY_FULL_GROUP_BY: 确保 GROUP BY 查询的列必须出现在 SELECT 中或使用聚合函数
#   - STRICT_TRANS_TABLES: 启用严格模式,防止无效数据插入
#   - NO_ZERO_IN_DATE/NO_ZERO_DATE: 禁止使用零日期,避免日期数据异常
#   - ERROR_FOR_DIVISION_BY_ZERO: 除零错误处理,提高数据准确性
#   - NO_ENGINE_SUBSTITUTION: 防止 MySQL 自动替换存储引擎
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

# 设置时区(可选,推荐)
default-time-zone='+08:00'

重启 MySQL 服务

bash
# Ubuntu/Debian
sudo systemctl restart mysql

# CentOS/RHEL
sudo systemctl restart mysqld

验证配置

bash
mysql -u root -p -e "SELECT @@sql_mode;"

应该显示配置的 sql_mode 值。

创建数据库和用户

bash
mysql -u root -p <<EOF
CREATE DATABASE oms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'oms_user'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON oms.* TO 'oms_user'@'localhost';
FLUSH PRIVILEGES;
EOF

生产环境配置(使用云PAAS服务,聚石塔)

强烈推荐:生产环境全部托管在阿里云聚石塔,不在容器内运行数据库/缓存。

配置云数据库(MySQL,聚石塔 RDS)

⚠️ 重要:使用云数据库(RDS)时,必须在 RDS 控制台配置 sql_mode,确保数据一致性和 SQL 标准兼容性。

配置 RDS sql_mode

  1. 登录阿里云 RDS 控制台
  2. 进入实例管理 → 参数设置
  3. 找到 sql_mode 参数,设置为:
    ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  4. 保存并重启实例(如需要)

连接配置(两种方式,二选一):

  • 方式1:环境变量注入(推荐,免挂载):

    • ONEX_OMS_DB_HOST=rm-xxxxx.mysql.rds.aliyuncs.com
    • ONEX_OMS_DB_USER=oms_user
    • ONEX_OMS_DB_PASSWORD=your_password
    • ONEX_OMS_DB_NAME=oms
  • 方式2:config.php 内 define(需挂载 config.php):

    php
    define('DB_HOST', 'rm-xxxxx.mysql.rds.aliyuncs.com');
    define('DB_USER', 'oms_user');
    define('DB_PASSWORD', 'your_password');
    define('DB_NAME', 'oms');

配置云 Redis(聚石塔 Redis)

两种方式(二选一):

  • 方式1:环境变量注入(推荐,免挂载):

    • ONEX_OMS_KVSTORE_STORAGE=base_kvstore_redis
    • ONEX_OMS_KVSTORE_REDIS_CONFIG=r-xxxxx.redis.rds.aliyuncs.com:6379
    • ONEX_OMS_CACHE_STORAGE=base_cache_redis
    • ONEX_OMS_CACHE_REDIS_CONFIG=r-xxxxx.redis.rds.aliyuncs.com:6379:1
  • 方式2:config.php 内 define(需挂载 config.php):

    php
    define('KVSTORE_REDIS_CONFIG', 'r-xxxxx.redis.rds.aliyuncs.com:6379');
    define('CACHE_REDIS_CONFIG', 'r-xxxxx.redis.rds.aliyuncs.com:6379:1');

说明

  • 如确需 Memcached,可在聚石塔或对应云服务上配置后填入 CACHE_MEMCACHED_CONFIG,但推荐直接使用 Redis。

配置文件挂载说明

重要:以下配置挂载策略按是否使用环境变量区分:

  1. 系统配置文件

    • 若全部配置通过环境变量注入,则 config/config.php 可不挂载(容器内默认文件即可)。
    • 如果需要持久化本地配置文件,挂载 config/config.phpconfig/install.lock.php
  2. 任务管理配置文件

    • app/taskmgr/config/config.php 必须挂载(任务服务不支持环境变量注入该配置)。
  3. 数据目录和日志目录(可选,可以不挂载)

    • data/:数据目录(缓存、日志等)
    • logs/:日志目录
    • 不挂载则数据在容器内,删除容器会丢失;生产建议至少保留日志或接入外部日志服务。

环境变量示例(聚石塔,推荐)

sh
# 数据库
ONEX_OMS_DB_HOST=rm-xxxxx.mysql.rds.aliyuncs.com
ONEX_OMS_DB_USER=oms_user
ONEX_OMS_DB_PASSWORD=your_password
ONEX_OMS_DB_NAME=oms

# Redis(KV / Cache)
ONEX_OMS_KVSTORE_STORAGE=base_kvstore_redis
ONEX_OMS_KVSTORE_REDIS_CONFIG=r-xxxxx.redis.rds.aliyuncs.com:6379
ONEX_OMS_CACHE_STORAGE=base_cache_redis
ONEX_OMS_CACHE_REDIS_CONFIG=r-xxxxx.redis.rds.aliyuncs.com:6379:1

# 安装锁定(生产必须)
ONEX_OMS_INSTALL=LOCK

说明:

  • 使用 env 注入时,可不挂载 config/config.php
  • KV 与 Cache 可共用同一 Redis,也可分库;示例中 Cache 使用 DB=1。
  • 如需 Memcached,设置 ONEX_OMS_CACHE_STORAGE=base_cache_memcachedONEX_OMS_CACHE_MEMCACHED_CONFIG=host:11211

Compose 使用时,直接将上述 env 项填入对应服务的 environment: 段即可,无需重复列出。


☁️ 云平台部署指南

阿里云部署

1. 创建 ECS 实例

  • 操作系统:Alibaba Cloud Linux release 3 (Soaring Falcon)(推荐)
  • 实例规格:建议 4核8GB 起步
  • 网络:配置安全组,开放 80、443、3306、6379、11211 端口

2. 使用 RDS MySQL(强烈推荐)

创建 RDS 实例

  • 登录阿里云控制台,创建 RDS MySQL 实例
  • 选择 MySQL 版本(推荐 8.0)
  • 配置实例规格和存储空间
  • 设置白名单,添加ECS实例的内网IP

⚠️ 重要:配置 sql_mode

  • 进入 RDS 控制台 → 实例管理 → 参数设置
  • 找到 sql_mode 参数,设置为:
    ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  • 保存并重启实例(如需要)

配置连接:同上方“方式1:环境变量”或“方式2:config.php define”二选一,无需重复。

3. 使用 Redis 云数据库(强烈推荐)

创建 Redis 实例

  • 登录阿里云控制台,创建 Redis 实例
  • 选择 Redis 版本(推荐 6.2)
  • 配置实例规格和内存大小
  • 设置白名单,添加ECS实例的内网IP

配置连接:同上方“方式1:环境变量”或“方式2:config.php define”二选一,无需重复。

4. 使用 OSS 存储(可选)

如果需要使用 OSS 存储文件,需要配置存储适配器。

5. 使用 SLB 负载均衡

配置应用服务器为后端服务器,实现高可用。

6. 使用容器服务 ACK

bash
# 使用阿里云容器镜像服务构建镜像
# 推送到 ACR
docker tag oms-app:latest registry.cn-hangzhou.aliyuncs.com/your-namespace/oms-app:latest
docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/oms-app:latest

# 在 ACK 中部署
kubectl apply -f k8s-deployment.yaml

聚石塔部署建议

核心原则:生产环境全部托管在阿里云聚石塔,不自行在容器/虚机内部署数据库和缓存。使用聚石塔提供的 RDS、Redis、OSS、SLB/ALB 等托管能力,确保高可用与可运维性。

  1. 数据库:使用聚石塔 RDS(高可用、自动备份、按时间点恢复、故障切换)
  2. 缓存:使用聚石塔 Redis(持久化、高可用、监控告警、支持集群/读写分离)
  3. Memcached:如确需可开通聚石塔/阿里云 Memcached;优先直接用 Redis
  4. 存储:使用 OSS 存储文件,可结合 CDN 加速
  5. 负载均衡:使用 SLB/ALB 分发流量,启用健康检查与 SSL
  6. 监控:启用云监控与告警,关注 CPU/内存/磁盘/网络及 APM 指标
  7. 备份:开启 RDS 自动备份,配置 OSS 版本/生命周期策略;定期备份配置文件
  8. 安全:最小权限安全组、WAF、HTTPS/SSL、强密码策略,必要时开启访问白名单

⚙️ 部署后配置

PHP 配置优化php.ini):

ini
; 内存限制,单个脚本可使用的最大内存
memory_limit = 128M

; 脚本最大执行时间(秒),0 表示无限制
max_execution_time = 300

; 单个上传文件的最大大小
upload_max_filesize = 64M

; POST 请求的最大大小(应大于等于 upload_max_filesize)
post_max_size = 50M

; 表单提交的最大变量数量
max_input_vars = 5000

; 同时上传文件的最大数量
max_file_uploads = 20

❓ 常见问题

部署问题

Q: 容器启动后无法访问?

A: 检查:

  1. 容器是否正常运行:docker ps
  2. 端口映射是否正确:docker port oms-app
  3. 防火墙是否开放端口
  4. 查看容器日志:docker logs oms-app

Q: 配置文件挂载后不生效?

A: 检查:

  1. 文件路径是否正确
  2. 文件权限是否正确(容器内用户可读)
  3. 容器是否重启:docker restart oms-app

Q: 数据库连接失败?

A: 检查:

  1. 数据库服务是否运行
  2. 数据库用户权限是否正确
  3. 网络是否连通(容器部署时检查网络配置)
  4. 配置文件中的数据库地址是否正确

Q: Redis/Memcached 连接失败?

A: 检查:

  1. 服务是否运行
  2. 端口是否开放
  3. 配置文件中的地址是否正确(容器部署时使用服务名)
  4. 网络是否连通

性能问题

Q: 系统响应慢?

A: 优化建议:

  1. 启用 Memcached 缓存
  2. 优化数据库查询
  3. 增加 PHP-FPM 进程数
  4. 使用 Redis 作为 KV 存储
  5. 启用 OPcache

Q: 内存占用高?

A: 优化建议:

  1. 调整 PHP memory_limit
  2. 优化代码,减少内存使用
  3. 定期清理缓存和日志
  4. 增加服务器内存

安全问题

Q: 如何防止未授权访问?

A: 安全措施:

  1. 配置防火墙,只开放必要端口
  2. 使用 SSL 证书(HTTPS)
  3. 配置强密码策略
  4. 定期更新系统和依赖
  5. 配置 WAF(Web 应用防火墙)

Q: 如何备份数据?

A: 备份方案:

  1. 数据库备份:使用 mysqldump 或云数据库备份功能
  2. 配置文件备份:定期备份 config/ 目录
  3. 数据目录备份:定期备份 data/ 目录

祝部署顺利! 🚀


最后更新:2025年11月2日
版本:1.0