原 聊天服务器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参数
推荐内容