Compare commits

...

31 commits

Author SHA1 Message Date
GitHub Action
12f74d47e9 🌐 Weekly translation update - 2025-08-29 03:21:28 2025-08-29 03:21:28 +00:00
科技lion
3841a90467
Enhance kejilion.sh with client config outputs 2025-08-29 09:52:06 +08:00
科技lion
fbdd845fc8
Enhance output for client configurations in kejilion.sh 2025-08-29 09:51:03 +08:00
科技lion
4cf9c4e4c1
Modify peer configuration in kejilion.sh 2025-08-29 09:42:23 +08:00
科技lion
010337cb93
Update kejilion.sh 2025-08-29 09:41:51 +08:00
科技lion
41e3f9bd7e
Modify WireGuard config handling in kejilion.sh
Replace DNS entries and update PersistentKeepalive settings in WireGuard configuration files.
2025-08-29 07:49:36 +08:00
科技lion
accc7e95ca
Update kejilion.sh 2025-08-29 07:48:59 +08:00
科技lion
a4751d4ec4
Change Docker restart policy to always 2025-08-28 12:22:04 +08:00
科技lion
58801f6400
Update kejilion.sh 2025-08-28 12:20:35 +08:00
科技lion
f93a886425
Change WireGuard port and update configuration scripts 2025-08-28 10:03:50 +08:00
科技lion
c8425328c3
Update kejilion.sh 2025-08-28 10:03:15 +08:00
GitHub Action
d357622eeb 🌐 Weekly translation update - 2025-08-28 01:50:11 2025-08-28 01:50:11 +00:00
科技lion
0dd466a8dd
Refactor process termination in kejilion.sh 2025-08-28 07:30:22 +08:00
科技lion
c8de270df5
Update kejilion.sh 2025-08-28 07:29:49 +08:00
GitHub Action
fc5a789c1c 🌐 Weekly translation update - 2025-08-27 10:38:13 2025-08-27 10:38:13 +00:00
科技lion
c3a784790c
Change SERVERPORT environment variable to 51820 2025-08-27 16:11:26 +08:00
科技lion
f51a882677
Change SERVERPORT to a fixed value of 51820 2025-08-27 16:10:49 +08:00
科技lion
9602d5bcc7
Refactor port handling functions in kejilion.sh 2025-08-27 16:03:00 +08:00
科技lion
253672ae1a
Update kejilion.sh 2025-08-27 16:01:55 +08:00
科技lion
cc2b0ba252
Fix formatting and cleanup in kejilion.sh 2025-08-27 14:57:59 +08:00
科技lion
1cef745211
Remove SERVER_ALLOWEDIPS_PEER_myPhone variable 2025-08-27 14:57:13 +08:00
科技lion
b4bd58927e
Update kejilion.sh 2025-08-27 14:56:11 +08:00
科技lion
efcb06f721
Update kejilion.sh 2025-08-27 14:15:15 +08:00
科技lion
42927bdf4d
Update kejilion.sh 2025-08-27 14:14:48 +08:00
科技lion
2cb43e2209
Update kejilion_sh_log.txt 2025-08-27 13:22:11 +08:00
科技lion
578279d323
Update wireguard version and add wireguardc support 2025-08-27 13:19:28 +08:00
科技lion
a29b5fd861
Update kejilion.sh 2025-08-27 13:18:49 +08:00
科技lion
5c984f5fbe
Reorder sed command for admin replacement 2025-08-26 20:59:54 +08:00
科技lion
533eaef84e
Update kejilion.sh 2025-08-26 20:59:23 +08:00
科技lion
34193e4f6b
Add WireGuard setup and configuration options 2025-08-26 18:00:52 +08:00
科技lion
40becc2cb2
Update kejilion.sh 2025-08-26 17:59:45 +08:00
7 changed files with 1889 additions and 360 deletions

View file

@ -1,5 +1,5 @@
#!/bin/bash
sh_v="4.1.1"
sh_v="4.1.2"


gl_hui='\e[37m'
@ -349,22 +349,22 @@ kejilion() {



stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
install lsof
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}


check_port() {
install lsof

stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}

stop_containers_or_kill_process 80
stop_containers_or_kill_process 443
}
@ -2949,7 +2949,7 @@ docker network create $NETWORK_NAME
docker run -d \
--name=node-exporter \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
prom/node-exporter

# Run Prometheus container
@ -2958,7 +2958,7 @@ docker run -d \
-v $PROMETHEUS_DIR/prometheus.yml:/etc/prometheus/prometheus.yml \
-v $PROMETHEUS_DIR/data:/prometheus \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
--user 0:0 \
prom/prometheus:latest

@ -2968,7 +2968,7 @@ docker run -d \
-p ${docker_port}:3000 \
-v $GRAFANA_DIR:/var/lib/grafana \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
grafana/grafana:latest

}
@ -3037,7 +3037,7 @@ f2b_install_sshd() {
-v /path/to/fail2ban/config:/config \
-v /var/log:/var/log:ro \
-v /home/web/log/nginx/:/remotelogs/nginx:ro \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/fail2ban:latest

sleep 3
@ -8874,6 +8874,7 @@ while true; do
echo -e "${gl_kjlan}91. ${color91}gitea私有代码仓库 ${gl_kjlan}92. ${color92}FileBrowser文件管理器"
echo -e "${gl_kjlan}93. ${color93}Dufs极简静态文件服务器 ${gl_kjlan}94. ${color94}Gopeed高速下载工具"
echo -e "${gl_kjlan}95. ${color95}paperless文档管理平台"
echo -e "${gl_kjlan}97. ${color97}WireGuard组网(服务端) ${gl_kjlan}98. ${color98}WireGuard组网(客户端)"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}b. ${gl_bai}备份全部应用数据 ${gl_kjlan}r. ${gl_bai}还原全部应用数据"
echo -e "${gl_kjlan}------------------------"
@ -8998,6 +8999,9 @@ while true; do

docker_rum() {

mkdir -p /home/docker/openlist
chmod -R 777 /home/docker/openlist

docker run -d \
--restart=always \
-v /home/docker/openlist:/opt/openlist/data \
@ -9045,7 +9049,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:ubuntu-kde


@ -9127,7 +9131,7 @@ while true; do
-p 56881:56881/udp \
-v /home/docker/qbittorrent/config:/config \
-v /home/docker/qbittorrent/downloads:/downloads \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/qbittorrent:latest

}
@ -9362,7 +9366,7 @@ while true; do
-p ${docker_port}:5700 \
--name qinglong \
--hostname qinglong \
--restart unless-stopped \
--restart=always \
whyour/qinglong:latest


@ -9428,7 +9432,7 @@ while true; do
-e PGID=1000 \
-v /home/docker/easyimage/config:/app/web/config \
-v /home/docker/easyimage/i:/app/web/i \
--restart unless-stopped \
--restart=always \
ddsderek/easyimage:latest

}
@ -9745,7 +9749,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:latest

}
@ -9808,7 +9812,7 @@ while true; do

docker_rum() {

docker run -d --name dockge --restart unless-stopped -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge
docker run -d --name dockge --restart=always -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge

}

@ -9850,7 +9854,7 @@ while true; do

docker run -d \
--name searxng \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v "/home/docker/searxng:/etc/searxng" \
searxng/searxng
@ -10004,7 +10008,7 @@ while true; do

docker_rum() {

docker run -d --restart unless-stopped \
docker run -d --restart=always \
-p ${docker_port}:3000 \
-v /home/docker/moments/data:/app/data \
-v /etc/localtime:/etc/localtime:ro \
@ -10158,7 +10162,7 @@ while true; do
-e ENCRYPTION_KEY=${ENCRYPTION_KEY} \
-p ${docker_port}:6989 \
-v /home/docker/nexterm:/app/data \
--restart unless-stopped \
--restart=always \
germannewsmaker/nexterm:latest

}
@ -10179,7 +10183,7 @@ while true; do

docker_rum() {

docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbs
docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbs

}

@ -10200,7 +10204,7 @@ while true; do

docker_rum() {

docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbr
docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbr

}

@ -10309,7 +10313,7 @@ while true; do
docker run -d \
--name=node-exporter \
-p ${docker_port}:9100 \
--restart unless-stopped \
--restart=always \
prom/node-exporter


@ -10333,7 +10337,7 @@ while true; do

docker run -d \
--name=cadvisor \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
@ -10704,7 +10708,7 @@ while true; do
local docker_port=8064

docker_rum() {
docker run -d --name it-tools --restart unless-stopped -p ${docker_port}:80 corentinth/it-tools:latest
docker run -d --name it-tools --restart=always -p ${docker_port}:80 corentinth/it-tools:latest
}

local docker_describe="对开发人员和 IT 工作者来说非常有用的工具"
@ -10848,7 +10852,7 @@ while true; do
-p 6199:6199 \
-p 11451:11451 \
-v /home/docker/astrbot/data:/AstrBot/data \
--restart unless-stopped \
--restart=always \
--name astrbot \
soulter/astrbot:latest

@ -10873,7 +10877,7 @@ while true; do

docker run -d \
--name navidrome \
--restart=unless-stopped \
--restart=always \
--user $(id -u):$(id -g) \
-v /home/docker/navidrome/music:/music \
-v /home/docker/navidrome/data:/data \
@ -10935,7 +10939,7 @@ while true; do

docker run -d \
--name libretv \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-e PASSWORD=${app_passwd} \
bestzwei/libretv:latest
@ -10977,9 +10981,9 @@ while true; do

curl -o /home/docker/moontv/docker-compose.yml ${gh_proxy}raw.githubusercontent.com/kejilion/docker/main/moontv-docker-compose.yml
sed -i "s/3000:3000/${docker_port}:3000/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin/${admin}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin_password/${admin_password}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/shouquanma/${shouquanma}/g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin_password|${admin_password}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin|${admin}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|shouquanma|${shouquanma}|g" /home/docker/moontv/docker-compose.yml
cd /home/docker/moontv/
docker compose up -d
clear
@ -11016,7 +11020,7 @@ while true; do

docker run -d \
--name melody \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:5566 \
-v /home/docker/melody/.profile:/app/backend/.profile \
foamzou/melody:latest
@ -11045,7 +11049,7 @@ while true; do
docker_rum() {
docker run -d \
--name dosgame \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:262 \
oldiy/dosgame-web-docker:latest

@ -11075,7 +11079,7 @@ while true; do

docker run -d \
--name xunlei \
--restart unless-stopped \
--restart=always \
--privileged \
-e XL_DASHBOARD_USERNAME=${app_use} \
-e XL_DASHBOARD_PASSWORD=${app_passwd} \
@ -11137,7 +11141,7 @@ while true; do
mkdir -p /home/docker/beszel && \
docker run -d \
--name beszel \
--restart=unless-stopped \
--restart=always \
-v /home/docker/beszel:/beszel_data \
-p ${docker_port}:8090 \
henrygd/beszel
@ -11355,7 +11359,7 @@ while true; do
-v /home/docker/wallos/logos:/var/www/html/images/uploads/logos \
-e TZ=UTC \
-p ${docker_port}:80 \
--restart unless-stopped \
--restart=always \
bellamy/wallos:latest

}
@ -11432,7 +11436,7 @@ while true; do
--mount type=bind,source=/home/docker/jellyfin/media,target=/media \
-p ${docker_port}:8096 \
-p 7359:7359/udp \
--restart=unless-stopped \
--restart=always \
jellyfin/jellyfin


@ -11520,7 +11524,7 @@ while true; do
--name file-code-box \
-p ${docker_port}:12345 \
-v /home/docker/file-code-box/data:/app/data \
--restart unless-stopped \
--restart=always \
lanol/filecodebox:latest

}
@ -11561,7 +11565,7 @@ while true; do
--name matrix \
-v /home/docker/matrix/data:/data \
-p ${docker_port}:8008 \
--restart unless-stopped \
--restart=always \
matrixdotorg/synapse:latest

echo "创建初始用户或管理员。请设置以下内容用户名和密码以及是否为管理员。"
@ -11651,7 +11655,7 @@ while true; do

docker run -d \
--name filebrowser \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v /home/docker/filebrowser/data:/data \
-v /home/docker/filebrowser/config:/config \
@ -11680,14 +11684,14 @@ while true; do

docker run -d \
--name ${docker_name} \
--restart unless-stopped \
--restart=always \
-v /home/docker/${docker_name}:/data \
-p ${docker_port}:5000 \
${docker_img} /data -A

}

local docker_describe="Dufs 极简静态文件服务器,支持上传下载"
local docker_describe="极简静态文件服务器,支持上传下载"
local docker_url="官网介绍: https://github.com/sigoden/dufs"
local docker_use=""
local docker_passwd=""
@ -11710,7 +11714,7 @@ while true; do

docker run -d \
--name ${docker_name} \
--restart unless-stopped \
--restart=always \
-v /home/docker/${docker_name}/downloads:/app/Downloads \
-v /home/docker/${docker_name}/storage:/app/storage \
-p ${docker_port}:9999 \
@ -11718,7 +11722,7 @@ while true; do

}

local docker_describe="Gopeed 分布式高速下载工具,支持多种协议"
local docker_describe="分布式高速下载工具,支持多种协议"
local docker_url="官网介绍: https://github.com/GopeedLab/gopeed"
local docker_use=""
local docker_passwd=""
@ -11776,6 +11780,180 @@ while true; do
;;


97|wgs)

local app_id="97"
local docker_name="wireguard"
local docker_img="lscr.io/linuxserver/wireguard:latest"
local docker_port=8097

