服务配置修改
This commit is contained in:
@@ -1,118 +0,0 @@
|
||||
# ====================================
|
||||
# 后端基础镜像 - Base Serv
|
||||
# 包含:JRE + Python + 系统工具 + 爬虫依赖
|
||||
# 用途:作为后端服务镜像的基础,避免每次都安装依赖
|
||||
# ====================================
|
||||
FROM eclipse-temurin:21-jre
|
||||
|
||||
# 设置环境变量
|
||||
ENV LANG=C.UTF-8 \
|
||||
LC_ALL=C.UTF-8 \
|
||||
TZ=Asia/Shanghai \
|
||||
PYTHONUNBUFFERED=1 \
|
||||
PYTHONIOENCODING=UTF-8 \
|
||||
PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple \
|
||||
PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn
|
||||
|
||||
# 安装系统依赖和工具
|
||||
RUN apt-get update && \
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||
# Python环境
|
||||
python3 \
|
||||
python3-pip \
|
||||
python3-venv \
|
||||
python3-dev \
|
||||
# 编译工具
|
||||
build-essential \
|
||||
# 网络和诊断工具
|
||||
netcat-traditional \
|
||||
curl \
|
||||
wget \
|
||||
dnsutils \
|
||||
iputils-ping \
|
||||
# 系统工具
|
||||
procps \
|
||||
htop \
|
||||
vim \
|
||||
less \
|
||||
# 数据库客户端
|
||||
default-mysql-client \
|
||||
# 字体和图形库
|
||||
fonts-liberation \
|
||||
fonts-noto-color-emoji \
|
||||
fonts-noto-cjk \
|
||||
# Chrome依赖
|
||||
libxss1 \
|
||||
libx11-xcb1 \
|
||||
libxcb1 \
|
||||
libxcomposite1 \
|
||||
libxcursor1 \
|
||||
libxdamage1 \
|
||||
libxi6 \
|
||||
libxtst6 \
|
||||
libnss3 \
|
||||
libcups2 \
|
||||
libxrandr2 \
|
||||
libasound2t64 \
|
||||
libatk1.0-0 \
|
||||
libatk-bridge2.0-0 \
|
||||
libpangocairo-1.0-0 \
|
||||
libgtk-3-0 \
|
||||
# 图片处理
|
||||
libjpeg-dev \
|
||||
zlib1g-dev \
|
||||
libpng-dev \
|
||||
# 其他依赖
|
||||
libffi-dev \
|
||||
libssl-dev \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
|
||||
&& echo "Asia/Shanghai" > /etc/timezone
|
||||
|
||||
# 设置Python3为默认Python
|
||||
RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 1 \
|
||||
&& update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# 配置pip使用清华源
|
||||
RUN mkdir -p /etc/pip && \
|
||||
echo "[global]" > /etc/pip/pip.conf && \
|
||||
echo "index-url = https://pypi.tuna.tsinghua.edu.cn/simple" >> /etc/pip/pip.conf && \
|
||||
echo "trusted-host = pypi.tuna.tsinghua.edu.cn" >> /etc/pip/pip.conf
|
||||
|
||||
# 安装常用Python工具和爬虫依赖
|
||||
COPY schoolNewsCrawler/requirements.txt /tmp/requirements.txt
|
||||
|
||||
RUN echo "========================================" && \
|
||||
echo "安装Python爬虫依赖到基础镜像" && \
|
||||
echo "========================================" && \
|
||||
# 直接安装依赖(使用系统pip,不升级以避免破坏系统)
|
||||
python3 -m pip install --no-cache-dir --break-system-packages -r /tmp/requirements.txt && \
|
||||
# 清理缓存
|
||||
python3 -m pip cache purge && \
|
||||
# 验证安装
|
||||
echo "" && \
|
||||
echo "✅ 爬虫依赖安装完成" && \
|
||||
python3 -m pip list | grep -E "(beautifulsoup4|crawl4ai|selenium|pydantic|requests|loguru)" && \
|
||||
# 清理临时文件
|
||||
rm -f /tmp/requirements.txt
|
||||
|
||||
# 创建应用目录结构
|
||||
RUN mkdir -p /app/config /app/logs /app/uploads /app/crawler
|
||||
|
||||
# 健康检查
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
||||
CMD curl -f http://localhost:8080/actuator/health || exit 1
|
||||
|
||||
# 镜像元数据
|
||||
LABEL maintainer="School News Team" \
|
||||
description="Base image for school-news backend service with Python dependencies" \
|
||||
version="1.0"
|
||||
|
||||
# 暴露端口(文档用途)
|
||||
EXPOSE 8081
|
||||
|
||||
# 默认命令(会被子镜像覆盖)
|
||||
CMD ["echo", "This is base image, please use school-news-serv image"]
|
||||
@@ -1,112 +0,0 @@
|
||||
# 校园新闻管理系统 - MySQL数据库镜像
|
||||
# 基于reInit.sh的数据库初始化方案
|
||||
FROM mysql:8.0
|
||||
|
||||
# 设置环境变量
|
||||
ENV LANG=C.UTF-8 \
|
||||
TZ=Asia/Shanghai
|
||||
|
||||
# 注意:MySQL配置有两种方式
|
||||
# 1. 通过docker-compose.yml的command参数(基础配置)
|
||||
# 2. 通过挂载my.cnf文件(高级配置,可选)
|
||||
# docker-compose.yml中可以取消注释: ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
|
||||
|
||||
# 创建SQL目录
|
||||
RUN mkdir -p /docker-entrypoint-initdb.d /opt/sql
|
||||
|
||||
# 复制所有SQL文件(保持目录结构)
|
||||
COPY schoolNewsServ/.bin/mysql/sql/ /opt/sql/
|
||||
|
||||
# 复制并调整reInit.sh为Docker环境,设置执行权限
|
||||
COPY schoolNewsServ/.bin/mysql/sql/reInit.sh /opt/sql/
|
||||
RUN sed -i 's/DB_HOST="localhost"/DB_HOST="localhost"/' /opt/sql/reInit.sh && \
|
||||
sed -i 's/DB_PORT="3306"/DB_PORT="3306"/' /opt/sql/reInit.sh && \
|
||||
sed -i 's/DB_USER="root"/DB_USER="root"/' /opt/sql/reInit.sh && \
|
||||
sed -i 's/DB_PASSWORD="123456"/DB_PASSWORD="${MYSQL_ROOT_PASSWORD}"/' /opt/sql/reInit.sh && \
|
||||
sed -i 's/DB_NAME="school_news"/DB_NAME="${MYSQL_DATABASE}"/' /opt/sql/reInit.sh && \
|
||||
sed -i 's|LOG_FILE="$SCRIPT_DIR/reInit.log"|LOG_FILE="/tmp/reInit.log"|' /opt/sql/reInit.sh && \
|
||||
chmod +x /opt/sql/reInit.sh && \
|
||||
chmod +x /opt/sql/sensitiveData/importSensitiveWords.sh
|
||||
# 创建Docker初始化适配脚本
|
||||
RUN cat > /docker-entrypoint-initdb.d/01-init-database.sh <<'EOF'
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
echo "=========================================="
|
||||
echo "校园新闻管理系统 - 数据库初始化"
|
||||
echo "使用 reInit.sh + Docker配置更新"
|
||||
echo "=========================================="
|
||||
|
||||
# 等待MySQL完全启动
|
||||
echo "等待MySQL启动..."
|
||||
until mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "SELECT 1" >/dev/null 2>&1; do
|
||||
sleep 1
|
||||
done
|
||||
echo "MySQL已就绪"
|
||||
|
||||
# 切换到SQL目录
|
||||
cd /opt/sql
|
||||
|
||||
# 设置环境变量供reInit.sh使用
|
||||
export DB_HOST="localhost"
|
||||
export DB_PORT="3306"
|
||||
export DB_USER="root"
|
||||
export DB_PASSWORD="${MYSQL_ROOT_PASSWORD}"
|
||||
export DB_NAME="${MYSQL_DATABASE}"
|
||||
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD}"
|
||||
|
||||
# Source reInit.sh并调用其初始化函数
|
||||
echo "执行数据库初始化(使用reInit.sh)..."
|
||||
source reInit.sh
|
||||
|
||||
# 调用reInit.sh的核心函数(跳过备份和删除)
|
||||
execute_init_script # 执行initAll.sql
|
||||
import_sensitive_words # 导入敏感词
|
||||
|
||||
# Docker环境特定配置:更新爬虫路径并标记初始化状态
|
||||
echo "更新Docker环境配置..."
|
||||
mysql -uroot "${MYSQL_DATABASE}" <<EOSQL
|
||||
-- 确保初始化标记表存在
|
||||
CREATE TABLE IF NOT EXISTS _db_init_status (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
script_name VARCHAR(255) NOT NULL UNIQUE,
|
||||
executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
status VARCHAR(50) DEFAULT 'init'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 确保有一条当前脚本的记录
|
||||
INSERT IGNORE INTO _db_init_status (script_name) VALUES ('01-init-database.sql');
|
||||
|
||||
-- 更新爬虫配置为Docker容器内路径
|
||||
UPDATE tb_sys_config
|
||||
SET config_value = '/usr/bin/python3'
|
||||
WHERE config_key = 'crawler.pythonPath';
|
||||
|
||||
UPDATE tb_sys_config
|
||||
SET config_value = '/app/crawler'
|
||||
WHERE config_key = 'crawler.basePath';
|
||||
|
||||
-- 将初始化状态标记为 success,供 healthcheck 使用
|
||||
UPDATE _db_init_status
|
||||
SET status = 'success'
|
||||
WHERE script_name = '01-init-database.sql';
|
||||
|
||||
SELECT '✅ 数据库初始化完成!' AS message;
|
||||
SELECT '默认用户: admin, 密码: 123456' AS tip;
|
||||
SELECT '爬虫配置已更新为Docker容器路径' AS docker_config;
|
||||
EOSQL
|
||||
|
||||
echo "=========================================="
|
||||
echo "✅ 初始化完成!"
|
||||
echo "=========================================="
|
||||
EOF
|
||||
|
||||
# 设置执行权限
|
||||
RUN chmod +x /docker-entrypoint-initdb.d/01-init-database.sh
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE 3306
|
||||
|
||||
# 健康检查
|
||||
HEALTHCHECK --interval=10s --timeout=5s --retries=5 --start-period=30s \
|
||||
CMD mysqladmin ping -h localhost -p${MYSQL_ROOT_PASSWORD} || exit 1
|
||||
@@ -1,36 +0,0 @@
|
||||
# ====================================
|
||||
# 后端服务镜像 - School News Serv
|
||||
# 直接从主机复制构建好的JAR包
|
||||
# 注意:使用前需要先执行build.sh构建JAR包
|
||||
# ====================================
|
||||
FROM school-news-base-serv:latest
|
||||
|
||||
# 设置工作目录
|
||||
WORKDIR /app
|
||||
|
||||
# 1. 复制不经常变化的文件
|
||||
# 复制启动脚本
|
||||
COPY schoolNewsServ/docker/start.sh /app/start.sh
|
||||
# 复制爬虫脚本(基础镜像已安装依赖)
|
||||
COPY schoolNewsCrawler/ /app/crawler/
|
||||
# 复制默认配置文件
|
||||
COPY schoolNewsServ/admin/src/main/resources/application.yml /app/config/application.yml.template
|
||||
COPY schoolNewsServ/admin/src/main/resources/log4j2-spring.xml /app/config/log4j2-spring.xml.template
|
||||
|
||||
# 2. 设置脚本权限和创建目录
|
||||
RUN chmod +x /app/start.sh && \
|
||||
mkdir -p /app/logs
|
||||
|
||||
# 3. 最后复制JAR包(这行变化最频繁,放在最后)
|
||||
# 注意:这里假设JAR包已经通过build.sh构建在target目录下
|
||||
COPY schoolNewsServ/admin/target/admin-*.jar /app/app.jar
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE 8081
|
||||
|
||||
# 健康检查
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
||||
CMD curl -f http://localhost:8081/schoolNewsServ/actuator/health || exit 1
|
||||
|
||||
# 启动应用
|
||||
ENTRYPOINT ["/app/start.sh"]
|
||||
@@ -1,52 +0,0 @@
|
||||
# ====================================
|
||||
# 前端服务镜像 - School News Web
|
||||
# 使用Node运行Vite预览服务器
|
||||
# 注意:dist目录需要在主机中先构建好
|
||||
# ====================================
|
||||
FROM node:20-alpine
|
||||
|
||||
# 设置环境变量
|
||||
ENV TZ=Asia/Shanghai \
|
||||
NODE_ENV=production \
|
||||
NPM_CONFIG_REGISTRY=https://registry.npmmirror.com
|
||||
|
||||
# 1. 基础系统配置(这层很少变化)
|
||||
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
|
||||
apk update && \
|
||||
apk add --no-cache tzdata bash curl && \
|
||||
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
|
||||
echo "Asia/Shanghai" > /etc/timezone && \
|
||||
# 创建必要目录
|
||||
mkdir -p /app/dist /app/config /app/logs
|
||||
|
||||
# 设置工作目录
|
||||
WORKDIR /app
|
||||
|
||||
# 2. 安装依赖(这层在package*.json不变时会使用缓存)
|
||||
COPY schoolNewsWeb/package*.json ./
|
||||
RUN npm ci --only=production && \
|
||||
npm install -g vite
|
||||
|
||||
# 3. 复制静态配置和启动脚本(这些文件不常变化)
|
||||
COPY schoolNewsWeb/public/app-config.js /app/config/app-config.js.template
|
||||
COPY schoolNewsWeb/docker/start.sh /app/start.sh
|
||||
RUN chmod +x /app/start.sh
|
||||
|
||||
# 4. 复制构建产物(这行变化最频繁,放在最后)
|
||||
# 注意:确保在主机上已经执行过构建(npm run build)
|
||||
COPY schoolNewsWeb/dist/ /app/dist/
|
||||
|
||||
# 5. 确保dist中有默认配置文件
|
||||
RUN if [ ! -f /app/dist/app-config.js ]; then \
|
||||
cp /app/config/app-config.js.template /app/dist/app-config.js; \
|
||||
fi
|
||||
|
||||
# 暴露端口(Vite preview默认4173)
|
||||
EXPOSE 4173
|
||||
|
||||
# 健康检查
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=20s --retries=3 \
|
||||
CMD curl -f http://localhost:4173/ || exit 1
|
||||
|
||||
# 启动应用
|
||||
CMD ["/app/start.sh"]
|
||||
@@ -1,346 +0,0 @@
|
||||
# ================================================
|
||||
# Level 1: 基础设施服务
|
||||
# Nacos, MinIO, Nginx, Jitsi Meet
|
||||
# ================================================
|
||||
|
||||
services:
|
||||
# ====================== Nginx 反向代理 ======================
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
container_name: urban-lifeline-nginx
|
||||
restart: unless-stopped
|
||||
profiles: ["infra", "all"]
|
||||
networks:
|
||||
- urban-lifeline
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/nginx/logs:/var/log/nginx
|
||||
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
- ./nginx/conf.d:/etc/nginx/conf.d:ro
|
||||
# SSL 证书(可选)
|
||||
# - ./nginx/ssl:/etc/nginx/ssl:ro
|
||||
depends_on:
|
||||
- urban-lifeline-serv
|
||||
- urban-lifeline-web
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
|
||||
# ====================== 后端服务 All-in-One ======================
|
||||
urban-lifeline-serv:
|
||||
image: urban-lifeline-serv:${IMAGE_VERSION:-latest}
|
||||
container_name: urban-lifeline-serv
|
||||
restart: unless-stopped
|
||||
profiles: ["infra", "serv", "all"]
|
||||
networks:
|
||||
- urban-lifeline
|
||||
expose:
|
||||
- "8080"
|
||||
- "8081"
|
||||
- "8082"
|
||||
- "8083"
|
||||
- "8084"
|
||||
- "8085"
|
||||
- "8086"
|
||||
- "8087"
|
||||
- "8088"
|
||||
- "8089"
|
||||
- "8090"
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-prod}
|
||||
NACOS_SERVER_ADDR: nacos:8848
|
||||
NACOS_NAMESPACE: ${NACOS_NAMESPACE:-}
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/logs/serv:/app/logs
|
||||
depends_on:
|
||||
nacos:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 180s
|
||||
|
||||
# ====================== 前端服务 All-in-One ======================
|
||||
urban-lifeline-web:
|
||||
image: urban-lifeline-web:${IMAGE_VERSION:-latest}
|
||||
container_name: urban-lifeline-web
|
||||
restart: unless-stopped
|
||||
profiles: ["infra", "web", "all"]
|
||||
networks:
|
||||
- urban-lifeline
|
||||
expose:
|
||||
- "8000"
|
||||
- "8001"
|
||||
- "8002"
|
||||
- "8003"
|
||||
- "8004"
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
SHARED_PORT: 8000
|
||||
PLATFORM_PORT: 8001
|
||||
WORKCASE_PORT: 8002
|
||||
BIDDING_PORT: 8003
|
||||
WORKCASE_WECHAT_PORT: 8004
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/logs/web:/app/logs
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8000/"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
|
||||
# ====================== Nacos 注册中心 ======================
|
||||
nacos:
|
||||
image: nacos/nacos-server:v3.1.0
|
||||
container_name: urban-lifeline-nacos
|
||||
restart: unless-stopped
|
||||
profiles: ["infra", "all"]
|
||||
networks:
|
||||
- urban-lifeline
|
||||
ports:
|
||||
- "8081:8080"
|
||||
- "8848:8848"
|
||||
- "9848:9848"
|
||||
- "9849:9849"
|
||||
environment:
|
||||
MODE: standalone
|
||||
SPRING_DATASOURCE_PLATFORM: mysql
|
||||
MYSQL_SERVICE_HOST: ${MYSQL_HOST:-host.docker.internal}
|
||||
MYSQL_SERVICE_PORT: ${MYSQL_PORT:-3306}
|
||||
MYSQL_SERVICE_DB_NAME: nacos_config
|
||||
MYSQL_SERVICE_USER: ${MYSQL_USER:-root}
|
||||
MYSQL_SERVICE_PASSWORD: ${MYSQL_PASSWORD:-123456}
|
||||
MYSQL_SERVICE_DB_PARAM: allowPublicKeyRetrieval=true&useSSL=false
|
||||
JVM_XMS: 512m
|
||||
JVM_XMX: 512m
|
||||
JVM_XMN: 256m
|
||||
NACOS_AUTH_ENABLE: "false"
|
||||
NACOS_AUTH_TOKEN: ${NACOS_AUTH_TOKEN:-ZlRkR2ZxR3BvZ1F0a3JxY2V6RUx2cUh1Rkx6V1ZQbE9kUVd1R1VOcWFFS2t3dG5hS0E9PQ==}
|
||||
NACOS_AUTH_IDENTITY_KEY: ${NACOS_AUTH_TOKEN:-ZlRkR2ZxR3BvZ1F0a3JxY2V6RUx2cUh1Rkx6V1ZQbE9kUVd1R1VOcWFFS2t3dG5hS0E9PQ==}
|
||||
NACOS_AUTH_IDENTITY_VALUE: ${NACOS_AUTH_TOKEN:-ZlRkR2ZxR3BvZ1F0a3JxY2V6RUx2cUh1Rkx6V1ZQbE9kUVd1R1VOcWFFS2t3dG5hS0E9PQ==}
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/nacos/data:/home/nacos/data
|
||||
- ${DATA_ROOT:-../volumes}/nacos/logs:/home/nacos/logs
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
start_period: 60s
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
|
||||
# ====================== MinIO 对象存储 ======================
|
||||
minio:
|
||||
image: minio/minio:latest
|
||||
container_name: urban-lifeline-minio
|
||||
restart: unless-stopped
|
||||
profiles: ["infra", "all"]
|
||||
networks:
|
||||
- urban-lifeline
|
||||
ports:
|
||||
- "9000:9000"
|
||||
- "9001:9001"
|
||||
environment:
|
||||
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
|
||||
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin123}
|
||||
MINIO_CONSOLE_ADDRESS: ":9001"
|
||||
MINIO_ADDRESS: ":9000"
|
||||
TZ: Asia/Shanghai
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/minio/data:/data
|
||||
- ${DATA_ROOT:-../volumes}/minio/config:/root/.minio
|
||||
command: server /data --console-address ":9001"
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
||||
interval: 30s
|
||||
timeout: 20s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
|
||||
# ====================== Jitsi Meet 视频会议 ======================
|
||||
jitsi-web:
|
||||
image: jitsi/web:stable-9584
|
||||
container_name: urban-lifeline-jitsi-web
|
||||
restart: unless-stopped
|
||||
profiles: ["infra", "jitsi", "all"]
|
||||
networks:
|
||||
- urban-lifeline
|
||||
ports:
|
||||
- "8280:80"
|
||||
- "8443:443"
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
PUBLIC_URL: ${JITSI_PUBLIC_URL:-https://org.xyzh.yslg.jitsi}
|
||||
ENABLE_HTTPS: 0
|
||||
ENABLE_HTTP_REDIRECT: 0
|
||||
DISABLE_HTTPS: 1
|
||||
XMPP_DOMAIN: meet.jitsi
|
||||
XMPP_AUTH_DOMAIN: auth.meet.jitsi
|
||||
XMPP_BOSH_URL_BASE: http://jitsi-prosody:5280
|
||||
XMPP_MUC_DOMAIN: muc.meet.jitsi
|
||||
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
|
||||
XMPP_GUEST_DOMAIN: guest.meet.jitsi
|
||||
JICOFO_COMPONENT_SECRET: jicofo-secret
|
||||
JICOFO_AUTH_USER: focus
|
||||
JVB_AUTH_USER: jvb
|
||||
JVB_AUTH_PASSWORD: jvb-password
|
||||
ENABLE_AUTH: 1
|
||||
ENABLE_GUESTS: 0
|
||||
AUTH_TYPE: jwt
|
||||
JWT_APP_ID: ${JWT_APP_ID:-urbanLifeline}
|
||||
JWT_APP_SECRET: ${JWT_APP_SECRET:-urbanLifeline-jitsi-secret-key-2025-production-safe-hs256}
|
||||
JWT_ACCEPTED_ISSUERS: ${JWT_APP_ID:-urbanLifeline}
|
||||
JWT_ACCEPTED_AUDIENCES: jitsi
|
||||
JWT_ALLOW_EMPTY: 0
|
||||
JWT_AUTH_TYPE: token
|
||||
JWT_TOKEN_AUTH_MODULE: token_verification
|
||||
ENABLE_RECORDING: 0
|
||||
ENABLE_TRANSCRIPTIONS: 0
|
||||
ENABLE_SUBDOMAINS: 0
|
||||
ENABLE_XMPP_WEBSOCKET: 1
|
||||
ENABLE_SCTP: 1
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/web:/config
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/transcripts:/usr/share/jitsi-meet/transcripts
|
||||
depends_on:
|
||||
- jitsi-prosody
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:80/"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
|
||||
jitsi-prosody:
|
||||
image: jitsi/prosody:stable-9584
|
||||
container_name: urban-lifeline-jitsi-prosody
|
||||
restart: unless-stopped
|
||||
profiles: ["infra", "jitsi", "all"]
|
||||
networks:
|
||||
- urban-lifeline
|
||||
expose:
|
||||
- "5222"
|
||||
- "5347"
|
||||
- "5280"
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
XMPP_DOMAIN: meet.jitsi
|
||||
XMPP_AUTH_DOMAIN: auth.meet.jitsi
|
||||
XMPP_MUC_DOMAIN: muc.meet.jitsi
|
||||
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
|
||||
XMPP_GUEST_DOMAIN: guest.meet.jitsi
|
||||
JICOFO_COMPONENT_SECRET: jicofo-secret
|
||||
JICOFO_AUTH_USER: focus
|
||||
JICOFO_AUTH_PASSWORD: focus-password
|
||||
JVB_AUTH_USER: jvb
|
||||
JVB_AUTH_PASSWORD: jvb-password
|
||||
ENABLE_AUTH: 1
|
||||
ENABLE_GUESTS: 0
|
||||
AUTH_TYPE: jwt
|
||||
JWT_APP_ID: ${JWT_APP_ID:-urbanLifeline}
|
||||
JWT_APP_SECRET: ${JWT_APP_SECRET:-urbanLifeline-jitsi-secret-key-2025-production-safe-hs256}
|
||||
JWT_ACCEPTED_ISSUERS: ${JWT_APP_ID:-urbanLifeline}
|
||||
JWT_ACCEPTED_AUDIENCES: jitsi
|
||||
JWT_ALLOW_EMPTY: 0
|
||||
JWT_AUTH_TYPE: token
|
||||
JWT_TOKEN_AUTH_MODULE: token_verification
|
||||
LOG_LEVEL: info
|
||||
PUBLIC_URL: ${JITSI_PUBLIC_URL:-https://org.xyzh.yslg.jitsi}
|
||||
JWT_DISABLE_AUTO_MODERATOR: true
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/prosody/config:/config
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/prosody/prosody-plugins-custom:/prosody-plugins-custom
|
||||
healthcheck:
|
||||
test: ["CMD", "prosodyctl", "status"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 90s
|
||||
|
||||
jitsi-jicofo:
|
||||
image: jitsi/jicofo:stable-9584
|
||||
container_name: urban-lifeline-jitsi-jicofo
|
||||
restart: unless-stopped
|
||||
profiles: ["infra", "jitsi", "all"]
|
||||
networks:
|
||||
- urban-lifeline
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
XMPP_DOMAIN: meet.jitsi
|
||||
XMPP_AUTH_DOMAIN: auth.meet.jitsi
|
||||
XMPP_MUC_DOMAIN: muc.meet.jitsi
|
||||
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
|
||||
XMPP_SERVER: jitsi-prosody
|
||||
JICOFO_COMPONENT_SECRET: jicofo-secret
|
||||
JICOFO_AUTH_USER: focus
|
||||
JICOFO_AUTH_PASSWORD: focus-password
|
||||
AUTH_TYPE: jwt
|
||||
JVB_BREWERY_MUC: jvbbrewery
|
||||
JICOFO_ENABLE_HEALTH_CHECKS: true
|
||||
JICOFO_ENABLE_AUTO_OWNER: false
|
||||
JICOFO_ENABLE_AUTO_LOGIN: false
|
||||
JICOFO_CONFERENCE_INITIAL_OWNER: ""
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/jicofo:/config
|
||||
depends_on:
|
||||
- jitsi-prosody
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8888/about/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 90s
|
||||
|
||||
jitsi-jvb:
|
||||
image: jitsi/jvb:stable-9584
|
||||
container_name: urban-lifeline-jitsi-jvb
|
||||
restart: unless-stopped
|
||||
profiles: ["infra", "jitsi", "all"]
|
||||
networks:
|
||||
- urban-lifeline
|
||||
ports:
|
||||
- "10000:10000/udp"
|
||||
- "4443:4443/tcp"
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
XMPP_DOMAIN: meet.jitsi
|
||||
XMPP_AUTH_DOMAIN: auth.meet.jitsi
|
||||
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
|
||||
XMPP_SERVER: jitsi-prosody
|
||||
JVB_AUTH_USER: jvb
|
||||
JVB_AUTH_PASSWORD: jvb-password
|
||||
JVB_BREWERY_MUC: jvbbrewery
|
||||
JVB_PORT: 10000
|
||||
JVB_STUN_SERVERS: stun.l.google.com:19302,stun1.l.google.com:19302
|
||||
DOCKER_HOST_ADDRESS: ${JVB_HOST_ADDRESS:-192.168.0.253}
|
||||
JVB_ADVERTISE_IPS: ${JVB_HOST_ADDRESS:-192.168.0.253}
|
||||
JVB_ENABLE_APIS: rest,colibri
|
||||
JVB_TCP_HARVESTER_DISABLED: "false"
|
||||
JVB_TCP_PORT: 4443
|
||||
JVB_TCP_MAPPED_PORT: 4443
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/jvb:/config
|
||||
depends_on:
|
||||
- jitsi-prosody
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8080/about/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 90s
|
||||
|
||||
networks:
|
||||
urban-lifeline:
|
||||
external: true
|
||||
@@ -1,131 +0,0 @@
|
||||
# ================================================
|
||||
# Urban Lifeline - 站点配置 (All-in-One 模式)
|
||||
# ================================================
|
||||
|
||||
# 上游服务定义 - 后端 All-in-One 容器
|
||||
upstream gateway {
|
||||
server urban-lifeline-serv:8080;
|
||||
keepalive 32;
|
||||
}
|
||||
|
||||
# 上游服务定义 - 前端 All-in-One 容器
|
||||
upstream shared {
|
||||
server urban-lifeline-web:8000;
|
||||
}
|
||||
|
||||
upstream platform {
|
||||
server urban-lifeline-web:8001;
|
||||
}
|
||||
|
||||
upstream workcase-web {
|
||||
server urban-lifeline-web:8002;
|
||||
}
|
||||
|
||||
upstream bidding-web {
|
||||
server urban-lifeline-web:8003;
|
||||
}
|
||||
|
||||
upstream workcase-wechat {
|
||||
server urban-lifeline-web:8004;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
# 健康检查端点
|
||||
location /health {
|
||||
access_log off;
|
||||
return 200 "healthy\n";
|
||||
add_header Content-Type text/plain;
|
||||
}
|
||||
|
||||
# ====================== 前端应用代理 ======================
|
||||
|
||||
# Shared 公共模块 (Module Federation 远程模块)
|
||||
location /shared/ {
|
||||
proxy_pass http://shared/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# 允许跨域 (Module Federation 需要)
|
||||
add_header Access-Control-Allow-Origin *;
|
||||
add_header Access-Control-Allow-Methods "GET, OPTIONS";
|
||||
add_header Access-Control-Allow-Headers "Origin, Content-Type, Accept";
|
||||
}
|
||||
|
||||
# Platform 管理平台
|
||||
location /platform/ {
|
||||
proxy_pass http://platform/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# Workcase 工单系统 PC端
|
||||
location /workcase/ {
|
||||
proxy_pass http://workcase-web/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# Bidding 招标系统
|
||||
location /bidding/ {
|
||||
proxy_pass http://bidding-web/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# Workcase 工单系统微信端
|
||||
location /workcase-wechat/ {
|
||||
proxy_pass http://workcase-wechat/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# 默认首页(重定向到 platform)
|
||||
location = / {
|
||||
return 302 /platform/;
|
||||
}
|
||||
|
||||
# ====================== API 代理 ======================
|
||||
|
||||
# 后端 API 代理
|
||||
location /urban-lifeline/ {
|
||||
proxy_pass http://gateway/urban-lifeline/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# WebSocket 支持
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
|
||||
# 超时设置
|
||||
proxy_connect_timeout 60s;
|
||||
proxy_send_timeout 60s;
|
||||
proxy_read_timeout 60s;
|
||||
}
|
||||
|
||||
# ====================== 错误页面 ======================
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html {
|
||||
root /usr/share/nginx/html;
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
# ================================================
|
||||
# Urban Lifeline - Nginx 主配置
|
||||
# ================================================
|
||||
|
||||
user nginx;
|
||||
worker_processes auto;
|
||||
error_log /var/log/nginx/error.log warn;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
use epoll;
|
||||
multi_accept on;
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
# 日志格式
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
# 性能优化
|
||||
sendfile on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
||||
keepalive_timeout 65;
|
||||
types_hash_max_size 2048;
|
||||
|
||||
# Gzip 压缩
|
||||
gzip on;
|
||||
gzip_vary on;
|
||||
gzip_proxied any;
|
||||
gzip_comp_level 6;
|
||||
gzip_types text/plain text/css text/xml application/json application/javascript
|
||||
application/xml application/xml+rss text/javascript application/x-javascript;
|
||||
|
||||
# 上传文件大小限制
|
||||
client_max_body_size 100M;
|
||||
|
||||
# 引入站点配置
|
||||
include /etc/nginx/conf.d/*.conf;
|
||||
}
|
||||
62
docker/jitsi/.env.example
Normal file
62
docker/jitsi/.env.example
Normal file
@@ -0,0 +1,62 @@
|
||||
# ================================================
|
||||
# Jitsi Meet - 环境变量配置
|
||||
# 复制此文件为 .env 并修改配置
|
||||
# ================================================
|
||||
|
||||
# 时区
|
||||
TZ=Asia/Shanghai
|
||||
|
||||
# 数据目录
|
||||
DATA_ROOT=../volumes
|
||||
|
||||
# ==================== 镜像版本 ====================
|
||||
JITSI_IMAGE_TAG=stable-9584
|
||||
|
||||
# ==================== 公网访问 ====================
|
||||
# Jitsi 公网访问地址 (必须配置)
|
||||
JITSI_PUBLIC_URL=https://meet.example.com
|
||||
|
||||
# JVB 公网 IP (必须配置,用于 WebRTC 媒体流)
|
||||
JVB_HOST_ADDRESS=192.168.0.253
|
||||
|
||||
# ==================== 端口配置 ====================
|
||||
# Web 端口
|
||||
JITSI_WEB_HTTP_PORT=8280
|
||||
JITSI_WEB_HTTPS_PORT=8443
|
||||
|
||||
# JVB 端口 (UDP 用于媒体流,TCP 用于备用)
|
||||
JVB_PORT=10000
|
||||
JVB_TCP_PORT=4443
|
||||
|
||||
# ==================== JWT 认证 ====================
|
||||
# JWT App ID (与后端服务保持一致)
|
||||
JWT_APP_ID=urbanLifeline
|
||||
|
||||
# JWT 密钥 (生产环境必须修改!)
|
||||
JWT_APP_SECRET=your-jwt-secret-key-change-in-production
|
||||
|
||||
# ==================== 功能开关 ====================
|
||||
# 是否启用认证 (1=启用, 0=禁用)
|
||||
JITSI_ENABLE_AUTH=1
|
||||
|
||||
# 是否允许访客 (1=允许, 0=禁止)
|
||||
JITSI_ENABLE_GUESTS=0
|
||||
|
||||
# 是否启用 HTTPS (容器内)
|
||||
JITSI_ENABLE_HTTPS=0
|
||||
JITSI_DISABLE_HTTPS=1
|
||||
|
||||
# 是否启用录制
|
||||
JITSI_ENABLE_RECORDING=0
|
||||
|
||||
# 日志级别
|
||||
JITSI_LOG_LEVEL=info
|
||||
|
||||
# ==================== 组件密码 ====================
|
||||
# 内部组件认证密码 (生产环境建议修改)
|
||||
JICOFO_COMPONENT_SECRET=jicofo-secret
|
||||
JICOFO_AUTH_PASSWORD=focus-password
|
||||
JVB_AUTH_PASSWORD=jvb-password
|
||||
|
||||
# ==================== STUN 服务器 ====================
|
||||
JVB_STUN_SERVERS=stun.l.google.com:19302,stun1.l.google.com:19302
|
||||
198
docker/jitsi/docker-compose.yml
Normal file
198
docker/jitsi/docker-compose.yml
Normal file
@@ -0,0 +1,198 @@
|
||||
# ================================================
|
||||
# Jitsi Meet 视频会议服务
|
||||
#
|
||||
# 使用方式:
|
||||
# docker compose up -d
|
||||
#
|
||||
# 环境变量配置:
|
||||
# 复制 .env.example 为 .env 并修改
|
||||
# ================================================
|
||||
|
||||
services:
|
||||
# ====================== Jitsi Web ======================
|
||||
jitsi-web:
|
||||
image: jitsi/web:${JITSI_IMAGE_TAG:-stable-9584}
|
||||
container_name: urban-lifeline-jitsi-web
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- urban-lifeline
|
||||
ports:
|
||||
- "${JITSI_WEB_HTTP_PORT:-8280}:80"
|
||||
- "${JITSI_WEB_HTTPS_PORT:-8443}:443"
|
||||
environment:
|
||||
TZ: ${TZ:-Asia/Shanghai}
|
||||
PUBLIC_URL: ${JITSI_PUBLIC_URL:-https://meet.example.com}
|
||||
ENABLE_HTTPS: ${JITSI_ENABLE_HTTPS:-0}
|
||||
ENABLE_HTTP_REDIRECT: 0
|
||||
DISABLE_HTTPS: ${JITSI_DISABLE_HTTPS:-1}
|
||||
# XMPP 配置
|
||||
XMPP_DOMAIN: meet.jitsi
|
||||
XMPP_AUTH_DOMAIN: auth.meet.jitsi
|
||||
XMPP_BOSH_URL_BASE: http://jitsi-prosody:5280
|
||||
XMPP_MUC_DOMAIN: muc.meet.jitsi
|
||||
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
|
||||
XMPP_GUEST_DOMAIN: guest.meet.jitsi
|
||||
# 组件认证
|
||||
JICOFO_COMPONENT_SECRET: ${JICOFO_COMPONENT_SECRET:-jicofo-secret}
|
||||
JICOFO_AUTH_USER: focus
|
||||
JVB_AUTH_USER: jvb
|
||||
JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD:-jvb-password}
|
||||
# JWT 认证
|
||||
ENABLE_AUTH: ${JITSI_ENABLE_AUTH:-1}
|
||||
ENABLE_GUESTS: ${JITSI_ENABLE_GUESTS:-0}
|
||||
AUTH_TYPE: jwt
|
||||
JWT_APP_ID: ${JWT_APP_ID:-urbanLifeline}
|
||||
JWT_APP_SECRET: ${JWT_APP_SECRET:-your-jwt-secret-key-change-in-production}
|
||||
JWT_ACCEPTED_ISSUERS: ${JWT_APP_ID:-urbanLifeline}
|
||||
JWT_ACCEPTED_AUDIENCES: jitsi
|
||||
JWT_ALLOW_EMPTY: 0
|
||||
JWT_AUTH_TYPE: token
|
||||
JWT_TOKEN_AUTH_MODULE: token_verification
|
||||
# 功能开关
|
||||
ENABLE_RECORDING: ${JITSI_ENABLE_RECORDING:-0}
|
||||
ENABLE_TRANSCRIPTIONS: 0
|
||||
ENABLE_SUBDOMAINS: 0
|
||||
ENABLE_XMPP_WEBSOCKET: 1
|
||||
ENABLE_SCTP: 1
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/web:/config
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/transcripts:/usr/share/jitsi-meet/transcripts
|
||||
depends_on:
|
||||
- jitsi-prosody
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:80/"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
|
||||
# ====================== Jitsi Prosody (XMPP) ======================
|
||||
jitsi-prosody:
|
||||
image: jitsi/prosody:${JITSI_IMAGE_TAG:-stable-9584}
|
||||
container_name: urban-lifeline-jitsi-prosody
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- urban-lifeline
|
||||
expose:
|
||||
- "5222"
|
||||
- "5347"
|
||||
- "5280"
|
||||
environment:
|
||||
TZ: ${TZ:-Asia/Shanghai}
|
||||
PUBLIC_URL: ${JITSI_PUBLIC_URL:-https://meet.example.com}
|
||||
# XMPP 配置
|
||||
XMPP_DOMAIN: meet.jitsi
|
||||
XMPP_AUTH_DOMAIN: auth.meet.jitsi
|
||||
XMPP_MUC_DOMAIN: muc.meet.jitsi
|
||||
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
|
||||
XMPP_GUEST_DOMAIN: guest.meet.jitsi
|
||||
# 组件认证
|
||||
JICOFO_COMPONENT_SECRET: ${JICOFO_COMPONENT_SECRET:-jicofo-secret}
|
||||
JICOFO_AUTH_USER: focus
|
||||
JICOFO_AUTH_PASSWORD: ${JICOFO_AUTH_PASSWORD:-focus-password}
|
||||
JVB_AUTH_USER: jvb
|
||||
JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD:-jvb-password}
|
||||
# JWT 认证
|
||||
ENABLE_AUTH: ${JITSI_ENABLE_AUTH:-1}
|
||||
ENABLE_GUESTS: ${JITSI_ENABLE_GUESTS:-0}
|
||||
AUTH_TYPE: jwt
|
||||
JWT_APP_ID: ${JWT_APP_ID:-urbanLifeline}
|
||||
JWT_APP_SECRET: ${JWT_APP_SECRET:-your-jwt-secret-key-change-in-production}
|
||||
JWT_ACCEPTED_ISSUERS: ${JWT_APP_ID:-urbanLifeline}
|
||||
JWT_ACCEPTED_AUDIENCES: jitsi
|
||||
JWT_ALLOW_EMPTY: 0
|
||||
JWT_AUTH_TYPE: token
|
||||
JWT_TOKEN_AUTH_MODULE: token_verification
|
||||
JWT_DISABLE_AUTO_MODERATOR: true
|
||||
LOG_LEVEL: ${JITSI_LOG_LEVEL:-info}
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/prosody/config:/config
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/prosody/prosody-plugins-custom:/prosody-plugins-custom
|
||||
healthcheck:
|
||||
test: ["CMD", "prosodyctl", "status"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 90s
|
||||
|
||||
# ====================== Jitsi Jicofo (会议焦点) ======================
|
||||
jitsi-jicofo:
|
||||
image: jitsi/jicofo:${JITSI_IMAGE_TAG:-stable-9584}
|
||||
container_name: urban-lifeline-jitsi-jicofo
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- urban-lifeline
|
||||
environment:
|
||||
TZ: ${TZ:-Asia/Shanghai}
|
||||
# XMPP 配置
|
||||
XMPP_DOMAIN: meet.jitsi
|
||||
XMPP_AUTH_DOMAIN: auth.meet.jitsi
|
||||
XMPP_MUC_DOMAIN: muc.meet.jitsi
|
||||
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
|
||||
XMPP_SERVER: jitsi-prosody
|
||||
# 组件认证
|
||||
JICOFO_COMPONENT_SECRET: ${JICOFO_COMPONENT_SECRET:-jicofo-secret}
|
||||
JICOFO_AUTH_USER: focus
|
||||
JICOFO_AUTH_PASSWORD: ${JICOFO_AUTH_PASSWORD:-focus-password}
|
||||
AUTH_TYPE: jwt
|
||||
JVB_BREWERY_MUC: jvbbrewery
|
||||
# 功能配置
|
||||
JICOFO_ENABLE_HEALTH_CHECKS: true
|
||||
JICOFO_ENABLE_AUTO_OWNER: false
|
||||
JICOFO_ENABLE_AUTO_LOGIN: false
|
||||
JICOFO_CONFERENCE_INITIAL_OWNER: ""
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/jicofo:/config
|
||||
depends_on:
|
||||
- jitsi-prosody
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8888/about/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 90s
|
||||
|
||||
# ====================== Jitsi JVB (视频桥接) ======================
|
||||
jitsi-jvb:
|
||||
image: jitsi/jvb:${JITSI_IMAGE_TAG:-stable-9584}
|
||||
container_name: urban-lifeline-jitsi-jvb
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- urban-lifeline
|
||||
ports:
|
||||
- "${JVB_PORT:-10000}:10000/udp"
|
||||
- "${JVB_TCP_PORT:-4443}:4443/tcp"
|
||||
environment:
|
||||
TZ: ${TZ:-Asia/Shanghai}
|
||||
# XMPP 配置
|
||||
XMPP_DOMAIN: meet.jitsi
|
||||
XMPP_AUTH_DOMAIN: auth.meet.jitsi
|
||||
XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi
|
||||
XMPP_SERVER: jitsi-prosody
|
||||
# 组件认证
|
||||
JVB_AUTH_USER: jvb
|
||||
JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD:-jvb-password}
|
||||
JVB_BREWERY_MUC: jvbbrewery
|
||||
# 网络配置
|
||||
JVB_PORT: ${JVB_PORT:-10000}
|
||||
JVB_STUN_SERVERS: ${JVB_STUN_SERVERS:-stun.l.google.com:19302,stun1.l.google.com:19302}
|
||||
DOCKER_HOST_ADDRESS: ${JVB_HOST_ADDRESS}
|
||||
JVB_ADVERTISE_IPS: ${JVB_HOST_ADDRESS}
|
||||
JVB_ENABLE_APIS: rest,colibri
|
||||
JVB_TCP_HARVESTER_DISABLED: "false"
|
||||
JVB_TCP_PORT: ${JVB_TCP_PORT:-4443}
|
||||
JVB_TCP_MAPPED_PORT: ${JVB_TCP_PORT:-4443}
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/jitsi/jvb:/config
|
||||
depends_on:
|
||||
- jitsi-prosody
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8080/about/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 90s
|
||||
|
||||
networks:
|
||||
urban-lifeline:
|
||||
name: urban-lifeline
|
||||
36
docker/minio/.env.example
Normal file
36
docker/minio/.env.example
Normal file
@@ -0,0 +1,36 @@
|
||||
# ================================================
|
||||
# MinIO 配置
|
||||
# 复制此文件为 .env 并修改配置
|
||||
# ================================================
|
||||
|
||||
# ------------------------------
|
||||
# MinIO 版本
|
||||
# ------------------------------
|
||||
MINIO_VERSION=latest
|
||||
|
||||
# ------------------------------
|
||||
# 端口配置
|
||||
# ------------------------------
|
||||
# API 端口
|
||||
MINIO_API_PORT=9000
|
||||
# 控制台端口
|
||||
MINIO_CONSOLE_PORT=9001
|
||||
|
||||
# ------------------------------
|
||||
# 认证配置
|
||||
# ------------------------------
|
||||
MINIO_ROOT_USER=minioadmin
|
||||
MINIO_ROOT_PASSWORD=minioadmin123
|
||||
|
||||
# ------------------------------
|
||||
# 域名配置(可选,用于反向代理)
|
||||
# ------------------------------
|
||||
# 控制台重定向 URL(通过反向代理访问时设置)
|
||||
# MINIO_BROWSER_REDIRECT_URL=https://minio-console.example.com
|
||||
# API 服务 URL(通过反向代理访问时设置)
|
||||
# MINIO_SERVER_URL=https://minio.example.com
|
||||
|
||||
# ------------------------------
|
||||
# 数据目录
|
||||
# ------------------------------
|
||||
DATA_ROOT=../volumes
|
||||
35
docker/minio/docker-compose.yml
Normal file
35
docker/minio/docker-compose.yml
Normal file
@@ -0,0 +1,35 @@
|
||||
services:
|
||||
|
||||
# ====================== MinIO 对象存储 ======================
|
||||
minio:
|
||||
image: minio/minio:${MINIO_VERSION:-latest}
|
||||
container_name: urban-lifeline-minio
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- .env
|
||||
networks:
|
||||
- urban-lifeline
|
||||
ports:
|
||||
- "${MINIO_API_PORT:-9000}:9000"
|
||||
- "${MINIO_CONSOLE_PORT:-9001}:9001"
|
||||
environment:
|
||||
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
|
||||
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin123}
|
||||
MINIO_CONSOLE_ADDRESS: ":9001"
|
||||
MINIO_ADDRESS: ":9000"
|
||||
MINIO_BROWSER_REDIRECT_URL: ${MINIO_BROWSER_REDIRECT_URL:-}
|
||||
MINIO_SERVER_URL: ${MINIO_SERVER_URL:-}
|
||||
TZ: Asia/Shanghai
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/minio/data:/data
|
||||
- ${DATA_ROOT:-../volumes}/minio/config:/root/.minio
|
||||
command: server /data --console-address ":9001"
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
||||
interval: 30s
|
||||
timeout: 20s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
networks:
|
||||
urban-lifeline:
|
||||
name: urban-lifeline
|
||||
50
docker/nacos/.env.example
Normal file
50
docker/nacos/.env.example
Normal file
@@ -0,0 +1,50 @@
|
||||
# ================================================
|
||||
# Nacos 配置
|
||||
# 复制此文件为 .env 并修改配置
|
||||
# ================================================
|
||||
|
||||
# ------------------------------
|
||||
# MySQL 配置
|
||||
# ------------------------------
|
||||
MYSQL_VERSION=8.0
|
||||
MYSQL_ROOT_PASSWORD=root123456
|
||||
MYSQL_USER=nacos
|
||||
MYSQL_PASSWORD=nacos123456
|
||||
# 暴露到主机的端口(避免与主机 MySQL 冲突)
|
||||
MYSQL_EXPOSE_PORT=3307
|
||||
|
||||
# ------------------------------
|
||||
# Nacos 版本和模式
|
||||
# ------------------------------
|
||||
NACOS_VERSION=v3.1.0
|
||||
NACOS_MODE=standalone
|
||||
NACOS_DB_NAME=nacos_config
|
||||
|
||||
# ------------------------------
|
||||
# Nacos 端口配置
|
||||
# ------------------------------
|
||||
NACOS_CONSOLE_PORT=8081
|
||||
NACOS_PORT=8848
|
||||
NACOS_GRPC_PORT=9848
|
||||
NACOS_RAFT_PORT=9849
|
||||
|
||||
# ------------------------------
|
||||
# JVM 配置
|
||||
# ------------------------------
|
||||
NACOS_JVM_XMS=512m
|
||||
NACOS_JVM_XMX=512m
|
||||
NACOS_JVM_XMN=256m
|
||||
|
||||
# ------------------------------
|
||||
# 认证配置
|
||||
# ------------------------------
|
||||
NACOS_AUTH_ENABLE=false
|
||||
# 生产环境请修改以下密钥
|
||||
NACOS_AUTH_TOKEN=ZlRkR2ZxR3BvZ1F0a3JxY2V6RUx2cUh1Rkx6V1ZQbE9kUVd1R1VOcWFFS2t3dG5hS0E9PQ==
|
||||
NACOS_AUTH_IDENTITY_KEY=serverIdentity
|
||||
NACOS_AUTH_IDENTITY_VALUE=security
|
||||
|
||||
# ------------------------------
|
||||
# 数据目录
|
||||
# ------------------------------
|
||||
DATA_ROOT=../volumes
|
||||
76
docker/nacos/docker-compose.yml
Normal file
76
docker/nacos/docker-compose.yml
Normal file
@@ -0,0 +1,76 @@
|
||||
services:
|
||||
# ====================== MySQL 数据库 ======================
|
||||
mysql:
|
||||
image: mysql:${MYSQL_VERSION:-8.0}
|
||||
container_name: urban-lifeline-nacos-mysql
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- urban-lifeline
|
||||
ports:
|
||||
- "${MYSQL_EXPOSE_PORT:-3307}:3306"
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123456}
|
||||
MYSQL_DATABASE: ${NACOS_DB_NAME:-nacos_config}
|
||||
MYSQL_USER: ${MYSQL_USER:-nacos}
|
||||
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-nacos123456}
|
||||
TZ: Asia/Shanghai
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/nacos/mysql:/var/lib/mysql
|
||||
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
|
||||
command:
|
||||
- --character-set-server=utf8mb4
|
||||
- --collation-server=utf8mb4_unicode_ci
|
||||
- --default-authentication-plugin=mysql_native_password
|
||||
healthcheck:
|
||||
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-root123456}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
start_period: 30s
|
||||
|
||||
# ====================== Nacos 注册中心 ======================
|
||||
nacos:
|
||||
image: nacos/nacos-server:${NACOS_VERSION:-v3.1.0}
|
||||
container_name: urban-lifeline-nacos
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- .env
|
||||
networks:
|
||||
- urban-lifeline
|
||||
ports:
|
||||
- "${NACOS_CONSOLE_PORT:-8081}:8081"
|
||||
- "${NACOS_PORT:-8848}:8848"
|
||||
- "${NACOS_GRPC_PORT:-9848}:9848"
|
||||
- "${NACOS_RAFT_PORT:-9849}:9849"
|
||||
environment:
|
||||
MODE: ${NACOS_MODE:-standalone}
|
||||
SPRING_DATASOURCE_PLATFORM: mysql
|
||||
MYSQL_SERVICE_HOST: mysql
|
||||
MYSQL_SERVICE_PORT: 3306
|
||||
MYSQL_SERVICE_DB_NAME: ${NACOS_DB_NAME:-nacos_config}
|
||||
MYSQL_SERVICE_USER: ${MYSQL_USER:-nacos}
|
||||
MYSQL_SERVICE_PASSWORD: ${MYSQL_PASSWORD:-nacos123456}
|
||||
MYSQL_SERVICE_DB_PARAM: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
|
||||
JVM_XMS: ${NACOS_JVM_XMS:-512m}
|
||||
JVM_XMX: ${NACOS_JVM_XMX:-512m}
|
||||
JVM_XMN: ${NACOS_JVM_XMN:-256m}
|
||||
NACOS_AUTH_ENABLE: ${NACOS_AUTH_ENABLE:-false}
|
||||
NACOS_AUTH_TOKEN: ${NACOS_AUTH_TOKEN:-ZlRkR2ZxR3BvZ1F0a3JxY2V6RUx2cUh1Rkx6V1ZQbE9kUVd1R1VOcWFFS2t3dG5hS0E9PQ==}
|
||||
NACOS_AUTH_IDENTITY_KEY: ${NACOS_AUTH_IDENTITY_KEY:-serverIdentity}
|
||||
NACOS_AUTH_IDENTITY_VALUE: ${NACOS_AUTH_IDENTITY_VALUE:-security}
|
||||
volumes:
|
||||
- ${DATA_ROOT:-../volumes}/nacos/data:/home/nacos/data
|
||||
- ${DATA_ROOT:-../volumes}/nacos/logs:/home/nacos/logs
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
start_period: 60s
|
||||
|
||||
networks:
|
||||
urban-lifeline:
|
||||
name: urban-lifeline
|
||||
182
docker/nacos/init.sql
Normal file
182
docker/nacos/init.sql
Normal file
@@ -0,0 +1,182 @@
|
||||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
DROP DATABASE IF EXISTS `nacos_config`;
|
||||
CREATE DATABASE IF NOT EXISTS `nacos_config` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
|
||||
USE `nacos_config`;
|
||||
|
||||
/******************************************/
|
||||
/* 表名称 = config_info */
|
||||
/******************************************/
|
||||
CREATE TABLE `config_info` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||
`data_id` VARCHAR(255) NOT NULL COMMENT 'data_id',
|
||||
`group_id` VARCHAR(128) DEFAULT NULL COMMENT 'group_id',
|
||||
`content` longtext NOT NULL COMMENT 'content',
|
||||
`md5` VARCHAR(32) DEFAULT NULL COMMENT 'md5',
|
||||
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||
`src_user` text COMMENT 'source user',
|
||||
`src_ip` VARCHAR(50) DEFAULT NULL COMMENT 'source ip',
|
||||
`app_name` VARCHAR(128) DEFAULT NULL COMMENT 'app_name',
|
||||
`tenant_id` VARCHAR(128) DEFAULT '' COMMENT '租户字段',
|
||||
`c_desc` VARCHAR(256) DEFAULT NULL COMMENT 'configuration description',
|
||||
`c_use` VARCHAR(64) DEFAULT NULL COMMENT 'configuration usage',
|
||||
`effect` VARCHAR(64) DEFAULT NULL COMMENT '配置生效的描述',
|
||||
`type` VARCHAR(64) DEFAULT NULL COMMENT '配置的类型',
|
||||
`c_schema` text COMMENT '配置的模式',
|
||||
`encrypted_data_key` VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '密钥',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
|
||||
|
||||
/******************************************/
|
||||
/* 表名称 = config_info since 2.5.0 */
|
||||
/******************************************/
|
||||
CREATE TABLE `config_info_gray` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||
`data_id` VARCHAR(255) NOT NULL COMMENT 'data_id',
|
||||
`group_id` VARCHAR(128) NOT NULL COMMENT 'group_id',
|
||||
`content` longtext NOT NULL COMMENT 'content',
|
||||
`md5` VARCHAR(32) DEFAULT NULL COMMENT 'md5',
|
||||
`src_user` text COMMENT 'src_user',
|
||||
`src_ip` VARCHAR(100) DEFAULT NULL COMMENT 'src_ip',
|
||||
`gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_create',
|
||||
`gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_modified',
|
||||
`app_name` VARCHAR(128) DEFAULT NULL COMMENT 'app_name',
|
||||
`tenant_id` VARCHAR(128) DEFAULT '' COMMENT 'tenant_id',
|
||||
`gray_name` VARCHAR(128) NOT NULL COMMENT 'gray_name',
|
||||
`gray_rule` text NOT NULL COMMENT 'gray_rule',
|
||||
`encrypted_data_key` VARCHAR(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`),
|
||||
KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`),
|
||||
KEY `idx_gmt_modified` (`gmt_modified`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='config_info_gray';
|
||||
|
||||
/******************************************/
|
||||
/* 表名称 = config_tags_relation */
|
||||
/******************************************/
|
||||
CREATE TABLE `config_tags_relation` (
|
||||
`id` bigint(20) NOT NULL COMMENT 'id',
|
||||
`tag_name` VARCHAR(128) NOT NULL COMMENT 'tag_name',
|
||||
`tag_type` VARCHAR(64) DEFAULT NULL COMMENT 'tag_type',
|
||||
`data_id` VARCHAR(255) NOT NULL COMMENT 'data_id',
|
||||
`group_id` VARCHAR(128) NOT NULL COMMENT 'group_id',
|
||||
`tenant_id` VARCHAR(128) DEFAULT '' COMMENT 'tenant_id',
|
||||
`nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识',
|
||||
PRIMARY KEY (`nid`),
|
||||
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
|
||||
KEY `idx_tenant_id` (`tenant_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
|
||||
|
||||
/******************************************/
|
||||
/* 表名称 = group_capacity */
|
||||
/******************************************/
|
||||
CREATE TABLE `group_capacity` (
|
||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`group_id` VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
|
||||
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
|
||||
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
|
||||
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
|
||||
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
|
||||
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
|
||||
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
|
||||
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_group_id` (`group_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
|
||||
|
||||
/******************************************/
|
||||
/* 表名称 = his_config_info */
|
||||
/******************************************/
|
||||
CREATE TABLE `his_config_info` (
|
||||
`id` bigint(20) unsigned NOT NULL COMMENT 'id',
|
||||
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识',
|
||||
`data_id` VARCHAR(255) NOT NULL COMMENT 'data_id',
|
||||
`group_id` VARCHAR(128) NOT NULL COMMENT 'group_id',
|
||||
`app_name` VARCHAR(128) DEFAULT NULL COMMENT 'app_name',
|
||||
`content` longtext NOT NULL COMMENT 'content',
|
||||
`md5` VARCHAR(32) DEFAULT NULL COMMENT 'md5',
|
||||
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||
`src_user` text COMMENT 'source user',
|
||||
`src_ip` VARCHAR(50) DEFAULT NULL COMMENT 'source ip',
|
||||
`op_type` char(10) DEFAULT NULL COMMENT 'operation type',
|
||||
`tenant_id` VARCHAR(128) DEFAULT '' COMMENT '租户字段',
|
||||
`encrypted_data_key` VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '密钥',
|
||||
`publish_type` VARCHAR(50) DEFAULT 'formal' COMMENT 'publish type gray or formal',
|
||||
`gray_name` VARCHAR(50) DEFAULT NULL COMMENT 'gray name',
|
||||
`ext_info` longtext DEFAULT NULL COMMENT 'ext info',
|
||||
PRIMARY KEY (`nid`),
|
||||
KEY `idx_gmt_create` (`gmt_create`),
|
||||
KEY `idx_gmt_modified` (`gmt_modified`),
|
||||
KEY `idx_did` (`data_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
|
||||
|
||||
|
||||
/******************************************/
|
||||
/* 表名称 = tenant_capacity */
|
||||
/******************************************/
|
||||
CREATE TABLE `tenant_capacity` (
|
||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`tenant_id` VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
|
||||
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
|
||||
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
|
||||
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
|
||||
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
|
||||
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
|
||||
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
|
||||
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
|
||||
|
||||
|
||||
CREATE TABLE `tenant_info` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||
`kp` VARCHAR(128) NOT NULL COMMENT 'kp',
|
||||
`tenant_id` VARCHAR(128) default '' COMMENT 'tenant_id',
|
||||
`tenant_name` VARCHAR(128) default '' COMMENT 'tenant_name',
|
||||
`tenant_desc` VARCHAR(256) DEFAULT NULL COMMENT 'tenant_desc',
|
||||
`create_source` VARCHAR(32) DEFAULT NULL COMMENT 'create_source',
|
||||
`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
|
||||
`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
|
||||
KEY `idx_tenant_id` (`tenant_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
|
||||
|
||||
CREATE TABLE `users` (
|
||||
`username` VARCHAR(50) NOT NULL PRIMARY KEY COMMENT 'username',
|
||||
`password` VARCHAR(500) NOT NULL COMMENT 'password',
|
||||
`enabled` BOOLEAN NOT NULL COMMENT 'enabled'
|
||||
);
|
||||
|
||||
CREATE TABLE `roles` (
|
||||
`username` VARCHAR(50) NOT NULL COMMENT 'username',
|
||||
`role` VARCHAR(50) NOT NULL COMMENT 'role',
|
||||
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
|
||||
);
|
||||
|
||||
CREATE TABLE `permissions` (
|
||||
`role` VARCHAR(50) NOT NULL COMMENT 'role',
|
||||
`resource` VARCHAR(128) NOT NULL COMMENT 'resource',
|
||||
`action` VARCHAR(8) NOT NULL COMMENT 'action',
|
||||
UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user