原 聊天服务器2
|-转 narj.sh
bash narj.sh ===> 创建外部网络 webproxy ... [+] Running 2/2 ✔ Container nginx-proxy Running 0.0s ✔ Container nginx-acme Running 0.0s [+] Running 3/3 ✔ Container mongo Running 0.0s ✔ Container rocketchat Running 0.0s ✔ Container mongo-init Started 0.1s [+] Running 4/4 ✔ Container jitsi-web Started 0.2s ✔ Container jitsi-prosody Started 0.0s ✔ Container jitsi-jvb Started 0.0s ✔ Container jitsi-jicofo Started 0.0s nginx-proxy nginx-acme rocketchat mongo jitsi-web jitsi-prosody jitsi-jicofo jitsi-jvb ............................................................ ================================================== Rocket.Chat 地址:https://chat.dcdht.com Jitsi Meet 地址:https://meet.dcdht.com ================================================== => 部署 code-server (VS Code Web) ... 请输入 VS Code Web 登录密码(不少于6位): [+] Running 9/9 ✔ vscode Pulled 9.3s ✔ d1da99c2f148 Pull complete 3.1s ✔ 7406571e392a Pull complete 5.7s ✔ 9ab922153835 Pull complete 5.7s ✔ fdf7c3eb3e70 Pull complete 5.7s ✔ 41d9baa20522 Pull complete 5.8s ✔ a87022ba70f0 Pull complete 5.8s ✔ 4974932e2904 Pull complete 8.6s ✔ 4f4fb700ef54 Pull complete 8.6s [+] Running 1/1 ✔ Container vscode Started 0.3s ================================================== VS Code Web 地址:https://vscode.dcdht.com suo you https dou bu neng zheng chuang fang wen , hui bu hui shi wo de bian liang mei huan hao . #!/usr/bin/env bash #================================================== # 一键部署:nginx-proxy + acme-companion + Rocket.Chat + Jitsi Meet + vscode # 项目根目录 $BASE_DIR ;数据、配置、compose 全放 $BASE_DIR 下 #================================================== set -eu ############################ 头部常量区 ############################# DOMAIN_RC="chat.dcdht.com" DOMAIN_JM="meet.dcdht.com" DOMAIN_VSCODE="vscode.dcdht.com" EMAIL="syh0304@gmail.com" # 放在顶部常量区之后 BASE_DIR=${BASE_DIR:-/opt} # 若外部没传,默认 /opt export BASE_DIR # 让 envsubst 也能拿到 ################################################################### # 后面所有 ROOT_DIR_* 直接用 BASE_DIR 拼接即可,无需再导出 ROOT_DIR_PROXY="$BASE_DIR/proxy" ROOT_DIR_RC="$BASE_DIR/rc" ROOT_DIR_JM="$BASE_DIR/jm" ROOT_DIR_VSCODE="$BASE_DIR/vscode" ######################################################################### [[ $EUID -eq 0 ]] || { echo "请 root 运行"; exit 1; } command -v docker >/dev/null || { echo "===> 未检测到 Docker,正在自动安装 ..." curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun systemctl enable --now docker usermod -aG docker $USER exec sg docker -c "bash -c 'docker version >/dev/null 2>&1'" } docker compose version >/dev/null 2>&1 || { echo "未安装 docker-compose-plugin"; exit 1; } echo "===> 创建外部网络 webproxy ..." docker network create webproxy 2>/dev/null || true # 创建目录 mkdir -p "$ROOT_DIR_PROXY" "$ROOT_DIR_RC" "$ROOT_DIR_JM" mkdir -p /data/{rc-db,rc-uploads,jitsi/{web,prosody,jicofo,jvb,transcripts}} #################### 1. 反代 + 自动证书 #################### cat >"$ROOT_DIR_PROXY/dc-proxy.yml" <<'EOF' services: nginx-proxy: image: nginxproxy/nginx-proxy:latest container_name: nginx-proxy ports: ["80:80","443:443"] volumes: - /var/run/docker.sock:/tmp/docker.sock:ro - ./certs:/etc/nginx/certs - ./vhost:/etc/nginx/vhost.d - ./html:/usr/share/nginx/html restart: unless-stopped networks: [webproxy] acme: image: nginxproxy/acme-companion:latest container_name: nginx-acme volumes_from: [nginx-proxy] volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./acme:/etc/acme.sh environment: DEFAULT_EMAIL: ${EMAIL} restart: unless-stopped networks: [webproxy] volumes: {certs,vhost,html,acme} networks: webproxy: external: true EOF export EMAIL envsubst '$EMAIL' <"$ROOT_DIR_PROXY/dc-proxy.yml" >"$ROOT_DIR_PROXY/dc-proxy-env.yml" docker compose -f "$ROOT_DIR_PROXY/dc-proxy-env.yml" up -d #################### 2. Rocket.Chat #################### cat >"$ROOT_DIR_RC/dc-rc.yml" <<'EOF' services: rocketchat: image: rocketchat/rocket.chat:latest container_name: rocketchat environment: VIRTUAL_HOST: ${DOMAIN_RC} LETSENCRYPT_HOST: ${DOMAIN_RC} VIRTUAL_PROTO: websocket VIRTUAL_PORT: 3000 MONGO_URL: mongodb://mongo:27017/rocketchat MONGO_OPLOG_URL: mongodb://mongo:27017/local ROOT_URL: https://${DOMAIN_RC} volumes: - /data/rc-uploads:/app/uploads restart: unless-stopped networks: [webproxy] depends_on: [mongo] mongo: image: mongo:6 container_name: mongo command: mongod --oplogSize 128 --replSet rs0 volumes: - /data/rc-db:/data/db restart: unless-stopped networks: [webproxy] mongo-init: image: mongo:6 container_name: mongo-init command: > bash -c "sleep 5 && mongosh --host mongo --eval ' rs.initiate({_id:\"rs0\",members:[{_id:0,host:\"mongo:27017\"}]})'" depends_on: [mongo] networks: [webproxy] networks: webproxy: external: true EOF export DOMAIN_RC envsubst '$DOMAIN_RC' <"$ROOT_DIR_RC/dc-rc.yml" >"$ROOT_DIR_RC/dc-rc-env.yml" docker compose -f "$ROOT_DIR_RC/dc-rc-env.yml" up -d #################### 3. Jitsi Meet + HTTPS 白屏修复 #################### # ① 先准备“空白放行页”避免 Chrome 140 被踢 mkdir -p $BASE_DIR/jm/web-custom cat >$BASE_DIR/jm/web-custom/recommendedBrowsers.html <<'EOF' EOF cat >"$ROOT_DIR_JM/dc-jm.yml" <<'EOF' services: web: image: jitsi/web:stable container_name: jitsi-web environment: VIRTUAL_HOST: ${DOMAIN_JM} LETSENCRYPT_HOST: ${DOMAIN_JM} PUBLIC_URL: https://${DOMAIN_JM} ENABLE_LETSENCRYPT: 0 JICOFO_AUTH_USER: focus XMPP_DOMAIN: ${DOMAIN_JM} XMPP_AUTH_DOMAIN: auth.${DOMAIN_JM} XMPP_MUC_DOMAIN: muc.${DOMAIN_JM} XMPP_INTERNAL_MUC_DOMAIN: internal-muc.${DOMAIN_JM} TZ: Asia/Shanghai volumes: - /data/jitsi/web:/config - $BASE_DIR/jm/web-custom/recommendedBrowsers.html:/usr/share/jitsi-meet/static/recommendedBrowsers.html:ro restart: unless-stopped networks: [webproxy] depends_on: [prosody] prosody: image: jitsi/prosody:stable container_name: jitsi-prosody environment: XMPP_DOMAIN: ${DOMAIN_JM} XMPP_AUTH_DOMAIN: auth.${DOMAIN_JM} XMPP_MUC_DOMAIN: muc.${DOMAIN_JM} XMPP_INTERNAL_MUC_DOMAIN: internal-muc.${DOMAIN_JM} JICOFO_AUTH_USER: focus JVB_AUTH_USER: jvb GLOBAL_MODULES: "bosh,websocket,smacks" TZ: Asia/Shanghai volumes: - /data/jitsi/prosody:/config restart: unless-stopped networks: [webproxy] jicofo: image: jitsi/jicofo:stable container_name: jitsi-jicofo environment: XMPP_DOMAIN: ${DOMAIN_JM} XMPP_AUTH_DOMAIN: auth.${DOMAIN_JM} XMPP_INTERNAL_MUC_DOMAIN: internal-muc.${DOMAIN_JM} JICOFO_AUTH_USER: focus JVB_AUTH_USER: jvb TZ: Asia/Shanghai depends_on: [prosody] restart: unless-stopped networks: [webproxy] jvb: image: jitsi/jvb:stable container_name: jitsi-jvb environment: XMPP_DOMAIN: ${DOMAIN_JM} XMPP_AUTH_DOMAIN: auth.${DOMAIN_JM} XMPP_INTERNAL_MUC_DOMAIN: internal-muc.${DOMAIN_JM} JVB_AUTH_USER: jvb JVB_BREWERY_MUC: jvbbrewery@internal-muc.${DOMAIN_JM} JVB_PORT: 10000 JVB_TCP_HARVESTER_PORT: 4443 PUBLIC_URL: https://${DOMAIN_JM} TZ: Asia/Shanghai ports: - "10000:10000/udp" - "4443:4443/tcp" volumes: - /data/jitsi/jvb:/config restart: unless-stopped networks: [webproxy] networks: webproxy: external: true EOF export DOMAIN_JM envsubst '$DOMAIN_JM' <"$ROOT_DIR_JM/dc-jm.yml" >"$ROOT_DIR_JM/dc-jm-env.yml" docker compose -f "$ROOT_DIR_JM/dc-jm-env.yml" up -d #################### 4. 开机自启 & 等证书 #################### docker update --restart=unless-stopped nginx-proxy nginx-acme rocketchat mongo jitsi-web jitsi-prosody jitsi-jicofo jitsi-jvb i=0 while (( i++ < 60 )); do if docker logs nginx-acme 2>&1 | grep -q "Certificate received"; then echo "✔ 证书已颁发成功!" break fi echo -n "." sleep 2 done echo echo "==================================================" echo "Rocket.Chat 地址:https://${DOMAIN_RC}" echo "Jitsi Meet 地址:https://${DOMAIN_JM}" echo "==================================================" #################### 5. VS Code Web (code-server) #################### echo "=> 部署 code-server (VS Code Web) ..." mkdir -p $BASE_DIR/vscode/data $BASE_DIR/vscode/config # 交互设置密码 while :; do read -rsp '请输入 VS Code Web 登录密码(不少于6位): ' VSCODE_PW echo if [[ ${#VSCODE_PW} -ge 6 ]]; then break else echo "密码太短,请重新输入!" fi done cat >$BASE_DIR/vscode/config/config.yaml <$BASE_DIR/vscode/dc-vscode.yml <<'EOF' services: vscode: image: codercom/code-server:4.19.1 container_name: vscode environment: VIRTUAL_HOST: ${DOMAIN_VSCODE} LETSENCRYPT_HOST: ${DOMAIN_VSCODE} TZ: Asia/Shanghai volumes: - $BASE_DIR/vscode/config:/home/coder/.config/code-server - $BASE_DIR/vscode/data:/home/coder/data - $BASE_DIR:$BASE_DIR:rw - /code:/code:rw - /data:/data:ro restart: unless-stopped networks: [webproxy] networks: webproxy: external: true EOF # 域名变量(只在这用,可加在脚本头部常量区) export DOMAIN_VSCODE envsubst '$DOMAIN_VSCODE' < $ROOT_DIR_VSCODE/dc-vscode.yml > $ROOT_DIR_VSCODE/dc-vscode-env.yml docker compose -f $ROOT_DIR_VSCODE/dc-vscode-env.yml up -d echo "==================================================" echo "VS Code Web 地址:https://${DOMAIN_VSCODE}" echo "登录密码:${VSCODE_PW}" echo "=================================================="
20250929...
浏览更多内容请先登录。
立即注册
更新于:2025-09-29 22:38:34
相关内容
python and shell
为什么使用副 shell 脚本生成 Python 文件
Shadowsocks服务原理
/dev/null || true bad...">ubuntu uninstall_nvidia.sh bad
开源商城shopwind安装许可协议
Shell脚本学习过程中遇到问题整理
如何检测这种格式知道这个是不合法的CLI参数
推荐内容