docker_rum() {

read -p "请输入组网的客户端数量 (默认 5): " COUNT
COUNT=${COUNT:-5}
read -p "请输入 WireGuard 网段 (默认 10.13.13.0): " NETWORK
NETWORK=${NETWORK:-10.13.13.0}

PEERS=$(seq -f "wg%02g" 1 "$COUNT" | paste -sd,)

ip link delete wg0 &>/dev/null

ip_address
docker run -d \
--name=wireguard \
--network host \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e SERVERURL=${ipv4_address} \
-e SERVERPORT=51820 \
-e PEERS=${PEERS} \
-e INTERNAL_SUBNET=${NETWORK} \
-e ALLOWEDIPS=${NETWORK}/24 \
-e PERSISTENTKEEPALIVE_PEERS=all \
-e LOG_CONFS=true \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules \
--restart=always \
lscr.io/linuxserver/wireguard:latest


sleep 3

docker exec wireguard sh -c "
f='/config/wg_confs/wg0.conf'
sed -i 's/51820/${docker_port}/g' \$f
"

docker exec wireguard sh -c "
for d in /config/peer_*; do
sed -i 's/51820/${docker_port}/g' \$d/*.conf
done
"

docker exec wireguard sh -c '
for d in /config/peer_*; do
sed -i "/^DNS/d" "$d"/*.conf
done
'

docker exec wireguard sh -c '
for d in /config/peer_*; do
for f in "$d"/*.conf; do
grep -q "^PersistentKeepalive" "$f" || \
sed -i "/^AllowedIPs/ a PersistentKeepalive = 25" "$f"
done
done
'

docker exec -it wireguard bash -c '
for d in /config/peer_*; do
cd "$d" || continue
conf_file=$(ls *.conf)
base_name="${conf_file%.conf}"
qrencode -o "$base_name.png" < "$conf_file"
done
'

docker restart wireguard

sleep 2
echo
echo -e "${gl_huang}所有客户端二维码配置: ${gl_bai}"
docker exec -it wireguard bash -c 'for i in $(ls /config | grep peer_ | sed "s/peer_//"); do echo "--- $i ---"; /app/show-peer $i; done'
sleep 2
echo
echo -e "${gl_huang}所有客户端配置代码: ${gl_bai}"
docker exec wireguard sh -c 'for d in /config/peer_*; do echo "# $(basename $d) "; cat $d/*.conf; echo; done'
sleep 2
echo -e "${gl_lv}${COUNT}个客户端配置全部输出,使用方法如下:${gl_bai}"
echo -e "${gl_lv}1. 手机下载wg的APP扫描上方二维码可以快速连接网络${gl_bai}"
echo -e "${gl_lv}2. Windows下载客户端复制配置代码连接网络。${gl_bai}"
echo -e "${gl_lv}3. Linux用脚本部署WG客户端复制配置代码连接网络。${gl_bai}"
echo -e "${gl_lv}官方客户端下载方式: https://www.wireguard.com/install/${gl_bai}"
break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;


98|wgc)

local app_id="98"
local docker_name="wireguardc"
local docker_img="kjlion/wireguard:alpine"
local docker_port=51820

docker_rum() {

mkdir -p /home/docker/wireguard/config/

local CONFIG_FILE="/home/docker/wireguard/config/wg0.conf"

# 创建目录(如果不存在)
mkdir -p "$(dirname "$CONFIG_FILE")"

echo "请粘贴你的客户端配置,连续按两次回车保存:"

# 初始化变量
input=""
empty_line_count=0

# 逐行读取用户输入
while IFS= read -r line; do
if [[ -z "$line" ]]; then
((empty_line_count++))
if [[ $empty_line_count -ge 2 ]]; then
break
fi
else
empty_line_count=0
input+="$line"$'\n'
fi
done

# 写入配置文件
echo "$input" > "$CONFIG_FILE"

echo "客户端配置已保存到 $CONFIG_FILE"

docker run -d \
--name wireguardc \
--network host \
--cap-add NET_ADMIN \
--cap-add SYS_MODULE \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules:ro \
--restart always \
kjlion/wireguard:alpine

sleep 3

docker logs wireguardc

break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;



b)
@ -14132,4 +14310,3 @@ else
;;
esac
fi


View file

@ -1,5 +1,5 @@
#!/bin/bash
sh_v="4.1.0"
sh_v="4.1.2"


gl_hui='\e[37m'
@ -349,22 +349,22 @@ kejilion() {



stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
install lsof
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}


check_port() {
install lsof

stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}

stop_containers_or_kill_process 80
stop_containers_or_kill_process 443
}
@ -1558,7 +1558,7 @@ fi

add_yuming() {
ip_address
echo -e "First resolve the domain name to the local IP:${gl_huang}$ipv4_address $ipv6_address${gl_bai}"
echo -e "First resolve the domain name to the native IP:${gl_huang}$ipv4_address $ipv6_address${gl_bai}"
read -e -p "Please enter your IP or the resolved domain name:" yuming
}

@ -1740,7 +1740,7 @@ nginx_waf() {
wget -O /home/web/nginx.conf "${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/nginx10.conf"
fi

# Decide to turn on or off WAF according to the mode parameter
# Decide to turn on or off WAF according to mode parameters
if [ "$mode" == "on" ]; then
# Turn on WAF: Remove comments
sed -i 's|# load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;|load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;|' /home/web/nginx.conf > /dev/null 2>&1
@ -2949,7 +2949,7 @@ docker network create $NETWORK_NAME
docker run -d \
--name=node-exporter \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
prom/node-exporter

# Run Prometheus container
@ -2958,7 +2958,7 @@ docker run -d \
-v $PROMETHEUS_DIR/prometheus.yml:/etc/prometheus/prometheus.yml \
-v $PROMETHEUS_DIR/data:/prometheus \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
--user 0:0 \
prom/prometheus:latest

@ -2968,7 +2968,7 @@ docker run -d \
-p ${docker_port}:3000 \
-v $GRAFANA_DIR:/var/lib/grafana \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
grafana/grafana:latest

}
@ -3037,7 +3037,7 @@ f2b_install_sshd() {
-v /path/to/fail2ban/config:/config \
-v /var/log:/var/log:ro \
-v /home/web/log/nginx/:/remotelogs/nginx:ro \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/fail2ban:latest

sleep 3
@ -5959,7 +5959,7 @@ ssh_manager() {
while true; do
clear
echo "SSH Remote Connection Tool"
echo "Can connect to other Linux systems via SSH"
echo "Can be connected to other Linux systems via SSH"
echo "------------------------"
list_connections
echo "1. Create a new connection 2. Use a connection 3. Delete a connection"
@ -6869,7 +6869,7 @@ docker_ssh_migration() {

list_backups() {
echo -e "${BLUE}Current backup list:${NC}"
ls -dt ${BACKUP_ROOT}/docker_backup_* 2>/dev/null || echo "No backup"
ls -1dt ${BACKUP_ROOT}/docker_backup_* 2>/dev/null || echo "No backup"
}


@ -6878,7 +6878,10 @@ docker_ssh_migration() {
# Backup
# ----------------------------
backup_docker() {
send_stats "Docker backup"

echo -e "${YELLOW}Backing up Docker container...${NC}"
docker ps --format '{{.Names}}'
read -p "Please enter the name of the container to be backed up (separated by multiple spaces, and the Enter backup is all running containers):" containers

install tar jq gzip
@ -6970,7 +6973,7 @@ docker_ssh_migration() {
# Backup all files under /home/docker (excluding subdirectories)
if [ -d "/home/docker" ]; then
echo -e "${BLUE}Backup the files under /home/docker...${NC}"
find /home/docker -maxdepth 1 -type f -print0 | tar --null -czf "${BACKUP_DIR}/home_docker_files.tar.gz" --files-from -
find /home/docker -maxdepth 1 -type f | tar -czf "${BACKUP_DIR}/home_docker_files.tar.gz" -T -
echo -e "${GREEN}The file under /home/docker has been packaged to:${BACKUP_DIR}/home_docker_files.tar.gz${NC}"
fi

@ -6985,7 +6988,8 @@ docker_ssh_migration() {
# reduction
# ----------------------------
restore_docker() {
list_backups

send_stats "Docker restore"
read -p "Please enter the backup directory to restore:" BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}The backup directory does not exist${NC}"; return; }

@ -7103,8 +7107,8 @@ docker_ssh_migration() {
# migrate
# ----------------------------
migrate_docker() {
ensure_jq
list_backups
send_stats "Docker migration"
install jq
read -p "Please enter the backup directory to migrate:" BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}The backup directory does not exist${NC}"; return; }

@ -7125,7 +7129,7 @@ docker_ssh_migration() {
# Delete backup
# ----------------------------
delete_backup() {
list_backups
send_stats "Docker backup file deletion"
read -p "Please enter the backup directory to delete:" BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}The backup directory does not exist${NC}"; return; }
rm -rf "$BACKUP_DIR"
@ -7136,6 +7140,7 @@ docker_ssh_migration() {
# Main Menu
# ----------------------------
main_menu() {
send_stats "Docker backup migration and restore"
while true; do
clear
echo "------------------------"
@ -7160,6 +7165,7 @@ docker_ssh_migration() {
0) return ;;
*) echo -e "${RED}Invalid option${NC}" ;;
esac
break_end
done
}

@ -8866,6 +8872,9 @@ while true; do
echo -e "${gl_kjlan}89. ${color89}FileCodeBox file express${gl_kjlan}90. ${color90}matrix decentralized chat protocol"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}91. ${color91}gitea private code repository${gl_kjlan}92. ${color92}FileBrowser File Manager"
echo -e "${gl_kjlan}93. ${color93}Dufs minimalist static file server${gl_kjlan}94. ${color94}Gopeed high-speed download tool"
echo -e "${gl_kjlan}95. ${color95}paperless document management platform"
echo -e "${gl_kjlan}97. ${color97}WireGuard networking (server side)${gl_kjlan}98. ${color98}WireGuard networking (client)"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}b. ${gl_bai}Back up all application data${gl_kjlan}r. ${gl_bai}Restore all application data"
echo -e "${gl_kjlan}------------------------"
@ -8990,6 +8999,9 @@ while true; do

docker_rum() {

mkdir -p /home/docker/openlist
chmod -R 777 /home/docker/openlist

docker run -d \
--restart=always \
-v /home/docker/openlist:/opt/openlist/data \
@ -9037,7 +9049,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:ubuntu-kde


@ -9119,7 +9131,7 @@ while true; do
-p 56881:56881/udp \
-v /home/docker/qbittorrent/config:/config \
-v /home/docker/qbittorrent/downloads:/downloads \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/qbittorrent:latest

}
@ -9354,7 +9366,7 @@ while true; do
-p ${docker_port}:5700 \
--name qinglong \
--hostname qinglong \
--restart unless-stopped \
--restart=always \
whyour/qinglong:latest


@ -9420,7 +9432,7 @@ while true; do
-e PGID=1000 \
-v /home/docker/easyimage/config:/app/web/config \
-v /home/docker/easyimage/i:/app/web/i \
--restart unless-stopped \
--restart=always \
ddsderek/easyimage:latest

}
@ -9737,7 +9749,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:latest

}
@ -9800,7 +9812,7 @@ while true; do

docker_rum() {

docker run -d --name dockge --restart unless-stopped -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge
docker run -d --name dockge --restart=always -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge

}

@ -9842,7 +9854,7 @@ while true; do

docker run -d \
--name searxng \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v "/home/docker/searxng:/etc/searxng" \
searxng/searxng
@ -9996,7 +10008,7 @@ while true; do

docker_rum() {

docker run -d --restart unless-stopped \
docker run -d --restart=always \
-p ${docker_port}:3000 \
-v /home/docker/moments/data:/app/data \
-v /etc/localtime:/etc/localtime:ro \
@ -10150,7 +10162,7 @@ while true; do
-e ENCRYPTION_KEY=${ENCRYPTION_KEY} \
-p ${docker_port}:6989 \
-v /home/docker/nexterm:/app/data \
--restart unless-stopped \
--restart=always \
germannewsmaker/nexterm:latest

}
@ -10171,7 +10183,7 @@ while true; do

docker_rum() {

docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbs
docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbs

}

@ -10192,7 +10204,7 @@ while true; do

docker_rum() {

docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbr
docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbr

}

@ -10301,7 +10313,7 @@ while true; do
docker run -d \
--name=node-exporter \
-p ${docker_port}:9100 \
--restart unless-stopped \
--restart=always \
prom/node-exporter


@ -10325,7 +10337,7 @@ while true; do

docker run -d \
--name=cadvisor \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
@ -10696,7 +10708,7 @@ while true; do
local docker_port=8064

docker_rum() {
docker run -d --name it-tools --restart unless-stopped -p ${docker_port}:80 corentinth/it-tools:latest
docker run -d --name it-tools --restart=always -p ${docker_port}:80 corentinth/it-tools:latest
}

local docker_describe="对开发人员和 IT 工作者来说非常有用的工具"
@ -10840,7 +10852,7 @@ while true; do
-p 6199:6199 \
-p 11451:11451 \
-v /home/docker/astrbot/data:/AstrBot/data \
--restart unless-stopped \
--restart=always \
--name astrbot \
soulter/astrbot:latest

@ -10865,7 +10877,7 @@ while true; do

docker run -d \
--name navidrome \
--restart=unless-stopped \
--restart=always \
--user $(id -u):$(id -g) \
-v /home/docker/navidrome/music:/music \
-v /home/docker/navidrome/data:/data \
@ -10927,7 +10939,7 @@ while true; do

docker run -d \
--name libretv \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-e PASSWORD=${app_passwd} \
bestzwei/libretv:latest
@ -10969,9 +10981,9 @@ while true; do

curl -o /home/docker/moontv/docker-compose.yml ${gh_proxy}raw.githubusercontent.com/kejilion/docker/main/moontv-docker-compose.yml
sed -i "s/3000:3000/${docker_port}:3000/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin/${admin}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin_password/${admin_password}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/shouquanma/${shouquanma}/g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin_password|${admin_password}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin|${admin}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|shouquanma|${shouquanma}|g" /home/docker/moontv/docker-compose.yml
cd /home/docker/moontv/
docker compose up -d
clear
@ -11008,7 +11020,7 @@ while true; do

docker run -d \
--name melody \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:5566 \
-v /home/docker/melody/.profile:/app/backend/.profile \
foamzou/melody:latest
@ -11037,7 +11049,7 @@ while true; do
docker_rum() {
docker run -d \
--name dosgame \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:262 \
oldiy/dosgame-web-docker:latest

@ -11067,7 +11079,7 @@ while true; do

docker run -d \
--name xunlei \
--restart unless-stopped \
--restart=always \
--privileged \
-e XL_DASHBOARD_USERNAME=${app_use} \
-e XL_DASHBOARD_PASSWORD=${app_passwd} \
@ -11129,7 +11141,7 @@ while true; do
mkdir -p /home/docker/beszel && \
docker run -d \
--name beszel \
--restart=unless-stopped \
--restart=always \
-v /home/docker/beszel:/beszel_data \
-p ${docker_port}:8090 \
henrygd/beszel
@ -11347,7 +11359,7 @@ while true; do
-v /home/docker/wallos/logos:/var/www/html/images/uploads/logos \
-e TZ=UTC \
-p ${docker_port}:80 \
--restart unless-stopped \
--restart=always \
bellamy/wallos:latest

}
@ -11424,7 +11436,7 @@ while true; do
--mount type=bind,source=/home/docker/jellyfin/media,target=/media \
-p ${docker_port}:8096 \
-p 7359:7359/udp \
--restart=unless-stopped \
--restart=always \
jellyfin/jellyfin


@ -11512,7 +11524,7 @@ while true; do
--name file-code-box \
-p ${docker_port}:12345 \
-v /home/docker/file-code-box/data:/app/data \
--restart unless-stopped \
--restart=always \
lanol/filecodebox:latest

}
@ -11553,7 +11565,7 @@ while true; do
--name matrix \
-v /home/docker/matrix/data:/data \
-p ${docker_port}:8008 \
--restart unless-stopped \
--restart=always \
matrixdotorg/synapse:latest

echo "Create an initial user or administrator. Please set the following username and password and whether you are an administrator."
@ -11643,7 +11655,7 @@ while true; do

docker run -d \
--name filebrowser \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v /home/docker/filebrowser/data:/data \
-v /home/docker/filebrowser/config:/config \
@ -11661,6 +11673,288 @@ while true; do

;;

93|dufs)

local app_id="93"
local docker_name="dufs"
local docker_img="sigoden/dufs"
local docker_port=8093

docker_rum() {

docker run -d \
--name ${docker_name} \
--restart=always \
-v /home/docker/${docker_name}:/data \
-p ${docker_port}:5000 \
${docker_img} /data -A

}

local docker_describe="极简静态文件服务器,支持上传下载"
local docker_url="官网介绍: https://github.com/sigoden/dufs"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;

94|gopeed)

local app_id="94"
local docker_name="gopeed"
local docker_img="liwei2633/gopeed"
local docker_port=8094

docker_rum() {

read -e -p "Set login username:" app_use
read -e -p "Set login password:" app_passwd

docker run -d \
--name ${docker_name} \
--restart=always \
-v /home/docker/${docker_name}/downloads:/app/Downloads \
-v /home/docker/${docker_name}/storage:/app/storage \
-p ${docker_port}:9999 \
${docker_img} -u ${app_use} -p ${app_passwd}

}

local docker_describe="分布式高速下载工具,支持多种协议"
local docker_url="官网介绍: https://github.com/GopeedLab/gopeed"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;



95|paperless)

local app_id="95"

local app_name="paperless文档管理平台"
local app_text="开源的电子文档管理系统,它的主要用途是把你的纸质文件数字化并管理起来。"
local app_url="视频介绍: https://docs.paperless-ngx.com/"
local docker_name="paperless-webserver-1"
local docker_port="8095"
local app_size="2"

docker_app_install() {

mkdir -p /home/docker/paperless
mkdir -p /home/docker/paperless/export
mkdir -p /home/docker/paperless/consume
cd /home/docker/paperless

curl -o /home/docker/paperless/docker-compose.yml ${gh_proxy}raw.githubusercontent.com/paperless-ngx/paperless-ngx/refs/heads/main/docker/compose/docker-compose.postgres-tika.yml
curl -o /home/docker/paperless/docker-compose.env ${gh_proxy}raw.githubusercontent.com/paperless-ngx/paperless-ngx/refs/heads/main/docker/compose/.env

sed -i "s/8000:8000/${docker_port}:8000/g" /home/docker/paperless/docker-compose.yml
cd /home/docker/paperless
docker compose up -d
clear
echo "Installed"
check_docker_app_ip
}


docker_app_update() {
cd /home/docker/paperless/ && docker compose down --rmi all
docker_app_install
}


docker_app_uninstall() {
cd /home/docker/paperless/ && docker compose down --rmi all
rm -rf /home/docker/paperless
echo "The app has been uninstalled"
}

docker_app_plus

;;


97|wgs)

local app_id="97"
local docker_name="wireguard"
local docker_img="lscr.io/linuxserver/wireguard:latest"
local docker_port=8097

docker_rum() {

read -p "Please enter the number of clients to form the network (default 5):" COUNT
COUNT=${COUNT:-5}
read -p "Please enter the WireGuard segment (default 10.13.13.0):" NETWORK
NETWORK=${NETWORK:-10.13.13.0}

PEERS=$(seq -f "wg%02g" 1 "$COUNT" | paste -sd,)

ip link delete wg0 &>/dev/null

ip_address
docker run -d \
--name=wireguard \
--network host \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e SERVERURL=${ipv4_address} \
-e SERVERPORT=51820 \
-e PEERS=${PEERS} \
-e INTERNAL_SUBNET=${NETWORK} \
-e ALLOWEDIPS=${NETWORK}/24 \
-e PERSISTENTKEEPALIVE_PEERS=all \
-e LOG_CONFS=true \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules \
--restart=always \
lscr.io/linuxserver/wireguard:latest


sleep 3

docker exec wireguard sh -c "
f='/config/wg_confs/wg0.conf'
sed -i 's/51820/${docker_port}/g' \$f
"

docker exec wireguard sh -c "
for d in /config/peer_*; do
sed -i 's/51820/${docker_port}/g' \$d/*.conf
done
"

docker exec wireguard sh -c '
for d in /config/peer_*; do
sed -i "/^DNS/d" "$d"/*.conf
done
'

docker exec wireguard sh -c '
for d in /config/peer_*; do
for f in "$d"/*.conf; do
grep -q "^PersistentKeepalive" "$f" || \
sed -i "/^AllowedIPs/ a PersistentKeepalive = 25" "$f"
done
done
'

docker exec -it wireguard bash -c '
for d in /config/peer_*; do
cd "$d" || continue
conf_file=$(ls *.conf)
base_name="${conf_file%.conf}"
qrencode -o "$base_name.png" < "$conf_file"
done
'

docker restart wireguard

sleep 2
echo
echo -e "${gl_huang}All client QR code configuration:${gl_bai}"
docker exec -it wireguard bash -c 'for i in $(ls /config | grep peer_ | sed "s/peer_//"); do echo "--- $i ---"; /app/show-peer $i; done'
sleep 2
echo
echo -e "${gl_huang}All client configuration codes:${gl_bai}"
docker exec wireguard sh -c 'for d in /config/peer_*; do echo "# $(basename $d) "; cat $d/*.conf; echo; done'
sleep 2
echo -e "${gl_lv}${COUNT}All outputs are provided by each client. The usage method is as follows:${gl_bai}"
echo -e "${gl_lv}1. Download wg's APP on your mobile phone, scan the QR code above to quickly connect to the network${gl_bai}"
echo -e "${gl_lv}2. Download the Windows client and copy the configuration code to connect to the network.${gl_bai}"
echo -e "${gl_lv}3. Linux uses scripts to deploy WG clients and copy configuration code to connect to the network.${gl_bai}"
echo -e "${gl_lv}Official client download method: https://www.wireguard.com/install/${gl_bai}"
break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;


98|wgc)

local app_id="98"
local docker_name="wireguardc"
local docker_img="kjlion/wireguard:alpine"
local docker_port=51820

docker_rum() {

mkdir -p /home/docker/wireguard/config/

local CONFIG_FILE="/home/docker/wireguard/config/wg0.conf"

# Create a directory (if it does not exist)
mkdir -p "$(dirname "$CONFIG_FILE")"

echo "Please paste your client configuration and press Enter twice in a row to save:"

# Initialize variables
input=""
empty_line_count=0

# Read user input line by line
while IFS= read -r line; do
if [[ -z "$line" ]]; then
((empty_line_count++))
if [[ $empty_line_count -ge 2 ]]; then
break
fi
else
empty_line_count=0
input+="$line"$'\n'
fi
done

# Write to the configuration file
echo "$input" > "$CONFIG_FILE"

echo "Client configuration has been saved to$CONFIG_FILE"

docker run -d \
--name wireguardc \
--network host \
--cap-add NET_ADMIN \
--cap-add SYS_MODULE \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules:ro \
--restart always \
kjlion/wireguard:alpine

sleep 3

docker logs wireguardc

break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;



b)
clear
@ -13090,7 +13384,7 @@ EOF

echo "Privacy and Security"
echo "The script will collect data on user functions, optimize the script experience, and create more fun and useful functions."
echo "Will collect the script version number, usage time, system version, CPU architecture, country of the machine and the name of the functions used,"
echo "Will collect the script version number, usage time, system version, CPU architecture, country of the machine and the name of the function used,"
echo "------------------------------------------------"
echo -e "Current status:$status_message"
echo "--------------------"
@ -14016,4 +14310,3 @@ else
;;
esac
fi


View file

@ -1,5 +1,5 @@
#!/bin/bash
sh_v="4.1.0"
sh_v="4.1.2"


gl_hui='\e[37m'
@ -349,22 +349,22 @@ kejilion() {



stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
install lsof
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}


check_port() {
install lsof

stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}

stop_containers_or_kill_process 80
stop_containers_or_kill_process 443
}
@ -793,7 +793,7 @@ docker_ipv6_on() {
UPDATED_CONFIG=$(echo "$ORIGINAL_CONFIG" | jq '. + {"fixed-cidr-v6": "2001:db8:1::/64"}')
fi

# 元の構成と新しい構成を比較します
# 元の構成を新しい構成と比較します
if [[ "$ORIGINAL_CONFIG" == "$UPDATED_CONFIG" ]]; then
echo -e "${gl_huang}現在、IPv6アクセスが有効になっています${gl_bai}"
else
@ -825,7 +825,7 @@ docker_ipv6_off() {
# 現在のIPv6ステータスを確認してください
local CURRENT_IPV6=$(echo "$ORIGINAL_CONFIG" | jq -r '.ipv6 // false')

# 元の構成と新しい構成を比較します
# 元の構成を新しい構成と比較します
if [[ "$CURRENT_IPV6" == "false" ]]; then
echo -e "${gl_huang}IPv6アクセスは現在閉じられています${gl_bai}"
else
@ -1558,7 +1558,7 @@ fi

add_yuming() {
ip_address
echo -e "最初にドメイン名をローカルIPに解決します。${gl_huang}$ipv4_address $ipv6_address${gl_bai}"
echo -e "最初にドメイン名をネイティブIPに解決します。${gl_huang}$ipv4_address $ipv6_address${gl_bai}"
read -e -p "IPまたは解決されたドメイン名を入力してください" yuming
}

@ -1740,7 +1740,7 @@ nginx_waf() {
wget -O /home/web/nginx.conf "${gh_proxy}raw.githubusercontent.com/kejilion/nginx/main/nginx10.conf"
fi

# モードパラメーターに従ってWAFをオンまたはオフにすることにしました
# モードパラメーターに従ってWAFをオンまたはオフにすることを決定します
if [ "$mode" == "on" ]; then
# WAFをオンにしてくださいコメントを削除します
sed -i 's|# load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;|load_module /etc/nginx/modules/ngx_http_modsecurity_module.so;|' /home/web/nginx.conf > /dev/null 2>&1
@ -2949,7 +2949,7 @@ docker network create $NETWORK_NAME
docker run -d \
--name=node-exporter \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
prom/node-exporter

# Run Prometheus container
@ -2958,7 +2958,7 @@ docker run -d \
-v $PROMETHEUS_DIR/prometheus.yml:/etc/prometheus/prometheus.yml \
-v $PROMETHEUS_DIR/data:/prometheus \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
--user 0:0 \
prom/prometheus:latest

@ -2968,7 +2968,7 @@ docker run -d \
-p ${docker_port}:3000 \
-v $GRAFANA_DIR:/var/lib/grafana \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
grafana/grafana:latest

}
@ -3037,7 +3037,7 @@ f2b_install_sshd() {
-v /path/to/fail2ban/config:/config \
-v /var/log:/var/log:ro \
-v /home/web/log/nginx/:/remotelogs/nginx:ro \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/fail2ban:latest

sleep 3
@ -3892,7 +3892,7 @@ frps_panel() {
echo "------------------------"
echo "7. IP+ポートアクセスを許可8。BlockIP+ポートアクセス"
echo "------------------------"
echo "00。サービスのステータスを更新します0。前のメニューに戻ります"
echo "00。サービスのステータスを更新します。前のメニューに戻ります"
echo "------------------------"
read -e -p "あなたの選択を入力してください:" choice
case $choice in
@ -4147,7 +4147,7 @@ yt_menu_pro() {
--no-overwrites --no-post-overwrites
read -e -p "実行が完了したら、キーを押して続行します..." ;;
8)
send_stats "MP3ダウンロード"
send_stats "mp3ダウンロード"
read -e -p "ビデオリンクを入力してください:" url
yt-dlp -P "$VIDEO_DIR" -x --audio-format mp3 \
--write-subs --sub-langs all \
@ -4521,7 +4521,7 @@ echo -e "${gl_lv}ルートログインがセットアップされます!${gl_b

root_use() {
clear
[ "$EUID" -ne 0 ] && echo -e "${gl_huang}ヒント:${gl_bai}この機能には、ルートユーザーを実行する必要があります!" && break_end && kejilion
[ "$EUID" -ne 0 ] && echo -e "${gl_huang}ヒント:${gl_bai}この機能では、ルートユーザーを実行する必要があります!" && break_end && kejilion
}


@ -5278,7 +5278,7 @@ optimize_balanced() {

# デフォルト設定関数を復元します
restore_defaults() {
echo -e "${gl_lv}デフォルト設定に復元します...${gl_bai}"
echo -e "${gl_lv}デフォルト設定に復元...${gl_bai}"

echo -e "${gl_lv}ファイル記述子を復元します...${gl_bai}"
ulimit -n 1024
@ -6418,7 +6418,7 @@ rsync_manager() {
echo
echo "1.新しいタスクを作成します2。タスクを削除します"
echo "3.リモートエンドにローカル同期を実行する4。ローカルエンドにリモート同期を実行する"
echo "5.タイミングタスクを作成6。タイミングタスクを削除します"
echo "5.タイミングタスクを作成6.タイミングタスクを削除します"
echo "---------------------------------"
echo "0。前のメニューに戻ります"
echo "---------------------------------"
@ -6869,7 +6869,7 @@ docker_ssh_migration() {

list_backups() {
echo -e "${BLUE}現在のバックアップリスト:${NC}"
ls -dt ${BACKUP_ROOT}/docker_backup_* 2>/dev/null || echo "バックアップなし"
ls -1dt ${BACKUP_ROOT}/docker_backup_* 2>/dev/null || echo "バックアップなし"
}


@ -6878,7 +6878,10 @@ docker_ssh_migration() {
# バックアップ
# ----------------------------
backup_docker() {
send_stats "Dockerバックアップ"

echo -e "${YELLOW}Dockerコンテナのバックアップ...${NC}"
docker ps --format '{{.Names}}'
read -p "バックアップするコンテナの名前を入力してください複数のスペースで区切られていて、Enterバックアップはすべて実行中のコンテナです" containers

install tar jq gzip
@ -6970,7 +6973,7 @@ docker_ssh_migration() {
# /home /dockerのすべてのファイルをバックアップしますサブディレクトリを除く
if [ -d "/home/docker" ]; then
echo -e "${BLUE}/home /dockerの下のファイルをバックアップ...${NC}"
find /home/docker -maxdepth 1 -type f -print0 | tar --null -czf "${BACKUP_DIR}/home_docker_files.tar.gz" --files-from -
find /home/docker -maxdepth 1 -type f | tar -czf "${BACKUP_DIR}/home_docker_files.tar.gz" -T -
echo -e "${GREEN}/home /dockerの下のファイルは次のようにパッケージ化されています。${BACKUP_DIR}/home_docker_files.tar.gz${NC}"
fi

@ -6985,7 +6988,8 @@ docker_ssh_migration() {
# 削減
# ----------------------------
restore_docker() {
list_backups

send_stats "Dockerの復元"
read -p "復元するには、バックアップディレクトリを入力してください。" BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}バックアップディレクトリは存在しません${NC}"; return; }

@ -7103,8 +7107,8 @@ docker_ssh_migration() {
# 移動します
# ----------------------------
migrate_docker() {
ensure_jq
list_backups
send_stats "Dockerの移行"
install jq
read -p "移行するには、バックアップディレクトリを入力してください。" BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}バックアップディレクトリは存在しません${NC}"; return; }

@ -7125,7 +7129,7 @@ docker_ssh_migration() {
# バックアップを削除します
# ----------------------------
delete_backup() {
list_backups
send_stats "Dockerバックアップファイルの削除"
read -p "削除するには、バックアップディレクトリを入力してください。" BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}バックアップディレクトリは存在しません${NC}"; return; }
rm -rf "$BACKUP_DIR"
@ -7136,6 +7140,7 @@ docker_ssh_migration() {
# メインメニュー
# ----------------------------
main_menu() {
send_stats "Dockerバックアップの移行と復元"
while true; do
clear
echo "------------------------"
@ -7160,6 +7165,7 @@ docker_ssh_migration() {
0) return ;;
*) echo -e "${RED}無効なオプション${NC}" ;;
esac
break_end
done
}

@ -7898,7 +7904,7 @@ linux_ldnmp() {


ldnmp_web_on
echo "データベースアドレスmysql"
echo "データベースアドレスMySQL"
echo "データベース名:$dbname"
echo "ユーザー名:$dbuse"
echo "パスワード:$dbusepasswd"
@ -7934,7 +7940,7 @@ linux_ldnmp() {
restart_ldnmp

ldnmp_web_on
echo "データベースアドレスmysql"
echo "データベースアドレスMySQL"
echo "ユーザー名:$dbuse"
echo "パスワード:$dbusepasswd"
echo "データベース名:$dbname"
@ -7973,7 +7979,7 @@ linux_ldnmp() {


ldnmp_web_on
echo "データベースアドレスmysql"
echo "データベースアドレスMySQL"
echo "データベースポート3306"
echo "データベース名:$dbname"
echo "ユーザー名:$dbuse"
@ -8011,7 +8017,7 @@ linux_ldnmp() {


ldnmp_web_on
echo "データベースアドレスmysql"
echo "データベースアドレスMySQL"
echo "データベースポート3306"
echo "データベース名:$dbname"
echo "ユーザー名:$dbuse"
@ -8075,7 +8081,7 @@ linux_ldnmp() {


ldnmp_web_on
echo "データベースアドレスmysql"
echo "データベースアドレスMySQL"
echo "データベース名:$dbname"
echo "ユーザー名:$dbuse"
echo "パスワード:$dbusepasswd"
@ -8114,7 +8120,7 @@ linux_ldnmp() {
clear
ldnmp_web_on
echo "データベースプレフィックスtypecho_"
echo "データベースアドレスmysql"
echo "データベースアドレスMySQL"
echo "ユーザー名:$dbuse"
echo "パスワード:$dbusepasswd"
echo "データベース名:$dbname"
@ -8152,7 +8158,7 @@ linux_ldnmp() {

clear
ldnmp_web_on
echo "データベースアドレスmysql"
echo "データベースアドレスMySQL"
echo "データベースポート3306"
echo "データベース名:$dbname"
echo "ユーザー名:$dbuse"
@ -8278,7 +8284,7 @@ linux_ldnmp() {
restart_ldnmp
ldnmp_web_on
prefix="web$(shuf -i 10-99 -n 1)_"
echo "データベースアドレスmysql"
echo "データベースアドレスMySQL"
echo "データベース名:$dbname"
echo "ユーザー名:$dbuse"
echo "パスワード:$dbusepasswd"
@ -8866,6 +8872,9 @@ while true; do
echo -e "${gl_kjlan}89. ${color89}FileCodeBoxファイルエクスプレス${gl_kjlan}90. ${color90}マトリックス分散型チャットプロトコル"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}91. ${color91}Giteaプライベートコードリポジトリ${gl_kjlan}92. ${color92}FileBrowserファイルマネージャー"
echo -e "${gl_kjlan}93. ${color93}DUFS Minimalist Static File Server${gl_kjlan}94. ${color94}ゴープ高速ダウンロードツール"
echo -e "${gl_kjlan}95. ${color95}ペーパーレスドキュメント管理プラットフォーム"
echo -e "${gl_kjlan}97. ${color97}ワイヤガードネットワーキング(サーバー側)${gl_kjlan}98. ${color98}ワイヤガードネットワーキング(クライアント)"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}b. ${gl_bai}すべてのアプリケーションデータをバックアップします${gl_kjlan}r. ${gl_bai}すべてのアプリケーションデータを復元します"
echo -e "${gl_kjlan}------------------------"
@ -8990,6 +8999,9 @@ while true; do

docker_rum() {

mkdir -p /home/docker/openlist
chmod -R 777 /home/docker/openlist

docker run -d \
--restart=always \
-v /home/docker/openlist:/opt/openlist/data \
@ -9037,7 +9049,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:ubuntu-kde


@ -9119,7 +9131,7 @@ while true; do
-p 56881:56881/udp \
-v /home/docker/qbittorrent/config:/config \
-v /home/docker/qbittorrent/downloads:/downloads \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/qbittorrent:latest

}
@ -9354,7 +9366,7 @@ while true; do
-p ${docker_port}:5700 \
--name qinglong \
--hostname qinglong \
--restart unless-stopped \
--restart=always \
whyour/qinglong:latest


@ -9420,7 +9432,7 @@ while true; do
-e PGID=1000 \
-v /home/docker/easyimage/config:/app/web/config \
-v /home/docker/easyimage/i:/app/web/i \
--restart unless-stopped \
--restart=always \
ddsderek/easyimage:latest

}
@ -9737,7 +9749,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:latest

}
@ -9800,7 +9812,7 @@ while true; do

docker_rum() {

docker run -d --name dockge --restart unless-stopped -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge
docker run -d --name dockge --restart=always -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge

}

@ -9842,7 +9854,7 @@ while true; do

docker run -d \
--name searxng \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v "/home/docker/searxng:/etc/searxng" \
searxng/searxng
@ -9996,7 +10008,7 @@ while true; do

docker_rum() {

docker run -d --restart unless-stopped \
docker run -d --restart=always \
-p ${docker_port}:3000 \
-v /home/docker/moments/data:/app/data \
-v /etc/localtime:/etc/localtime:ro \
@ -10150,7 +10162,7 @@ while true; do
-e ENCRYPTION_KEY=${ENCRYPTION_KEY} \
-p ${docker_port}:6989 \
-v /home/docker/nexterm:/app/data \
--restart unless-stopped \
--restart=always \
germannewsmaker/nexterm:latest

}
@ -10171,7 +10183,7 @@ while true; do

docker_rum() {

docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbs
docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbs

}

@ -10192,7 +10204,7 @@ while true; do

docker_rum() {

docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbr
docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbr

}

@ -10301,7 +10313,7 @@ while true; do
docker run -d \
--name=node-exporter \
-p ${docker_port}:9100 \
--restart unless-stopped \
--restart=always \
prom/node-exporter


@ -10325,7 +10337,7 @@ while true; do

docker run -d \
--name=cadvisor \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
@ -10696,7 +10708,7 @@ while true; do
local docker_port=8064

docker_rum() {
docker run -d --name it-tools --restart unless-stopped -p ${docker_port}:80 corentinth/it-tools:latest
docker run -d --name it-tools --restart=always -p ${docker_port}:80 corentinth/it-tools:latest
}

local docker_describe="对开发人员和 IT 工作者来说非常有用的工具"
@ -10840,7 +10852,7 @@ while true; do
-p 6199:6199 \
-p 11451:11451 \
-v /home/docker/astrbot/data:/AstrBot/data \
--restart unless-stopped \
--restart=always \
--name astrbot \
soulter/astrbot:latest

@ -10865,7 +10877,7 @@ while true; do

docker run -d \
--name navidrome \
--restart=unless-stopped \
--restart=always \
--user $(id -u):$(id -g) \
-v /home/docker/navidrome/music:/music \
-v /home/docker/navidrome/data:/data \
@ -10927,7 +10939,7 @@ while true; do

docker run -d \
--name libretv \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-e PASSWORD=${app_passwd} \
bestzwei/libretv:latest
@ -10969,9 +10981,9 @@ while true; do

curl -o /home/docker/moontv/docker-compose.yml ${gh_proxy}raw.githubusercontent.com/kejilion/docker/main/moontv-docker-compose.yml
sed -i "s/3000:3000/${docker_port}:3000/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin/${admin}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin_password/${admin_password}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/shouquanma/${shouquanma}/g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin_password|${admin_password}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin|${admin}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|shouquanma|${shouquanma}|g" /home/docker/moontv/docker-compose.yml
cd /home/docker/moontv/
docker compose up -d
clear
@ -11008,7 +11020,7 @@ while true; do

docker run -d \
--name melody \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:5566 \
-v /home/docker/melody/.profile:/app/backend/.profile \
foamzou/melody:latest
@ -11037,7 +11049,7 @@ while true; do
docker_rum() {
docker run -d \
--name dosgame \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:262 \
oldiy/dosgame-web-docker:latest

@ -11067,7 +11079,7 @@ while true; do

docker run -d \
--name xunlei \
--restart unless-stopped \
--restart=always \
--privileged \
-e XL_DASHBOARD_USERNAME=${app_use} \
-e XL_DASHBOARD_PASSWORD=${app_passwd} \
@ -11129,7 +11141,7 @@ while true; do
mkdir -p /home/docker/beszel && \
docker run -d \
--name beszel \
--restart=unless-stopped \
--restart=always \
-v /home/docker/beszel:/beszel_data \
-p ${docker_port}:8090 \
henrygd/beszel
@ -11347,7 +11359,7 @@ while true; do
-v /home/docker/wallos/logos:/var/www/html/images/uploads/logos \
-e TZ=UTC \
-p ${docker_port}:80 \
--restart unless-stopped \
--restart=always \
bellamy/wallos:latest

}
@ -11424,7 +11436,7 @@ while true; do
--mount type=bind,source=/home/docker/jellyfin/media,target=/media \
-p ${docker_port}:8096 \
-p 7359:7359/udp \
--restart=unless-stopped \
--restart=always \
jellyfin/jellyfin


@ -11512,7 +11524,7 @@ while true; do
--name file-code-box \
-p ${docker_port}:12345 \
-v /home/docker/file-code-box/data:/app/data \
--restart unless-stopped \
--restart=always \
lanol/filecodebox:latest

}
@ -11553,7 +11565,7 @@ while true; do
--name matrix \
-v /home/docker/matrix/data:/data \
-p ${docker_port}:8008 \
--restart unless-stopped \
--restart=always \
matrixdotorg/synapse:latest

echo "初期ユーザーまたは管理者を作成します。次のユーザー名とパスワード、およびあなたが管理者であるかどうかを設定してください。"
@ -11643,7 +11655,7 @@ while true; do

docker run -d \
--name filebrowser \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v /home/docker/filebrowser/data:/data \
-v /home/docker/filebrowser/config:/config \
@ -11661,6 +11673,288 @@ while true; do

;;

93|dufs)

local app_id="93"
local docker_name="dufs"
local docker_img="sigoden/dufs"
local docker_port=8093

docker_rum() {

docker run -d \
--name ${docker_name} \
--restart=always \
-v /home/docker/${docker_name}:/data \
-p ${docker_port}:5000 \
${docker_img} /data -A

}

local docker_describe="极简静态文件服务器,支持上传下载"
local docker_url="官网介绍: https://github.com/sigoden/dufs"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;

94|gopeed)

local app_id="94"
local docker_name="gopeed"
local docker_img="liwei2633/gopeed"
local docker_port=8094

docker_rum() {

read -e -p "ログインユーザー名を設定します:" app_use
read -e -p "ログインパスワードの設定:" app_passwd

docker run -d \
--name ${docker_name} \
--restart=always \
-v /home/docker/${docker_name}/downloads:/app/Downloads \
-v /home/docker/${docker_name}/storage:/app/storage \
-p ${docker_port}:9999 \
${docker_img} -u ${app_use} -p ${app_passwd}

}

local docker_describe="分布式高速下载工具,支持多种协议"
local docker_url="官网介绍: https://github.com/GopeedLab/gopeed"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;



95|paperless)

local app_id="95"

local app_name="paperless文档管理平台"
local app_text="开源的电子文档管理系统,它的主要用途是把你的纸质文件数字化并管理起来。"
local app_url="视频介绍: https://docs.paperless-ngx.com/"
local docker_name="paperless-webserver-1"
local docker_port="8095"
local app_size="2"

docker_app_install() {

mkdir -p /home/docker/paperless
mkdir -p /home/docker/paperless/export
mkdir -p /home/docker/paperless/consume
cd /home/docker/paperless

curl -o /home/docker/paperless/docker-compose.yml ${gh_proxy}raw.githubusercontent.com/paperless-ngx/paperless-ngx/refs/heads/main/docker/compose/docker-compose.postgres-tika.yml
curl -o /home/docker/paperless/docker-compose.env ${gh_proxy}raw.githubusercontent.com/paperless-ngx/paperless-ngx/refs/heads/main/docker/compose/.env

sed -i "s/8000:8000/${docker_port}:8000/g" /home/docker/paperless/docker-compose.yml
cd /home/docker/paperless
docker compose up -d
clear
echo "インストール"
check_docker_app_ip
}


docker_app_update() {
cd /home/docker/paperless/ && docker compose down --rmi all
docker_app_install
}


docker_app_uninstall() {
cd /home/docker/paperless/ && docker compose down --rmi all
rm -rf /home/docker/paperless
echo "アプリはアンインストールされています"
}

docker_app_plus

;;


97|wgs)

local app_id="97"
local docker_name="wireguard"
local docker_img="lscr.io/linuxserver/wireguard:latest"
local docker_port=8097

docker_rum() {

read -p "ネットワークを形成するためにクライアントの数を入力してくださいデフォルト5" COUNT
COUNT=${COUNT:-5}
read -p "WireGuardセグメントを入力してくださいデフォルト10.13.13.0" NETWORK
NETWORK=${NETWORK:-10.13.13.0}

PEERS=$(seq -f "wg%02g" 1 "$COUNT" | paste -sd,)

ip link delete wg0 &>/dev/null

ip_address
docker run -d \
--name=wireguard \
--network host \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e SERVERURL=${ipv4_address} \
-e SERVERPORT=51820 \
-e PEERS=${PEERS} \
-e INTERNAL_SUBNET=${NETWORK} \
-e ALLOWEDIPS=${NETWORK}/24 \
-e PERSISTENTKEEPALIVE_PEERS=all \
-e LOG_CONFS=true \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules \
--restart=always \
lscr.io/linuxserver/wireguard:latest


sleep 3

docker exec wireguard sh -c "
f='/config/wg_confs/wg0.conf'
sed -i 's/51820/${docker_port}/g' \$f
"

docker exec wireguard sh -c "
for d in /config/peer_*; do
sed -i 's/51820/${docker_port}/g' \$d/*.conf
done
"

docker exec wireguard sh -c '
for d in /config/peer_*; do
sed -i "/^DNS/d" "$d"/*.conf
done
'

docker exec wireguard sh -c '
for d in /config/peer_*; do
for f in "$d"/*.conf; do
grep -q "^PersistentKeepalive" "$f" || \
sed -i "/^AllowedIPs/ a PersistentKeepalive = 25" "$f"
done
done
'

docker exec -it wireguard bash -c '
for d in /config/peer_*; do
cd "$d" || continue
conf_file=$(ls *.conf)
base_name="${conf_file%.conf}"
qrencode -o "$base_name.png" < "$conf_file"
done
'

docker restart wireguard

sleep 2
echo
echo -e "${gl_huang}すべてのクライアントQRコード構成${gl_bai}"
docker exec -it wireguard bash -c 'for i in $(ls /config | grep peer_ | sed "s/peer_//"); do echo "--- $i ---"; /app/show-peer $i; done'
sleep 2
echo
echo -e "${gl_huang}すべてのクライアント構成コード:${gl_bai}"
docker exec wireguard sh -c 'for d in /config/peer_*; do echo "# $(basename $d) "; cat $d/*.conf; echo; done'
sleep 2
echo -e "${gl_lv}${COUNT}すべての出力は各クライアントによって提供されます。使用方法は次のとおりです。${gl_bai}"
echo -e "${gl_lv}1.携帯電話にWGのアプリをダウンロードして、上のQRコードをスキャンしてネットワークにすばやく接続します${gl_bai}"
echo -e "${gl_lv}2。Windowsクライアントをダウンロードし、構成コードをコピーしてネットワークに接続します。${gl_bai}"
echo -e "${gl_lv}3。Linuxはスクリプトを使用してWGクライアントを展開し、構成コードをコピーしてネットワークに接続します。${gl_bai}"
echo -e "${gl_lv}公式クライアントのダウンロード方法https//www.wireguard.com/install/${gl_bai}"
break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;


98|wgc)

local app_id="98"
local docker_name="wireguardc"
local docker_img="kjlion/wireguard:alpine"
local docker_port=51820

docker_rum() {

mkdir -p /home/docker/wireguard/config/

local CONFIG_FILE="/home/docker/wireguard/config/wg0.conf"

# ディレクトリを作成する(存在しない場合)
mkdir -p "$(dirname "$CONFIG_FILE")"

echo "クライアントの構成を貼り付け、Enterを2回連続で押して保存してください。"

# 変数を初期化します
input=""
empty_line_count=0

# ユーザーの入力を行ごとに読み取ります
while IFS= read -r line; do
if [[ -z "$line" ]]; then
((empty_line_count++))
if [[ $empty_line_count -ge 2 ]]; then
break
fi
else
empty_line_count=0
input+="$line"$'\n'
fi
done

# 構成ファイルに書き込みます
echo "$input" > "$CONFIG_FILE"

echo "クライアントの構成が保存されています$CONFIG_FILE"

docker run -d \
--name wireguardc \
--network host \
--cap-add NET_ADMIN \
--cap-add SYS_MODULE \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules:ro \
--restart always \
kjlion/wireguard:alpine

sleep 3

docker logs wireguardc

break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;



b)
clear
@ -12609,7 +12903,7 @@ EOF
break # 跳出
;;
esac
send_stats "時限タスクを追加します"
send_stats "タイムされたタスクを追加します"
;;
2)
read -e -p "削除する必要があるキーワードを入力してください。" kquest
@ -12854,7 +13148,7 @@ EOF
echo "TG-BOTモニタリングと早期警告機能"
echo "ビデオの紹介https//youtu.be/vll-eb3z_ty"
echo "------------------------------------------------"
echo "ネイティブCPU、メモリ、ハードディスク、トラフィック、およびSSHログインのリアルタイム監視と早期警告を実現するために、TG Robot APIとユーザーIDを構成する必要があります。"
echo "ネイティブCPU、メモリ、ハードディスク、トラフィック、SSHログインのリアルタイム監視と早期警告を実現するために、TG Robot APIとユーザーIDを構成する必要があります。"
echo "しきい値に達した後、ユーザーはユーザーに送信されます"
echo -e "${gl_hui}- トラフィックに関しては、サーバーの再起動が再計算されます -${gl_bai}"
read -e -p "必ず続行しますか? y/n" choice
@ -13090,7 +13384,7 @@ EOF

echo "プライバシーとセキュリティ"
echo "スクリプトは、ユーザー機能に関するデータを収集し、スクリプトエクスペリエンスを最適化し、より楽しく便利な機能を作成します。"
echo "スクリプトバージョン番号、使用時間、システムバージョン、CPUアーキテクチャ、マシンの国、使用される機能の名前を収集します。"
echo "スクリプトバージョン番号、使用時間、システムバージョン、CPUアーキテクチャ、マシンの国、および使用される関数の名前を収集します。"
echo "------------------------------------------------"
echo -e "現在のステータス:$status_message"
echo "--------------------"
@ -13214,7 +13508,7 @@ linux_file() {
;;
3) # 修改目录权限
read -e -p "ディレクトリ名を入力してください:" dirname
read -e -p "許可を入力してください755など" perm
read -e -p "許可755などを入力してください。" perm
chmod "$perm" "$dirname" && echo "許可が変更されました" || echo "変更に失敗しました"
send_stats "ディレクトリ権限を変更します"
;;
@ -13246,7 +13540,7 @@ linux_file() {
;;
13) # 修改文件权限
read -e -p "ファイル名を入力してください:" filename
read -e -p "許可を入力してください755など" perm
read -e -p "許可755などを入力してください。" perm
chmod "$perm" "$filename" && echo "許可が変更されました" || echo "変更に失敗しました"
send_stats "ファイル権限を変更します"
;;
@ -14016,4 +14310,3 @@ else
;;
esac
fi


View file

@ -1,5 +1,5 @@
#!/bin/bash
sh_v="4.1.1"
sh_v="4.1.2"


gl_hui='\e[37m'
@ -349,22 +349,22 @@ kejilion() {



stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
install lsof
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}


check_port() {
install lsof

stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}

stop_containers_or_kill_process 80
stop_containers_or_kill_process 443
}
@ -2949,7 +2949,7 @@ docker network create $NETWORK_NAME
docker run -d \
--name=node-exporter \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
prom/node-exporter

# Run Prometheus container
@ -2958,7 +2958,7 @@ docker run -d \
-v $PROMETHEUS_DIR/prometheus.yml:/etc/prometheus/prometheus.yml \
-v $PROMETHEUS_DIR/data:/prometheus \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
--user 0:0 \
prom/prometheus:latest

@ -2968,7 +2968,7 @@ docker run -d \
-p ${docker_port}:3000 \
-v $GRAFANA_DIR:/var/lib/grafana \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
grafana/grafana:latest

}
@ -3037,7 +3037,7 @@ f2b_install_sshd() {
-v /path/to/fail2ban/config:/config \
-v /var/log:/var/log:ro \
-v /home/web/log/nginx/:/remotelogs/nginx:ro \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/fail2ban:latest

sleep 3
@ -8874,6 +8874,7 @@ while true; do
echo -e "${gl_kjlan}91. ${color91}gitea私有代码仓库 ${gl_kjlan}92. ${color92}FileBrowser文件管理器"
echo -e "${gl_kjlan}93. ${color93}Dufs极简静态文件服务器 ${gl_kjlan}94. ${color94}Gopeed高速下载工具"
echo -e "${gl_kjlan}95. ${color95}paperless文档管理平台"
echo -e "${gl_kjlan}97. ${color97}WireGuard组网(服务端) ${gl_kjlan}98. ${color98}WireGuard组网(客户端)"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}b. ${gl_bai}备份全部应用数据 ${gl_kjlan}r. ${gl_bai}还原全部应用数据"
echo -e "${gl_kjlan}------------------------"
@ -8998,6 +8999,9 @@ while true; do

docker_rum() {

mkdir -p /home/docker/openlist
chmod -R 777 /home/docker/openlist

docker run -d \
--restart=always \
-v /home/docker/openlist:/opt/openlist/data \
@ -9045,7 +9049,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:ubuntu-kde


@ -9127,7 +9131,7 @@ while true; do
-p 56881:56881/udp \
-v /home/docker/qbittorrent/config:/config \
-v /home/docker/qbittorrent/downloads:/downloads \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/qbittorrent:latest

}
@ -9362,7 +9366,7 @@ while true; do
-p ${docker_port}:5700 \
--name qinglong \
--hostname qinglong \
--restart unless-stopped \
--restart=always \
whyour/qinglong:latest


@ -9428,7 +9432,7 @@ while true; do
-e PGID=1000 \
-v /home/docker/easyimage/config:/app/web/config \
-v /home/docker/easyimage/i:/app/web/i \
--restart unless-stopped \
--restart=always \
ddsderek/easyimage:latest

}
@ -9745,7 +9749,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:latest

}
@ -9808,7 +9812,7 @@ while true; do

docker_rum() {

docker run -d --name dockge --restart unless-stopped -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge
docker run -d --name dockge --restart=always -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge

}

@ -9850,7 +9854,7 @@ while true; do

docker run -d \
--name searxng \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v "/home/docker/searxng:/etc/searxng" \
searxng/searxng
@ -10004,7 +10008,7 @@ while true; do

docker_rum() {

docker run -d --restart unless-stopped \
docker run -d --restart=always \
-p ${docker_port}:3000 \
-v /home/docker/moments/data:/app/data \
-v /etc/localtime:/etc/localtime:ro \
@ -10158,7 +10162,7 @@ while true; do
-e ENCRYPTION_KEY=${ENCRYPTION_KEY} \
-p ${docker_port}:6989 \
-v /home/docker/nexterm:/app/data \
--restart unless-stopped \
--restart=always \
germannewsmaker/nexterm:latest

}
@ -10179,7 +10183,7 @@ while true; do

docker_rum() {

docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbs
docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbs

}

@ -10200,7 +10204,7 @@ while true; do

docker_rum() {

docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbr
docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbr

}

@ -10309,7 +10313,7 @@ while true; do
docker run -d \
--name=node-exporter \
-p ${docker_port}:9100 \
--restart unless-stopped \
--restart=always \
prom/node-exporter


@ -10333,7 +10337,7 @@ while true; do

docker run -d \
--name=cadvisor \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
@ -10704,7 +10708,7 @@ while true; do
local docker_port=8064

docker_rum() {
docker run -d --name it-tools --restart unless-stopped -p ${docker_port}:80 corentinth/it-tools:latest
docker run -d --name it-tools --restart=always -p ${docker_port}:80 corentinth/it-tools:latest
}

local docker_describe="对开发人员和 IT 工作者来说非常有用的工具"
@ -10848,7 +10852,7 @@ while true; do
-p 6199:6199 \
-p 11451:11451 \
-v /home/docker/astrbot/data:/AstrBot/data \
--restart unless-stopped \
--restart=always \
--name astrbot \
soulter/astrbot:latest

@ -10873,7 +10877,7 @@ while true; do

docker run -d \
--name navidrome \
--restart=unless-stopped \
--restart=always \
--user $(id -u):$(id -g) \
-v /home/docker/navidrome/music:/music \
-v /home/docker/navidrome/data:/data \
@ -10935,7 +10939,7 @@ while true; do

docker run -d \
--name libretv \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-e PASSWORD=${app_passwd} \
bestzwei/libretv:latest
@ -10977,9 +10981,9 @@ while true; do

curl -o /home/docker/moontv/docker-compose.yml ${gh_proxy}raw.githubusercontent.com/kejilion/docker/main/moontv-docker-compose.yml
sed -i "s/3000:3000/${docker_port}:3000/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin/${admin}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin_password/${admin_password}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/shouquanma/${shouquanma}/g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin_password|${admin_password}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin|${admin}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|shouquanma|${shouquanma}|g" /home/docker/moontv/docker-compose.yml
cd /home/docker/moontv/
docker compose up -d
clear
@ -11016,7 +11020,7 @@ while true; do

docker run -d \
--name melody \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:5566 \
-v /home/docker/melody/.profile:/app/backend/.profile \
foamzou/melody:latest
@ -11045,7 +11049,7 @@ while true; do
docker_rum() {
docker run -d \
--name dosgame \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:262 \
oldiy/dosgame-web-docker:latest

@ -11075,7 +11079,7 @@ while true; do

docker run -d \
--name xunlei \
--restart unless-stopped \
--restart=always \
--privileged \
-e XL_DASHBOARD_USERNAME=${app_use} \
-e XL_DASHBOARD_PASSWORD=${app_passwd} \
@ -11137,7 +11141,7 @@ while true; do
mkdir -p /home/docker/beszel && \
docker run -d \
--name beszel \
--restart=unless-stopped \
--restart=always \
-v /home/docker/beszel:/beszel_data \
-p ${docker_port}:8090 \
henrygd/beszel
@ -11355,7 +11359,7 @@ while true; do
-v /home/docker/wallos/logos:/var/www/html/images/uploads/logos \
-e TZ=UTC \
-p ${docker_port}:80 \
--restart unless-stopped \
--restart=always \
bellamy/wallos:latest

}
@ -11432,7 +11436,7 @@ while true; do
--mount type=bind,source=/home/docker/jellyfin/media,target=/media \
-p ${docker_port}:8096 \
-p 7359:7359/udp \
--restart=unless-stopped \
--restart=always \
jellyfin/jellyfin


@ -11520,7 +11524,7 @@ while true; do
--name file-code-box \
-p ${docker_port}:12345 \
-v /home/docker/file-code-box/data:/app/data \
--restart unless-stopped \
--restart=always \
lanol/filecodebox:latest

}
@ -11561,7 +11565,7 @@ while true; do
--name matrix \
-v /home/docker/matrix/data:/data \
-p ${docker_port}:8008 \
--restart unless-stopped \
--restart=always \
matrixdotorg/synapse:latest

echo "创建初始用户或管理员。请设置以下内容用户名和密码以及是否为管理员。"
@ -11651,7 +11655,7 @@ while true; do

docker run -d \
--name filebrowser \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v /home/docker/filebrowser/data:/data \
-v /home/docker/filebrowser/config:/config \
@ -11680,14 +11684,14 @@ while true; do

docker run -d \
--name ${docker_name} \
--restart unless-stopped \
--restart=always \
-v /home/docker/${docker_name}:/data \
-p ${docker_port}:5000 \
${docker_img} /data -A

}

local docker_describe="Dufs 极简静态文件服务器,支持上传下载"
local docker_describe="极简静态文件服务器,支持上传下载"
local docker_url="官网介绍: https://github.com/sigoden/dufs"
local docker_use=""
local docker_passwd=""
@ -11710,7 +11714,7 @@ while true; do

docker run -d \
--name ${docker_name} \
--restart unless-stopped \
--restart=always \
-v /home/docker/${docker_name}/downloads:/app/Downloads \
-v /home/docker/${docker_name}/storage:/app/storage \
-p ${docker_port}:9999 \
@ -11718,7 +11722,7 @@ while true; do

}

local docker_describe="Gopeed 分布式高速下载工具,支持多种协议"
local docker_describe="分布式高速下载工具,支持多种协议"
local docker_url="官网介绍: https://github.com/GopeedLab/gopeed"
local docker_use=""
local docker_passwd=""
@ -11776,6 +11780,180 @@ while true; do
;;


97|wgs)

local app_id="97"
local docker_name="wireguard"
local docker_img="lscr.io/linuxserver/wireguard:latest"
local docker_port=8097

docker_rum() {

read -p "请输入组网的客户端数量 (默认 5): " COUNT
COUNT=${COUNT:-5}
read -p "请输入 WireGuard 网段 (默认 10.13.13.0): " NETWORK
NETWORK=${NETWORK:-10.13.13.0}

PEERS=$(seq -f "wg%02g" 1 "$COUNT" | paste -sd,)

ip link delete wg0 &>/dev/null

ip_address
docker run -d \
--name=wireguard \
--network host \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e SERVERURL=${ipv4_address} \
-e SERVERPORT=51820 \
-e PEERS=${PEERS} \
-e INTERNAL_SUBNET=${NETWORK} \
-e ALLOWEDIPS=${NETWORK}/24 \
-e PERSISTENTKEEPALIVE_PEERS=all \
-e LOG_CONFS=true \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules \
--restart=always \
lscr.io/linuxserver/wireguard:latest


sleep 3

docker exec wireguard sh -c "
f='/config/wg_confs/wg0.conf'
sed -i 's/51820/${docker_port}/g' \$f
"

docker exec wireguard sh -c "
for d in /config/peer_*; do
sed -i 's/51820/${docker_port}/g' \$d/*.conf
done
"

docker exec wireguard sh -c '
for d in /config/peer_*; do
sed -i "/^DNS/d" "$d"/*.conf
done
'

docker exec wireguard sh -c '
for d in /config/peer_*; do
for f in "$d"/*.conf; do
grep -q "^PersistentKeepalive" "$f" || \
sed -i "/^AllowedIPs/ a PersistentKeepalive = 25" "$f"
done
done
'

docker exec -it wireguard bash -c '
for d in /config/peer_*; do
cd "$d" || continue
conf_file=$(ls *.conf)
base_name="${conf_file%.conf}"
qrencode -o "$base_name.png" < "$conf_file"
done
'

docker restart wireguard

sleep 2
echo
echo -e "${gl_huang}所有客户端二维码配置: ${gl_bai}"
docker exec -it wireguard bash -c 'for i in $(ls /config | grep peer_ | sed "s/peer_//"); do echo "--- $i ---"; /app/show-peer $i; done'
sleep 2
echo
echo -e "${gl_huang}所有客户端配置代码: ${gl_bai}"
docker exec wireguard sh -c 'for d in /config/peer_*; do echo "# $(basename $d) "; cat $d/*.conf; echo; done'
sleep 2
echo -e "${gl_lv}${COUNT}个客户端配置全部输出,使用方法如下:${gl_bai}"
echo -e "${gl_lv}1. 手机下载wg的APP扫描上方二维码可以快速连接网络${gl_bai}"
echo -e "${gl_lv}2. Windows下载客户端复制配置代码连接网络。${gl_bai}"
echo -e "${gl_lv}3. Linux用脚本部署WG客户端复制配置代码连接网络。${gl_bai}"
echo -e "${gl_lv}官方客户端下载方式: https://www.wireguard.com/install/${gl_bai}"
break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;


98|wgc)

local app_id="98"
local docker_name="wireguardc"
local docker_img="kjlion/wireguard:alpine"
local docker_port=51820

docker_rum() {

mkdir -p /home/docker/wireguard/config/

local CONFIG_FILE="/home/docker/wireguard/config/wg0.conf"

# 创建目录(如果不存在)
mkdir -p "$(dirname "$CONFIG_FILE")"

echo "请粘贴你的客户端配置,连续按两次回车保存:"

# 初始化变量
input=""
empty_line_count=0

# 逐行读取用户输入
while IFS= read -r line; do
if [[ -z "$line" ]]; then
((empty_line_count++))
if [[ $empty_line_count -ge 2 ]]; then
break
fi
else
empty_line_count=0
input+="$line"$'\n'
fi
done

# 写入配置文件
echo "$input" > "$CONFIG_FILE"

echo "客户端配置已保存到 $CONFIG_FILE"

docker run -d \
--name wireguardc \
--network host \
--cap-add NET_ADMIN \
--cap-add SYS_MODULE \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules:ro \
--restart always \
kjlion/wireguard:alpine

sleep 3

docker logs wireguardc

break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;



b)
@ -14132,4 +14310,3 @@ else
;;
esac
fi


View file

@ -1288,3 +1288,6 @@ docker管理增加全局备份还原迁移功能。
应用市场新增gopeed分布式高速下载工具的安装及使用。
应用市场新增paperless文档管理平台的安装及使用。
------------------------
2025-08-27 v4.1.2
应用市场新增WireGuard异地隧道组网工具的安装及使用。
------------------------

View file

@ -1,5 +1,5 @@
#!/bin/bash
sh_v="4.1.0"
sh_v="4.1.2"


gl_hui='\e[37m'
@ -57,7 +57,7 @@ CheckFirstRun_true() {



# 기능 매장 지점 정보를 수집하는 기능, 현재 스크립트 버전 번호, 사용 시간, 시스템 버전, CPU 아키텍처, 컴퓨터 국가 및 사용자가 사용하는 기능 이름을 기록합니다. 그들은 절대적으로 민감한 정보를 포함하지 않습니다. 제발 나를 믿으세요!
# 기능 매장 지점 정보를 수집하는 기능, 현재 스크립트 버전 번호, 사용 시간, 시스템 버전, CPU 아키텍처, 기계 국가 및 사용자가 사용하는 기능 이름을 기록합니다. 그들은 절대적으로 민감한 정보를 포함하지 않습니다. 제발 나를 믿으세요!
# 이 기능을 설계 해야하는 이유는 무엇입니까? 목적은 사용자가 사용하는 기능을 더 잘 이해하고 기능을 더욱 최적화하여 사용자 요구를 충족시키는 더 많은 기능을 시작하는 것입니다.
# 전체 텍스트의 경우 Send_Stats 기능 호출 위치, 투명 및 오픈 소스를 검색 할 수 있으며 우려 사항이 있으면 사용을 거부 할 수 있습니다.

@ -349,22 +349,22 @@ kejilion() {



stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
install lsof
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}


check_port() {
install lsof

stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}

stop_containers_or_kill_process 80
stop_containers_or_kill_process 443
}
@ -1558,7 +1558,7 @@ fi

add_yuming() {
ip_address
echo -e "먼저 도메인 이름을 로컬 IP로 해결합니다.${gl_huang}$ipv4_address $ipv6_address${gl_bai}"
echo -e "먼저 도메인 이름을 기본 IP로 해결합니다.${gl_huang}$ipv4_address $ipv6_address${gl_bai}"
read -e -p "IP 또는 해결 된 도메인 이름을 입력하십시오." yuming
}

@ -2949,7 +2949,7 @@ docker network create $NETWORK_NAME
docker run -d \
--name=node-exporter \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
prom/node-exporter

# Run Prometheus container
@ -2958,7 +2958,7 @@ docker run -d \
-v $PROMETHEUS_DIR/prometheus.yml:/etc/prometheus/prometheus.yml \
-v $PROMETHEUS_DIR/data:/prometheus \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
--user 0:0 \
prom/prometheus:latest

@ -2968,7 +2968,7 @@ docker run -d \
-p ${docker_port}:3000 \
-v $GRAFANA_DIR:/var/lib/grafana \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
grafana/grafana:latest

}
@ -3037,7 +3037,7 @@ f2b_install_sshd() {
-v /path/to/fail2ban/config:/config \
-v /var/log:/var/log:ro \
-v /home/web/log/nginx/:/remotelogs/nginx:ro \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/fail2ban:latest

sleep 3
@ -6869,7 +6869,7 @@ docker_ssh_migration() {

list_backups() {
echo -e "${BLUE}현재 백업 목록 :${NC}"
ls -dt ${BACKUP_ROOT}/docker_backup_* 2>/dev/null || echo "백업 없음"
ls -1dt ${BACKUP_ROOT}/docker_backup_* 2>/dev/null || echo "백업 없음"
}


@ -6878,7 +6878,10 @@ docker_ssh_migration() {
# 지원
# ----------------------------
backup_docker() {
send_stats "도커 백업"

echo -e "${YELLOW}Docker 컨테이너 백업 ...${NC}"
docker ps --format '{{.Names}}'
read -p "백업 할 컨테이너 이름을 입력하십시오 (여러 공간으로 분리하면 입력 백업이 모두 실행 중입니다)." containers

install tar jq gzip
@ -6970,7 +6973,7 @@ docker_ssh_migration() {
# /home /docker 아래의 모든 파일을 백업 (하위 디렉터 제외)
if [ -d "/home/docker" ]; then
echo -e "${BLUE}/home /docker 아래 파일을 백업 ...${NC}"
find /home/docker -maxdepth 1 -type f -print0 | tar --null -czf "${BACKUP_DIR}/home_docker_files.tar.gz" --files-from -
find /home/docker -maxdepth 1 -type f | tar -czf "${BACKUP_DIR}/home_docker_files.tar.gz" -T -
echo -e "${GREEN}/home /docker의 파일은 다음과 같이 포장되었습니다.${BACKUP_DIR}/home_docker_files.tar.gz${NC}"
fi

@ -6985,7 +6988,8 @@ docker_ssh_migration() {
# 절감
# ----------------------------
restore_docker() {
list_backups

send_stats "도커 복원"
read -p "복원하려면 백업 디렉토리를 입력하십시오." BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}백업 디렉토리가 존재하지 않습니다${NC}"; return; }

@ -7103,8 +7107,8 @@ docker_ssh_migration() {
# 마이그레이션
# ----------------------------
migrate_docker() {
ensure_jq
list_backups
send_stats "도커 마이그레이션"
install jq
read -p "마이그레이션하려면 백업 디렉토리를 입력하십시오." BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}백업 디렉토리가 존재하지 않습니다${NC}"; return; }

@ -7125,7 +7129,7 @@ docker_ssh_migration() {
# 백업을 삭제하십시오
# ----------------------------
delete_backup() {
list_backups
send_stats "Docker 백업 파일 삭제"
read -p "삭제하려면 백업 디렉토리를 입력하십시오." BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}백업 디렉토리가 존재하지 않습니다${NC}"; return; }
rm -rf "$BACKUP_DIR"
@ -7136,6 +7140,7 @@ docker_ssh_migration() {
# 메인 메뉴
# ----------------------------
main_menu() {
send_stats "도커 백업 마이그레이션 및 복원"
while true; do
clear
echo "------------------------"
@ -7160,6 +7165,7 @@ docker_ssh_migration() {
0) return ;;
*) echo -e "${RED}잘못된 옵션${NC}" ;;
esac
break_end
done
}

@ -8866,6 +8872,9 @@ while true; do
echo -e "${gl_kjlan}89. ${color89}filecodebox 파일 Express${gl_kjlan}90. ${color90}매트릭스 분산 채팅 프로토콜"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}91. ${color91}Gitea 개인 코드 저장소${gl_kjlan}92. ${color92}파일 브라우저 파일 관리자"
echo -e "${gl_kjlan}93. ${color93}DUFS 미니멀리스트 정적 파일 서버${gl_kjlan}94. ${color94}고속 다운로드 도구"
echo -e "${gl_kjlan}95. ${color95}종이없는 문서 관리 플랫폼"
echo -e "${gl_kjlan}97. ${color97}와이어 가드 네트워킹 (서버 측)${gl_kjlan}98. ${color98}와이어 가드 네트워킹 (클라이언트)"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}b. ${gl_bai}모든 응용 프로그램 데이터를 백업합니다${gl_kjlan}r. ${gl_bai}모든 응용 프로그램 데이터를 복원하십시오"
echo -e "${gl_kjlan}------------------------"
@ -8990,6 +8999,9 @@ while true; do

docker_rum() {

mkdir -p /home/docker/openlist
chmod -R 777 /home/docker/openlist

docker run -d \
--restart=always \
-v /home/docker/openlist:/opt/openlist/data \
@ -9037,7 +9049,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:ubuntu-kde


@ -9119,7 +9131,7 @@ while true; do
-p 56881:56881/udp \
-v /home/docker/qbittorrent/config:/config \
-v /home/docker/qbittorrent/downloads:/downloads \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/qbittorrent:latest

}
@ -9354,7 +9366,7 @@ while true; do
-p ${docker_port}:5700 \
--name qinglong \
--hostname qinglong \
--restart unless-stopped \
--restart=always \
whyour/qinglong:latest


@ -9420,7 +9432,7 @@ while true; do
-e PGID=1000 \
-v /home/docker/easyimage/config:/app/web/config \
-v /home/docker/easyimage/i:/app/web/i \
--restart unless-stopped \
--restart=always \
ddsderek/easyimage:latest

}
@ -9737,7 +9749,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:latest

}
@ -9800,7 +9812,7 @@ while true; do

docker_rum() {

docker run -d --name dockge --restart unless-stopped -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge
docker run -d --name dockge --restart=always -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge

}

@ -9842,7 +9854,7 @@ while true; do

docker run -d \
--name searxng \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v "/home/docker/searxng:/etc/searxng" \
searxng/searxng
@ -9996,7 +10008,7 @@ while true; do

docker_rum() {

docker run -d --restart unless-stopped \
docker run -d --restart=always \
-p ${docker_port}:3000 \
-v /home/docker/moments/data:/app/data \
-v /etc/localtime:/etc/localtime:ro \
@ -10150,7 +10162,7 @@ while true; do
-e ENCRYPTION_KEY=${ENCRYPTION_KEY} \
-p ${docker_port}:6989 \
-v /home/docker/nexterm:/app/data \
--restart unless-stopped \
--restart=always \
germannewsmaker/nexterm:latest

}
@ -10171,7 +10183,7 @@ while true; do

docker_rum() {

docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbs
docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbs

}

@ -10192,7 +10204,7 @@ while true; do

docker_rum() {

docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbr
docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbr

}

@ -10301,7 +10313,7 @@ while true; do
docker run -d \
--name=node-exporter \
-p ${docker_port}:9100 \
--restart unless-stopped \
--restart=always \
prom/node-exporter


@ -10325,7 +10337,7 @@ while true; do

docker run -d \
--name=cadvisor \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
@ -10696,7 +10708,7 @@ while true; do
local docker_port=8064

docker_rum() {
docker run -d --name it-tools --restart unless-stopped -p ${docker_port}:80 corentinth/it-tools:latest
docker run -d --name it-tools --restart=always -p ${docker_port}:80 corentinth/it-tools:latest
}

local docker_describe="对开发人员和 IT 工作者来说非常有用的工具"
@ -10840,7 +10852,7 @@ while true; do
-p 6199:6199 \
-p 11451:11451 \
-v /home/docker/astrbot/data:/AstrBot/data \
--restart unless-stopped \
--restart=always \
--name astrbot \
soulter/astrbot:latest

@ -10865,7 +10877,7 @@ while true; do

docker run -d \
--name navidrome \
--restart=unless-stopped \
--restart=always \
--user $(id -u):$(id -g) \
-v /home/docker/navidrome/music:/music \
-v /home/docker/navidrome/data:/data \
@ -10927,7 +10939,7 @@ while true; do

docker run -d \
--name libretv \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-e PASSWORD=${app_passwd} \
bestzwei/libretv:latest
@ -10969,9 +10981,9 @@ while true; do

curl -o /home/docker/moontv/docker-compose.yml ${gh_proxy}raw.githubusercontent.com/kejilion/docker/main/moontv-docker-compose.yml
sed -i "s/3000:3000/${docker_port}:3000/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin/${admin}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin_password/${admin_password}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/shouquanma/${shouquanma}/g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin_password|${admin_password}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin|${admin}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|shouquanma|${shouquanma}|g" /home/docker/moontv/docker-compose.yml
cd /home/docker/moontv/
docker compose up -d
clear
@ -11008,7 +11020,7 @@ while true; do

docker run -d \
--name melody \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:5566 \
-v /home/docker/melody/.profile:/app/backend/.profile \
foamzou/melody:latest
@ -11037,7 +11049,7 @@ while true; do
docker_rum() {
docker run -d \
--name dosgame \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:262 \
oldiy/dosgame-web-docker:latest

@ -11067,7 +11079,7 @@ while true; do

docker run -d \
--name xunlei \
--restart unless-stopped \
--restart=always \
--privileged \
-e XL_DASHBOARD_USERNAME=${app_use} \
-e XL_DASHBOARD_PASSWORD=${app_passwd} \
@ -11129,7 +11141,7 @@ while true; do
mkdir -p /home/docker/beszel && \
docker run -d \
--name beszel \
--restart=unless-stopped \
--restart=always \
-v /home/docker/beszel:/beszel_data \
-p ${docker_port}:8090 \
henrygd/beszel
@ -11347,7 +11359,7 @@ while true; do
-v /home/docker/wallos/logos:/var/www/html/images/uploads/logos \
-e TZ=UTC \
-p ${docker_port}:80 \
--restart unless-stopped \
--restart=always \
bellamy/wallos:latest

}
@ -11424,7 +11436,7 @@ while true; do
--mount type=bind,source=/home/docker/jellyfin/media,target=/media \
-p ${docker_port}:8096 \
-p 7359:7359/udp \
--restart=unless-stopped \
--restart=always \
jellyfin/jellyfin


@ -11512,7 +11524,7 @@ while true; do
--name file-code-box \
-p ${docker_port}:12345 \
-v /home/docker/file-code-box/data:/app/data \
--restart unless-stopped \
--restart=always \
lanol/filecodebox:latest

}
@ -11553,7 +11565,7 @@ while true; do
--name matrix \
-v /home/docker/matrix/data:/data \
-p ${docker_port}:8008 \
--restart unless-stopped \
--restart=always \
matrixdotorg/synapse:latest

echo "초기 사용자 또는 관리자를 만듭니다. 다음 사용자 이름과 비밀번호와 관리자 여부를 설정하십시오."
@ -11643,7 +11655,7 @@ while true; do

docker run -d \
--name filebrowser \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v /home/docker/filebrowser/data:/data \
-v /home/docker/filebrowser/config:/config \
@ -11661,6 +11673,288 @@ while true; do

;;

93|dufs)

local app_id="93"
local docker_name="dufs"
local docker_img="sigoden/dufs"
local docker_port=8093

docker_rum() {

docker run -d \
--name ${docker_name} \
--restart=always \
-v /home/docker/${docker_name}:/data \
-p ${docker_port}:5000 \
${docker_img} /data -A

}

local docker_describe="极简静态文件服务器,支持上传下载"
local docker_url="官网介绍: https://github.com/sigoden/dufs"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;

94|gopeed)

local app_id="94"
local docker_name="gopeed"
local docker_img="liwei2633/gopeed"
local docker_port=8094

docker_rum() {

read -e -p "로그인 사용자 이름 설정 :" app_use
read -e -p "로그인 비밀번호 설정 :" app_passwd

docker run -d \
--name ${docker_name} \
--restart=always \
-v /home/docker/${docker_name}/downloads:/app/Downloads \
-v /home/docker/${docker_name}/storage:/app/storage \
-p ${docker_port}:9999 \
${docker_img} -u ${app_use} -p ${app_passwd}

}

local docker_describe="分布式高速下载工具,支持多种协议"
local docker_url="官网介绍: https://github.com/GopeedLab/gopeed"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;



95|paperless)

local app_id="95"

local app_name="paperless文档管理平台"
local app_text="开源的电子文档管理系统,它的主要用途是把你的纸质文件数字化并管理起来。"
local app_url="视频介绍: https://docs.paperless-ngx.com/"
local docker_name="paperless-webserver-1"
local docker_port="8095"
local app_size="2"

docker_app_install() {

mkdir -p /home/docker/paperless
mkdir -p /home/docker/paperless/export
mkdir -p /home/docker/paperless/consume
cd /home/docker/paperless

curl -o /home/docker/paperless/docker-compose.yml ${gh_proxy}raw.githubusercontent.com/paperless-ngx/paperless-ngx/refs/heads/main/docker/compose/docker-compose.postgres-tika.yml
curl -o /home/docker/paperless/docker-compose.env ${gh_proxy}raw.githubusercontent.com/paperless-ngx/paperless-ngx/refs/heads/main/docker/compose/.env

sed -i "s/8000:8000/${docker_port}:8000/g" /home/docker/paperless/docker-compose.yml
cd /home/docker/paperless
docker compose up -d
clear
echo "설치"
check_docker_app_ip
}


docker_app_update() {
cd /home/docker/paperless/ && docker compose down --rmi all
docker_app_install
}


docker_app_uninstall() {
cd /home/docker/paperless/ && docker compose down --rmi all
rm -rf /home/docker/paperless
echo "앱이 제거되었습니다"
}

docker_app_plus

;;


97|wgs)

local app_id="97"
local docker_name="wireguard"
local docker_img="lscr.io/linuxserver/wireguard:latest"
local docker_port=8097

docker_rum() {

read -p "네트워크를 구성하려면 클라이언트 수를 입력하십시오 (기본값 5)." COUNT
COUNT=${COUNT:-5}
read -p "Wireguard 세그먼트를 입력하십시오 (기본값 10.13.13.0) :" NETWORK
NETWORK=${NETWORK:-10.13.13.0}

PEERS=$(seq -f "wg%02g" 1 "$COUNT" | paste -sd,)

ip link delete wg0 &>/dev/null

ip_address
docker run -d \
--name=wireguard \
--network host \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e SERVERURL=${ipv4_address} \
-e SERVERPORT=51820 \
-e PEERS=${PEERS} \
-e INTERNAL_SUBNET=${NETWORK} \
-e ALLOWEDIPS=${NETWORK}/24 \
-e PERSISTENTKEEPALIVE_PEERS=all \
-e LOG_CONFS=true \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules \
--restart=always \
lscr.io/linuxserver/wireguard:latest


sleep 3

docker exec wireguard sh -c "
f='/config/wg_confs/wg0.conf'
sed -i 's/51820/${docker_port}/g' \$f
"

docker exec wireguard sh -c "
for d in /config/peer_*; do
sed -i 's/51820/${docker_port}/g' \$d/*.conf
done
"

docker exec wireguard sh -c '
for d in /config/peer_*; do
sed -i "/^DNS/d" "$d"/*.conf
done
'

docker exec wireguard sh -c '
for d in /config/peer_*; do
for f in "$d"/*.conf; do
grep -q "^PersistentKeepalive" "$f" || \
sed -i "/^AllowedIPs/ a PersistentKeepalive = 25" "$f"
done
done
'

docker exec -it wireguard bash -c '
for d in /config/peer_*; do
cd "$d" || continue
conf_file=$(ls *.conf)
base_name="${conf_file%.conf}"
qrencode -o "$base_name.png" < "$conf_file"
done
'

docker restart wireguard

sleep 2
echo
echo -e "${gl_huang}모든 클라이언트 QR 코드 구성 :${gl_bai}"
docker exec -it wireguard bash -c 'for i in $(ls /config | grep peer_ | sed "s/peer_//"); do echo "--- $i ---"; /app/show-peer $i; done'
sleep 2
echo
echo -e "${gl_huang}모든 클라이언트 구성 코드 :${gl_bai}"
docker exec wireguard sh -c 'for d in /config/peer_*; do echo "# $(basename $d) "; cat $d/*.conf; echo; done'
sleep 2
echo -e "${gl_lv}${COUNT}모든 출력은 각 클라이언트가 제공합니다. 사용법은 다음과 같습니다.${gl_bai}"
echo -e "${gl_lv}1. 휴대 전화에서 WG의 앱을 다운로드하고 위의 QR 코드를 스캔하여 네트워크에 빠르게 연결하십시오.${gl_bai}"
echo -e "${gl_lv}2. Windows 클라이언트를 다운로드하고 구성 코드를 복사하여 네트워크에 연결하십시오.${gl_bai}"
echo -e "${gl_lv}3. Linux는 스크립트를 사용하여 WG 클라이언트를 배포하고 구성 코드를 복사하여 네트워크에 연결합니다.${gl_bai}"
echo -e "${gl_lv}공식 클라이언트 다운로드 방법 : https://www.wireguard.com/install/${gl_bai}"
break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;


98|wgc)

local app_id="98"
local docker_name="wireguardc"
local docker_img="kjlion/wireguard:alpine"
local docker_port=51820

docker_rum() {

mkdir -p /home/docker/wireguard/config/

local CONFIG_FILE="/home/docker/wireguard/config/wg0.conf"

# 디렉토리 생성 (존재하지 않는 경우)
mkdir -p "$(dirname "$CONFIG_FILE")"

echo "클라이언트 구성을 붙여 넣고 다음을 저장하려면 Enter Enter를 두 번 누릅니다."

# 변수 초기화
input=""
empty_line_count=0

# 사용자 입력 라인별로 읽으십시오
while IFS= read -r line; do
if [[ -z "$line" ]]; then
((empty_line_count++))
if [[ $empty_line_count -ge 2 ]]; then
break
fi
else
empty_line_count=0
input+="$line"$'\n'
fi
done

# 구성 파일에 쓰십시오
echo "$input" > "$CONFIG_FILE"

echo "클라이언트 구성이 저장되었습니다$CONFIG_FILE"

docker run -d \
--name wireguardc \
--network host \
--cap-add NET_ADMIN \
--cap-add SYS_MODULE \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules:ro \
--restart always \
kjlion/wireguard:alpine

sleep 3

docker logs wireguardc

break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;



b)
clear
@ -14016,4 +14310,3 @@ else
;;
esac
fi


View file

@ -1,5 +1,5 @@
#!/bin/bash
sh_v="4.1.0"
sh_v="4.1.2"


gl_hui='\e[37m'
@ -349,22 +349,22 @@ kejilion() {



stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
install lsof
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}


check_port() {
install lsof

stop_containers_or_kill_process() {
local port=$1
local containers=$(docker ps --filter "publish=$port" --format "{{.ID}}" 2>/dev/null)

if [ -n "$containers" ]; then
docker stop $containers
else
for pid in $(lsof -t -i:$port); do
kill -9 $pid
done
fi
}

stop_containers_or_kill_process 80
stop_containers_or_kill_process 443
}
@ -2949,7 +2949,7 @@ docker network create $NETWORK_NAME
docker run -d \
--name=node-exporter \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
prom/node-exporter

# Run Prometheus container
@ -2958,7 +2958,7 @@ docker run -d \
-v $PROMETHEUS_DIR/prometheus.yml:/etc/prometheus/prometheus.yml \
-v $PROMETHEUS_DIR/data:/prometheus \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
--user 0:0 \
prom/prometheus:latest

@ -2968,7 +2968,7 @@ docker run -d \
-p ${docker_port}:3000 \
-v $GRAFANA_DIR:/var/lib/grafana \
--network $NETWORK_NAME \
--restart unless-stopped \
--restart=always \
grafana/grafana:latest

}
@ -3037,7 +3037,7 @@ f2b_install_sshd() {
-v /path/to/fail2ban/config:/config \
-v /var/log:/var/log:ro \
-v /home/web/log/nginx/:/remotelogs/nginx:ro \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/fail2ban:latest

sleep 3
@ -6869,7 +6869,7 @@ docker_ssh_migration() {

list_backups() {
echo -e "${BLUE}當前備份列表:${NC}"
ls -dt ${BACKUP_ROOT}/docker_backup_* 2>/dev/null || echo "無備份"
ls -1dt ${BACKUP_ROOT}/docker_backup_* 2>/dev/null || echo "無備份"
}


@ -6878,7 +6878,10 @@ docker_ssh_migration() {
# 備份
# ----------------------------
backup_docker() {
send_stats "Docker備份"

echo -e "${YELLOW}正在備份 Docker 容器...${NC}"
docker ps --format '{{.Names}}'
read -p "請輸入要備份的容器名(多個空格分隔,回車備份全部運行中容器):" containers

install tar jq gzip
@ -6970,7 +6973,7 @@ docker_ssh_migration() {
# 備份 /home/docker 下的所有文件(不含子目錄)
if [ -d "/home/docker" ]; then
echo -e "${BLUE}備份 /home/docker 下的文件...${NC}"
find /home/docker -maxdepth 1 -type f -print0 | tar --null -czf "${BACKUP_DIR}/home_docker_files.tar.gz" --files-from -
find /home/docker -maxdepth 1 -type f | tar -czf "${BACKUP_DIR}/home_docker_files.tar.gz" -T -
echo -e "${GREEN}/home/docker 下的文件已打包到:${BACKUP_DIR}/home_docker_files.tar.gz${NC}"
fi

@ -6985,7 +6988,8 @@ docker_ssh_migration() {
# 還原
# ----------------------------
restore_docker() {
list_backups

send_stats "Docker還原"
read -p "請輸入要還原的備份目錄:" BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}備份目錄不存在${NC}"; return; }

@ -7103,8 +7107,8 @@ docker_ssh_migration() {
# 遷移
# ----------------------------
migrate_docker() {
ensure_jq
list_backups
send_stats "Docker遷移"
install jq
read -p "請輸入要遷移的備份目錄:" BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}備份目錄不存在${NC}"; return; }

@ -7125,7 +7129,7 @@ docker_ssh_migration() {
# 刪除備份
# ----------------------------
delete_backup() {
list_backups
send_stats "Docker備份文件刪除"
read -p "請輸入要刪除的備份目錄:" BACKUP_DIR
[[ ! -d "$BACKUP_DIR" ]] && { echo -e "${RED}備份目錄不存在${NC}"; return; }
rm -rf "$BACKUP_DIR"
@ -7136,6 +7140,7 @@ docker_ssh_migration() {
# 主菜單
# ----------------------------
main_menu() {
send_stats "Docker備份遷移還原"
while true; do
clear
echo "------------------------"
@ -7160,6 +7165,7 @@ docker_ssh_migration() {
0) return ;;
*) echo -e "${RED}無效選項${NC}" ;;
esac
break_end
done
}

@ -8866,6 +8872,9 @@ while true; do
echo -e "${gl_kjlan}89. ${color89}FileCodeBox文件快遞${gl_kjlan}90. ${color90}matrix去中心化聊天協議"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}91. ${color91}gitea私有代碼倉庫${gl_kjlan}92. ${color92}FileBrowser文件管理器"
echo -e "${gl_kjlan}93. ${color93}Dufs極簡靜態文件服務器${gl_kjlan}94. ${color94}Gopeed高速下載工具"
echo -e "${gl_kjlan}95. ${color95}paperless文檔管理平台"
echo -e "${gl_kjlan}97. ${color97}WireGuard組網(服務端)${gl_kjlan}98. ${color98}WireGuard組網(客戶端)"
echo -e "${gl_kjlan}------------------------"
echo -e "${gl_kjlan}b. ${gl_bai}備份全部應用數據${gl_kjlan}r. ${gl_bai}還原全部應用數據"
echo -e "${gl_kjlan}------------------------"
@ -8990,6 +8999,9 @@ while true; do

docker_rum() {

mkdir -p /home/docker/openlist
chmod -R 777 /home/docker/openlist

docker run -d \
--restart=always \
-v /home/docker/openlist:/opt/openlist/data \
@ -9037,7 +9049,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:ubuntu-kde


@ -9119,7 +9131,7 @@ while true; do
-p 56881:56881/udp \
-v /home/docker/qbittorrent/config:/config \
-v /home/docker/qbittorrent/downloads:/downloads \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/qbittorrent:latest

}
@ -9354,7 +9366,7 @@ while true; do
-p ${docker_port}:5700 \
--name qinglong \
--hostname qinglong \
--restart unless-stopped \
--restart=always \
whyour/qinglong:latest


@ -9420,7 +9432,7 @@ while true; do
-e PGID=1000 \
-v /home/docker/easyimage/config:/app/web/config \
-v /home/docker/easyimage/i:/app/web/i \
--restart unless-stopped \
--restart=always \
ddsderek/easyimage:latest

}
@ -9737,7 +9749,7 @@ while true; do
-v /home/docker/webtop/data:/config \
-v /var/run/docker.sock:/var/run/docker.sock \
--shm-size="1gb" \
--restart unless-stopped \
--restart=always \
lscr.io/linuxserver/webtop:latest

}
@ -9800,7 +9812,7 @@ while true; do

docker_rum() {

docker run -d --name dockge --restart unless-stopped -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge
docker run -d --name dockge --restart=always -p ${docker_port}:5001 -v /var/run/docker.sock:/var/run/docker.sock -v /home/docker/dockge/data:/app/data -v /home/docker/dockge/stacks:/home/docker/dockge/stacks -e DOCKGE_STACKS_DIR=/home/docker/dockge/stacks louislam/dockge

}

@ -9842,7 +9854,7 @@ while true; do

docker run -d \
--name searxng \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v "/home/docker/searxng:/etc/searxng" \
searxng/searxng
@ -9996,7 +10008,7 @@ while true; do

docker_rum() {

docker run -d --restart unless-stopped \
docker run -d --restart=always \
-p ${docker_port}:3000 \
-v /home/docker/moments/data:/app/data \
-v /etc/localtime:/etc/localtime:ro \
@ -10150,7 +10162,7 @@ while true; do
-e ENCRYPTION_KEY=${ENCRYPTION_KEY} \
-p ${docker_port}:6989 \
-v /home/docker/nexterm:/app/data \
--restart unless-stopped \
--restart=always \
germannewsmaker/nexterm:latest

}
@ -10171,7 +10183,7 @@ while true; do

docker_rum() {

docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbs
docker run --name hbbs -v /home/docker/hbbs/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbs

}

@ -10192,7 +10204,7 @@ while true; do

docker_rum() {

docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart unless-stopped rustdesk/rustdesk-server hbbr
docker run --name hbbr -v /home/docker/hbbr/data:/root -td --net=host --restart=always rustdesk/rustdesk-server hbbr

}

@ -10301,7 +10313,7 @@ while true; do
docker run -d \
--name=node-exporter \
-p ${docker_port}:9100 \
--restart unless-stopped \
--restart=always \
prom/node-exporter


@ -10325,7 +10337,7 @@ while true; do

docker run -d \
--name=cadvisor \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
@ -10696,7 +10708,7 @@ while true; do
local docker_port=8064

docker_rum() {
docker run -d --name it-tools --restart unless-stopped -p ${docker_port}:80 corentinth/it-tools:latest
docker run -d --name it-tools --restart=always -p ${docker_port}:80 corentinth/it-tools:latest
}

local docker_describe="对开发人员和 IT 工作者来说非常有用的工具"
@ -10840,7 +10852,7 @@ while true; do
-p 6199:6199 \
-p 11451:11451 \
-v /home/docker/astrbot/data:/AstrBot/data \
--restart unless-stopped \
--restart=always \
--name astrbot \
soulter/astrbot:latest

@ -10865,7 +10877,7 @@ while true; do

docker run -d \
--name navidrome \
--restart=unless-stopped \
--restart=always \
--user $(id -u):$(id -g) \
-v /home/docker/navidrome/music:/music \
-v /home/docker/navidrome/data:/data \
@ -10927,7 +10939,7 @@ while true; do

docker run -d \
--name libretv \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-e PASSWORD=${app_passwd} \
bestzwei/libretv:latest
@ -10969,9 +10981,9 @@ while true; do

curl -o /home/docker/moontv/docker-compose.yml ${gh_proxy}raw.githubusercontent.com/kejilion/docker/main/moontv-docker-compose.yml
sed -i "s/3000:3000/${docker_port}:3000/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin/${admin}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/admin_password/${admin_password}/g" /home/docker/moontv/docker-compose.yml
sed -i "s/shouquanma/${shouquanma}/g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin_password|${admin_password}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|admin|${admin}|g" /home/docker/moontv/docker-compose.yml
sed -i "s|shouquanma|${shouquanma}|g" /home/docker/moontv/docker-compose.yml
cd /home/docker/moontv/
docker compose up -d
clear
@ -11008,7 +11020,7 @@ while true; do

docker run -d \
--name melody \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:5566 \
-v /home/docker/melody/.profile:/app/backend/.profile \
foamzou/melody:latest
@ -11037,7 +11049,7 @@ while true; do
docker_rum() {
docker run -d \
--name dosgame \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:262 \
oldiy/dosgame-web-docker:latest

@ -11067,7 +11079,7 @@ while true; do

docker run -d \
--name xunlei \
--restart unless-stopped \
--restart=always \
--privileged \
-e XL_DASHBOARD_USERNAME=${app_use} \
-e XL_DASHBOARD_PASSWORD=${app_passwd} \
@ -11129,7 +11141,7 @@ while true; do
mkdir -p /home/docker/beszel && \
docker run -d \
--name beszel \
--restart=unless-stopped \
--restart=always \
-v /home/docker/beszel:/beszel_data \
-p ${docker_port}:8090 \
henrygd/beszel
@ -11347,7 +11359,7 @@ while true; do
-v /home/docker/wallos/logos:/var/www/html/images/uploads/logos \
-e TZ=UTC \
-p ${docker_port}:80 \
--restart unless-stopped \
--restart=always \
bellamy/wallos:latest

}
@ -11424,7 +11436,7 @@ while true; do
--mount type=bind,source=/home/docker/jellyfin/media,target=/media \
-p ${docker_port}:8096 \
-p 7359:7359/udp \
--restart=unless-stopped \
--restart=always \
jellyfin/jellyfin


@ -11512,7 +11524,7 @@ while true; do
--name file-code-box \
-p ${docker_port}:12345 \
-v /home/docker/file-code-box/data:/app/data \
--restart unless-stopped \
--restart=always \
lanol/filecodebox:latest

}
@ -11553,7 +11565,7 @@ while true; do
--name matrix \
-v /home/docker/matrix/data:/data \
-p ${docker_port}:8008 \
--restart unless-stopped \
--restart=always \
matrixdotorg/synapse:latest

echo "創建初始用戶或管理員。請設置以下內容用戶名和密碼以及是否為管理員。"
@ -11643,7 +11655,7 @@ while true; do

docker run -d \
--name filebrowser \
--restart unless-stopped \
--restart=always \
-p ${docker_port}:8080 \
-v /home/docker/filebrowser/data:/data \
-v /home/docker/filebrowser/config:/config \
@ -11661,6 +11673,288 @@ while true; do

;;

93|dufs)

local app_id="93"
local docker_name="dufs"
local docker_img="sigoden/dufs"
local docker_port=8093

docker_rum() {

docker run -d \
--name ${docker_name} \
--restart=always \
-v /home/docker/${docker_name}:/data \
-p ${docker_port}:5000 \
${docker_img} /data -A

}

local docker_describe="极简静态文件服务器,支持上传下载"
local docker_url="官网介绍: https://github.com/sigoden/dufs"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;

94|gopeed)

local app_id="94"
local docker_name="gopeed"
local docker_img="liwei2633/gopeed"
local docker_port=8094

docker_rum() {

read -e -p "設置登錄用戶名:" app_use
read -e -p "設置登錄密碼:" app_passwd

docker run -d \
--name ${docker_name} \
--restart=always \
-v /home/docker/${docker_name}/downloads:/app/Downloads \
-v /home/docker/${docker_name}/storage:/app/storage \
-p ${docker_port}:9999 \
${docker_img} -u ${app_use} -p ${app_passwd}

}

local docker_describe="分布式高速下载工具,支持多种协议"
local docker_url="官网介绍: https://github.com/GopeedLab/gopeed"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;



95|paperless)

local app_id="95"

local app_name="paperless文档管理平台"
local app_text="开源的电子文档管理系统,它的主要用途是把你的纸质文件数字化并管理起来。"
local app_url="视频介绍: https://docs.paperless-ngx.com/"
local docker_name="paperless-webserver-1"
local docker_port="8095"
local app_size="2"

docker_app_install() {

mkdir -p /home/docker/paperless
mkdir -p /home/docker/paperless/export
mkdir -p /home/docker/paperless/consume
cd /home/docker/paperless

curl -o /home/docker/paperless/docker-compose.yml ${gh_proxy}raw.githubusercontent.com/paperless-ngx/paperless-ngx/refs/heads/main/docker/compose/docker-compose.postgres-tika.yml
curl -o /home/docker/paperless/docker-compose.env ${gh_proxy}raw.githubusercontent.com/paperless-ngx/paperless-ngx/refs/heads/main/docker/compose/.env

sed -i "s/8000:8000/${docker_port}:8000/g" /home/docker/paperless/docker-compose.yml
cd /home/docker/paperless
docker compose up -d
clear
echo "已經安裝完成"
check_docker_app_ip
}


docker_app_update() {
cd /home/docker/paperless/ && docker compose down --rmi all
docker_app_install
}


docker_app_uninstall() {
cd /home/docker/paperless/ && docker compose down --rmi all
rm -rf /home/docker/paperless
echo "應用已卸載"
}

docker_app_plus

;;


97|wgs)

local app_id="97"
local docker_name="wireguard"
local docker_img="lscr.io/linuxserver/wireguard:latest"
local docker_port=8097

docker_rum() {

read -p "請輸入組網的客戶端數量 (默認 5):" COUNT
COUNT=${COUNT:-5}
read -p "請輸入 WireGuard 網段 (默認 10.13.13.0):" NETWORK
NETWORK=${NETWORK:-10.13.13.0}

PEERS=$(seq -f "wg%02g" 1 "$COUNT" | paste -sd,)

ip link delete wg0 &>/dev/null

ip_address
docker run -d \
--name=wireguard \
--network host \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e SERVERURL=${ipv4_address} \
-e SERVERPORT=51820 \
-e PEERS=${PEERS} \
-e INTERNAL_SUBNET=${NETWORK} \
-e ALLOWEDIPS=${NETWORK}/24 \
-e PERSISTENTKEEPALIVE_PEERS=all \
-e LOG_CONFS=true \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules \
--restart=always \
lscr.io/linuxserver/wireguard:latest


sleep 3

docker exec wireguard sh -c "
f='/config/wg_confs/wg0.conf'
sed -i 's/51820/${docker_port}/g' \$f
"

docker exec wireguard sh -c "
for d in /config/peer_*; do
sed -i 's/51820/${docker_port}/g' \$d/*.conf
done
"

docker exec wireguard sh -c '
for d in /config/peer_*; do
sed -i "/^DNS/d" "$d"/*.conf
done
'

docker exec wireguard sh -c '
for d in /config/peer_*; do
for f in "$d"/*.conf; do
grep -q "^PersistentKeepalive" "$f" || \
sed -i "/^AllowedIPs/ a PersistentKeepalive = 25" "$f"
done
done
'

docker exec -it wireguard bash -c '
for d in /config/peer_*; do
cd "$d" || continue
conf_file=$(ls *.conf)
base_name="${conf_file%.conf}"
qrencode -o "$base_name.png" < "$conf_file"
done
'

docker restart wireguard

sleep 2
echo
echo -e "${gl_huang}所有客戶端二維碼配置:${gl_bai}"
docker exec -it wireguard bash -c 'for i in $(ls /config | grep peer_ | sed "s/peer_//"); do echo "--- $i ---"; /app/show-peer $i; done'
sleep 2
echo
echo -e "${gl_huang}所有客戶端配置代碼:${gl_bai}"
docker exec wireguard sh -c 'for d in /config/peer_*; do echo "# $(basename $d) "; cat $d/*.conf; echo; done'
sleep 2
echo -e "${gl_lv}${COUNT}個客戶端配置全部輸出,使用方法如下:${gl_bai}"
echo -e "${gl_lv}1. 手機下載wg的APP掃描上方二維碼可以快速連接網絡${gl_bai}"
echo -e "${gl_lv}2. Windows下載客戶端複製配置代碼連接網絡。${gl_bai}"
echo -e "${gl_lv}3. Linux用腳本部署WG客戶端複製配置代碼連接網絡。${gl_bai}"
echo -e "${gl_lv}官方客戶端下載方式: https://www.wireguard.com/install/${gl_bai}"
break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;


98|wgc)

local app_id="98"
local docker_name="wireguardc"
local docker_img="kjlion/wireguard:alpine"
local docker_port=51820

docker_rum() {

mkdir -p /home/docker/wireguard/config/

local CONFIG_FILE="/home/docker/wireguard/config/wg0.conf"

# 創建目錄(如果不存在)
mkdir -p "$(dirname "$CONFIG_FILE")"

echo "請粘貼你的客戶端配置,連續按兩次回車保存:"

# 初始化變量
input=""
empty_line_count=0

# 逐行讀取用戶輸入
while IFS= read -r line; do
if [[ -z "$line" ]]; then
((empty_line_count++))
if [[ $empty_line_count -ge 2 ]]; then
break
fi
else
empty_line_count=0
input+="$line"$'\n'
fi
done

# 寫入配置文件
echo "$input" > "$CONFIG_FILE"

echo "客戶端配置已保存到$CONFIG_FILE"

docker run -d \
--name wireguardc \
--network host \
--cap-add NET_ADMIN \
--cap-add SYS_MODULE \
-v /home/docker/wireguard/config:/config \
-v /lib/modules:/lib/modules:ro \
--restart always \
kjlion/wireguard:alpine

sleep 3

docker logs wireguardc

break_end

}

local docker_describe="现代化、高性能的虚拟专用网络工具"
local docker_url="官网介绍: https://www.wireguard.com/"
local docker_use=""
local docker_passwd=""
local app_size="1"
docker_app

;;



b)
clear
@ -14016,4 +14310,3 @@ else
;;
esac
fi