Ubuntu Server 20.04

在 Ubuntu Server 20.04 系统中,使用的 Docker 脚本。


Alist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Alist V3

function alist_install(){
curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install /root/docker
ufw allow 5244/tcp
yellow "-----------------------------------------------"
green " Web 端口:5244"
echo
green " Web 网站 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):5244"
echo
green " Alist 安装完毕!"
yellow "-----------------------------------------------"
}

function alist_update(){
curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s update /root/docker
green "Alist 更新完毕"
}

function alist_uninstall(){
curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s uninstall /root/docker
green "Alist 卸载完毕"
}

function start_menu(){
clear
yellow "-----------------------------------------------"
red " Alist —— 本地网盘挂载"
yellow "-----------------------------------------------"
green " 1. Alist 安装"
green " 2. Alist 更新"
green " 3. Alist 卸载"
yellow "-----------------------------------------------"
red " 0. 退出脚本"
echo
read -p "请输入数字:" menuNumberInput
case "$menuNumberInput" in
1 )
alist_install
;;
2 )
alist_update
;;
3 )
alist_uninstall
;;
0 )
exit
;;
* )
clear
red "请输入正确数字!"
start_menu
;;
esac
}
start_menu

Nginx Proxy Manager

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Nginx Proxy Manager

function nginx-proxy-manager_install(){
if nc -z localhost 80 || nc -z localhost 81 || nc -z localhost 443; then
echo " 端口 80、81 或 443 已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "npm"; then
echo " npm 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Nginx-Proxy-Manager ]; then
mkdir -p /root/docker/Nginx-Proxy-Manager
fi
cd /root/docker/Nginx-Proxy-Manager
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
EOF
docker-compose up -d
ufw allow 80/tcp
ufw allow 81/tcp
ufw allow 443/tcp
yellow "-----------------------------------------------"
green " Web 端口:80 81 443"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):81"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):81"
echo
green " 初始帐号 admin@example.com"
green " 初始密码 changeme"
echo
green " Nginx Proxy Manager 安装完毕!"
yellow "-----------------------------------------------"
}
nginx-proxy-manager_install

Frps

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Frps

function frps_install(){
if docker ps -a --format "{{.Names}}" | grep -q "frps"; then
echo " frps 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Frps ]; then
mkdir -p /root/docker/Frps
fi
cd /root/docker/Frps
if [ -f "frps.ini" ]; then
green " 文件已经存在, 跳过创建步骤."
else
cat <<EOF > frps.ini
# frps.ini
[common]

bind_port= 52244
kcp_bind_port = 52244

dashboard_user= admin
dashboard_pwd= passwd
dashboard_port= 9527

token = frps.rahn.top
EOF
green " frps.ini 创建成功"
fi
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
frps:
restart: always
network_mode: host
volumes:
- './frps.ini:/etc/frp/frps.ini'
container_name: frps
image: snowdreamtech/frps
EOF
docker-compose up -d
ufw allow 9527/tcp
ufw allow 52244/tcp
yellow "-----------------------------------------------"
green " Web 端口:9527"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):9527"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):9527"
echo
green " 登陆账号:admin"
green " 登陆账号:passwd"
echo
green " token:frps.rahn.top"
echo
green " Frps 安装完毕!"
yellow "-----------------------------------------------"
}
frps_install

Frpc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Frpc

function frpc_install(){
if docker ps -a --format "{{.Names}}" | grep -q "frpc"; then
echo " frpc 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Frpc ]; then
mkdir -p /root/docker/Frpc
fi
cd /root/docker/Frpc
if [ -f "frpc.ini" ]; then
green " 文件已经存在, 跳过创建步骤."
else
cat <<EOF > frpc.ini
# frpc.ini
[common]
server_addr = 45.76.126.21
server_port = 52244
token = PyAXaSbAfiaTHXDAHmj5AuRj

[alist]
type = tcp
local_ip = 127.0.0.1
local_port = 5244
remote_port = 7000
custom_domains = nasalist.rahn.top
EOF
green " frpc.ini 创建成功"
fi
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
frpc:
restart: always
network_mode: host
volumes:
- './frpc.ini:/etc/frp/frpc.ini'
container_name: frpc
image: snowdreamtech/frpc

EOF
docker-compose up -d
yellow "-----------------------------------------------"
green " 服务器 IP = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}')"
echo
green " Frpc 安装完毕!"
yellow "-----------------------------------------------"
}
frpc_install

Yourls

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Yourls

function yourls_install(){
if nc -z localhost 8200; then
echo " 8200 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "yourls" && docker ps -a --format "{{.Names}}" | grep -q "yourls_mysql"; then
echo " yourls yourls_mysql 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Yourls ]; then
mkdir -p /root/docker/Yourls
fi
cd /root/docker/Yourls
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "3.5"
services:

mysql:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=yourls
- MYSQL_DATABASE=yourls
- MYSQL_USER=yourls
- MYSQL_PASSWORD=yourls
volumes:
- ./mysql/db/:/var/lib/mysql
- ./mysql/conf/:/etc/mysql/conf.d
restart: always
container_name: yourls_mysql

yourls:
image: yourls
restart: always
ports:
- "8200:80"
environment:
YOURLS_DB_HOST: mysql
YOURLS_DB_USER: yourls
YOURLS_DB_PASS: yourls
YOURLS_DB_NAME: yourls
YOURLS_USER: admin
YOURLS_PASS: passwd
YOURLS_SITE: https://rahn.top
volumes:
- ./yourls/:/var/www/html
container_name: yourls
links:
- mysql:mysql
EOF
docker-compose up -d
ufw allow 8200/tcp
yellow "-----------------------------------------------"
green " Web 端口:8200"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8200"
echo
green " Web 网址 = https://rahn.top/admin"
echo
green " 登陆账号:admin"
green " 登陆密码:passwd"
echo
green " Yourls 安装完毕!"
yellow "-----------------------------------------------"
}
yourls_install

Hnet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Hnet

function hnet_install(){
if nc -z localhost 5120; then
echo " 5120 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "hnet"; then
echo " hnet 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/HNet ]; then
mkdir -p /root/docker/HNet
fi
cd /root/docker/HNet
if [ -d "web" ]; then
green " web 文件夹已经存在, 跳过执行 docker cp 命令"
else
docker run -itd --name hnet -p 5120:56559 rahn2029/hnet-web:2.0
docker cp hnet:web $(pwd)/
docker stop hnet && docker rm hnet
fi
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
hideipnetwork-web:
container_name: hnet
ports:
- 5120:56559
volumes:
- ./web:/web
image: rahn2029/hnet-web:2.0
restart: always
EOF
docker-compose up -d
ufw allow 5120/tcp
yellow "-----------------------------------------------"
green " Web 端口:5120"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):5120"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):5120"
echo
green " HNet 安装完毕!"
yellow "-----------------------------------------------"
}
hnet_install

Tachidesk Server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Tachidesk Server

function tachidesk-server_install(){
if nc -z localhost 4567; then
green " 4567 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "tachidesk"; then
green " tachidesk 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Tachidesk ]; then
mkdir -p /root/docker/Tachidesk
fi
cd /root/docker/Tachidesk
if [ -d "data" ]; then
chmod -R 777 data
green " data 文件夹已经存在, 跳过执行 docker cp 命令"
else
docker run -itd -p 4567:4567 --name tachidesk rahn2029/tachidesk
docker cp tachidesk:/home/suwayomi/.local/share/Tachidesk $(pwd)/data
chmod -R 777 data
docker stop tachidesk && docker rm tachidesk
fi
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
suwayomi:
image: rahn2029/tachidesk
container_name: tachidesk
environment:
- TZ=Asia/Shanghai
volumes:
- ./data:/./home/suwayomi/.local/share/Tachidesk
ports:
- 4567:4567
restart: always
EOF
docker-compose up -d
ufw allow 4567/tcp
yellow "-----------------------------------------------"
green " Web 端口:4567"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):4567"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):4567"
echo
green " Tachidesk 安装完毕!"
yellow "-----------------------------------------------"
}
tachidesk-server_install

Portainer-ce

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Portainer

function portainer_install(){
if nc -z localhost 9000; then
echo " 9000 端口已经被占用,请检查相关进程。"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "portainer"; then
echo " portainer 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Portainer ]; then
mkdir -p /root/docker/Portainer
fi
cd /root/docker/Portainer
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
portainer-ce:
restart: always
container_name: portainer
ports:
- '9000:9000'
volumes:
- '/var/run/docker.sock:/var/run/docker.sock'
image: rahn2029/portainer-ce
EOF
docker-compose up -d
ufw allow 9000/tcp
yellow "-----------------------------------------------"
green " Web 端口:9000"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):9000"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):9000"
echo
green " Portainer-ce 安装完毕!"
yellow "-----------------------------------------------"
}
portainer_install

Minimalist Web Notepad

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Minimalist Web Notepad

function minimalist-web-notepad_install(){
if nc -z localhost 8006; then
echo " 8006 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "minimalist-web-notepad"; then
echo " minimalist-web-notepad 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Minimalist-Web-Notepad ]; then
mkdir -p /root/docker/Minimalist-Web-Notepad
fi
cd /root/docker/Minimalist-Web-Notepad
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
minimalist-web-notepad:
restart: always
container_name: minimalist-web-notepad
volumes:
- './data:/var/www/html/_tmp'
ports:
- '8006:80'
image: rahn2029/minimalist-web-notepad
EOF
docker-compose up -d
ufw allow 8006/tcp
yellow "-----------------------------------------------"
green " Web 端口:8006"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8006"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):8006"
echo
green " Minimalist Web Notepad 安装完毕!"
yellow "-----------------------------------------------"
}
minimalist-web-notepad_install

Vaultwarden

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Vaultwarden

function vaultwarden_install(){
if nc -z localhost 8000; then
echo " 8000 端口已经被占用,请检查相关进程。"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "vaultwarden"; then
echo " vaultwarden 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Vaultwarden ]; then
mkdir -p /root/docker/Vaultwarden
fi
cd /root/docker/Vaultwarden
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
server:
container_name: vaultwarden
restart: unless-stopped
environment:
- SIGNUPS_ALLOWED=true
- WEBSOCKET_ENABLED=true
volumes:
- './data/:/data/'
ports:
- '8000:80'
image: 'vaultwarden/server:latest'
EOF
docker-compose up -d
ufw allow 8000/tcp
yellow "-----------------------------------------------"
green " Web 端口:8000"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8000"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):8000"
echo
green " Vaultwarden 安装完毕!"
yellow "-----------------------------------------------"
}
vaultwarden_install

Searxng

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Searxng

function searxng_install(){
if nc -z localhost 19723; then
green " 19723 端口已经被占用,请检查相关进程。"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "searxng"; then
green " searxng 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Searxng ]; then
mkdir -p /root/docker/Searxng
fi
cd /root/docker/Searxng
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'

services:
searxng:
container_name: searxng
image: searxng/searxng:latest
restart: unless-stopped
ports:
- "19723:8080"
volumes:
- ./Searxng:/etc/searxng:rw
environment:
- SEARXNG_BASE_URL=http://192.168.6.212:19723
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- DAC_OVERRIDE
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"
EOF
docker-compose up -d
ufw allow 19723/tcp
yellow "-----------------------------------------------"
green " Web 端口:19723"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):19723"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):19723"
echo
green " Searxng 安装完毕!"
yellow "-----------------------------------------------"
}
searxng_install

Linux Command

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Linux Command

function linux-command_install(){
if nc -z localhost 9665; then
echo " 9665 端口已经被占用,请检查相关进程。"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "linux-command"; then
echo " linux-command 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Linux-Command ]; then
mkdir -p /root/docker/Linux-Command
fi
cd /root/docker/Linux-Command
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
linux-command:
container_name: linux-command
restart: always
ports:
- '9665:3000'
image: 'wcjiang/linux-command:latest'
EOF
docker-compose up -d
ufw allow 9665/tcp
yellow "-----------------------------------------------"
green " Web 端口:9665"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):9665"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):9665"
echo
green " Linux Command 安装完毕!"
yellow "-----------------------------------------------"
}
linux-command_install

Invidious

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Invidious

function invidious_install(){
if nc -z localhost 5000; then
echo " 5000 端口已经被占用,请检查相关进程。"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "invidious" && docker ps -a --format "{{.Names}}" | grep -q "invidious_postgres"; then
echo "invidious 和 invidious_postgres 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Invidious ]; then
mkdir -p /root/docker/Invidious
fi
cd /root/docker/Invidious
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "3"
services:

invidious:
image: quay.io/invidious/invidious:latest
restart: unless-stopped
container_name: invidious
ports:
- "5000:3000"
environment:
INVIDIOUS_CONFIG: |
db:
dbname: invidious
user: kemal
password: kemal
host: invidious-db
port: 5432
check_tables: true
healthcheck:
test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/comments/jNQXAC9IVRw || exit 1
interval: 30s
timeout: 5s
retries: 2
logging:
options:
max-size: "1G"
max-file: "4"
depends_on:
- invidious-db

invidious-db:
image: docker.io/library/postgres:14
container_name: invidious_postgres
restart: unless-stopped
volumes:
- ./postgresdata:/var/lib/postgresql/data
- ./config/sql:/config/sql
- ./docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh
environment:
POSTGRES_DB: invidious
POSTGRES_USER: kemal
POSTGRES_PASSWORD: kemal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
EOF
docker-compose up -d
ufw allow 5000/tcp
yellow "-----------------------------------------------"
green " Web 端口:5000"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):5000"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):5000"
echo
green " Invidious 安装完毕!"
yellow "-----------------------------------------------"
}
invidious_install

FreshRSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# FreshRSS

function freshrss_install(){
if nc -z localhost 5380; then
echo " 5380 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "freshrss"; then
echo " freshrss 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/FreshRSS ]; then
mkdir -p /root/docker/FreshRSS
fi
cd /root/docker/FreshRSS
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "2.1"
services:
freshrss:
image: linuxserver/freshrss:latest
container_name: freshrss
volumes:
- ./data:/config
ports:
- 5380:80
restart: unless-stopped
EOF
docker-compose up -d
ufw allow 5380/tcp
yellow "-----------------------------------------------"
green " Web 端口:5380"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):5380"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):5380"
echo
green " FreshRSS 安装完毕!"
yellow "-----------------------------------------------"
}
freshrss_install

Twikoo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Twikoo

function twikoo_install(){
if nc -z localhost 4001; then
echo " 4001 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "twikoo"; then
echo " twikoo 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Twikoo ]; then
mkdir -p /root/docker/Twikoo
fi
cd /root/docker/Twikoo
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "3.5"
services:
twikoo:
container_name: twikoo
image: imaegoo/twikoo
environment:
- TWIKOO_THROTTLE=1000
ports:
- 4001:8080
volumes:
- ./data:/app/data
restart: unless-stopped
EOF
docker-compose up -d
ufw allow 4001/tcp
yellow "-----------------------------------------------"
green " Web 端口:4001"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):4001"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):4001"
echo
green " Twikoo 安装完毕!"
yellow "-----------------------------------------------"
}
twikoo_install

Codex Docs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Codex Docs

function codex-docs_install(){
if nc -z localhost 3313; then
echo " 3313 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "codex-docs"; then
echo " codex-docs 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Codex-Docs ]; then
mkdir -p /root/docker/Codex-Docs
fi
cd /root/docker/Codex-Docs
if [ -f "docs-config.yaml" ]; then
green " docs-config.yaml 文件已存在, 跳过创建步骤."
else
cat <<EOF > docs-config.yaml
port: 3000
host: "localhost"
uploads:
driver: "local"
local:
path: "./uploads"
s3:
bucket: "my-bucket"
region: "eu-central-1"
baseUrl: "http://docs-static.codex.so.s3-website.eu-central-1.amazonaws.com"
keyPrefix: "/"
accessKeyId: "my-access-key"
secretAccessKey: "my-secret-key"
frontend:
title: "CodeX Docs"
description: "Free Docs app powered by Editor.js ecosystemt"
startPage: ""
misprintsChatId: "12344564"
yandexMetrikaId: ""
carbon:
serve: ""
placement: ""
menu:
- "Guides"
- title: "CodeX"
uri: "https://codex.so"

auth:
password: passwd
secret: supersecret

hawk:
# frontendToken: "123"
# backendToken: "123"

database:
driver: local # you can change database driver here. 'mongodb' or 'local'
local:
path: ./db
EOF
green " docs-config.yaml 配置文件创建完毕!"
fi
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "3.2"

services:
docs:
image: rahn2029/codex-docs
container_name: codex-docs
ports:
- "3313:3000"
command:
- node
- dist/backend/app.js
- -c
- docs-config.yaml
volumes:
- ./uploads:/usr/src/app/uploads
- ./db:/usr/src/app/db
- ./docs-config.yaml:/usr/src/app/docs-config.yaml
EOF
docker-compose up -d
ufw allow 3313/tcp
yellow "-----------------------------------------------"
green " Web 端口:3313"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):3313"
echo
green " 服务器 IP = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):3313"
echo
green " 文档密码:passwd"
echo
green " Codex Docs 安装完毕!"
yellow "-----------------------------------------------"
}
codex-docs_install

RSSHub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# RSSHub

function rsshub_install(){
if nc -z localhost 1200; then
echo " 1200 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "rsshub"; then
echo " rsshub 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/RssHub ]; then
mkdir -p /root/docker/RssHub
fi
cd /root/docker/RssHub
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3'

services:
rsshub:
image: diygod/rsshub:chromium-bundled
container_name: rsshub
restart: unless-stopped
ports:
- 1200:1200
environment:
- CACHE_EXPIRE=3600
EOF
docker-compose up -d
ufw allow 1200/tcp
yellow "-----------------------------------------------"
green " Web 端口:1200"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):1200"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):1200"
echo
green " RSSHub 安装完毕!"
yellow "-----------------------------------------------"
}
rsshub_install

Jackett

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Jackett

function jackett_install(){
if nc -z localhost 9117; then
echo " 9117 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "jackett"; then
echo " jackett 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Jackett ]; then
mkdir -p /root/docker/Jackett
fi
cd /root/docker/Jackett
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "2.1"
services:
jackett:
image: linuxserver/jackett:latest
container_name: jackett
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/shanghai
- AUTO_UPDATE=true
volumes:
- ./config:/config
- ./downloads:/downloads
ports:
- 9117:9117
restart: unless-stopped
EOF
docker-compose up -d
ufw allow 9117/tcp
yellow "-----------------------------------------------"
green " Web 端口:9117"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):9117"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):9117"
echo
green " Jackett 安装完毕!"
yellow "-----------------------------------------------"
}
jackett_install

Bookstack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Bookstack

function bookstack_install(){
if nc -z localhost 6875; then
echo " 6875 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "bookstack"; then
echo " bookstack 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Bookstack ]; then
mkdir -p /root/docker/Bookstack
fi
cd /root/docker/Bookstack
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "2"
services:
bookstack:
image: linuxserver/bookstack
container_name: bookstack
environment:
- PUID=1000
- PGID=1000
- APP_URL=http://192.168.6.212:6875
- DB_HOST=bookstack_db
- DB_USER=bookstack
- DB_PASS=<yourdbpass>
- DB_DATABASE=bookstackapp
volumes:
- ./books:/config
ports:
- 6875:80
restart: unless-stopped
depends_on:
- bookstack_db
bookstack_db:
image: linuxserver/mariadb
container_name: bookstack_db
environment:
- PUID=1000
- PGID=1000
- MYSQL_ROOT_PASSWORD=<yourdbpass>
- TZ=Asia/Shanghai
- MYSQL_DATABASE=bookstackapp
- MYSQL_USER=bookstack
- MYSQL_PASSWORD=<yourdbpass>
volumes:
- ./data:/config
restart: unless-stopped
EOF
docker-compose up -d
ufw allow 6875/tcp
yellow "-----------------------------------------------"
green " Web 端口:6875"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):6875"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):6875"
echo
green " 登陆账号:admin@admin.com "
green " 登陆密码:password"
echo
green " Bookstack 安装完毕!"
yellow "-----------------------------------------------"
}
bookstack_install

Calibre Web

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Calibre Web

function calibre-web_install(){
if nc -z localhost 8083; then
echo " 8083 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "calibre-web"; then
echo " calibre-web 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Calibre-Web ]; then
mkdir -p /root/docker/Calibre-Web
fi
cd /root/docker/Calibre-Web
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "2.1"
services:
calibre-web:
image: linuxserver/calibre-web:latest
container_name: calibre-web
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- DOCKER_MODS=linuxserver/mods:universal-calibre
- OAUTHLIB_RELAX_TOKEN_SCOPE=1
volumes:
- ./config:/config
- ./books:/books
ports:
- 8083:8083
restart: unless-stopped
EOF
docker-compose up -d
ufw allow 8083/tcp
chmod 777 books
yellow "-----------------------------------------------"
green " Web 端口:8083"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8083"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):8083"
echo
green " 第一次安装需要进入容器内部生成 metadata.db 数据库,步骤如下:"
green " cd: can't cd to app/calibre/bin 报错,需要等待容器初始化完毕!"
green " 大概等待 3 分钟左右!"
echo
green " docker exec -it calibre-web sh"
green " cd app/calibre/bin"
green " calibredb restore_database --really-do-it --with-library /books"
green " chmod a+w /books/metadata.db"
green " exit"
echo
green " 登陆账号:admin "
green " 登陆密码:admin123"
echo
green " Calibre Web 安装完毕!"
yellow "-----------------------------------------------"
}
calibre-web_install

Memos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Memos

function memos_install(){
if nc -z localhost 5230; then
echo " 5230 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "memos"; then
echo " memos 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Memos ]; then
mkdir -p /root/docker/Memos
fi
cd /root/docker/Memos
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
usememos:
container_name: memos
ports:
- '5230:5230'
restart: always
volumes:
- './memos/:/var/opt/memos'
image: 'neosmemo/memos'
EOF
docker-compose up -d
ufw allow 5230/tcp
yellow "-----------------------------------------------"
green " Web 端口:5230"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):5230"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):5230"
echo
green " Memos 安装完毕!"
yellow "-----------------------------------------------"
}
memos_install

MoRSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# MoRSS

function morss_install(){
if nc -z localhost 8887; then
echo " 8887 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "morss"; then
echo " morss 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/MoRSS ]; then
mkdir -p /root/docker/MoRSS
fi
cd /root/docker/MoRSS
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3'

services:
morss:
image: pictuga/morss
container_name: morss
restart: unless-stopped
ports:
- 8887:8000
EOF
docker-compose up -d
ufw allow 8887/tcp
yellow "-----------------------------------------------"
green " Web 端口:8887"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8887"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):8887"
echo
green " MoRSS 安装完毕!"
yellow "-----------------------------------------------"
}
morss_install

Reader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Reader

function reader_install(){
if nc -z localhost 4396; then
echo " 4396 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "reader"; then
echo " reader 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Reader ]; then
mkdir -p /root/docker/Reader
fi
cd /root/docker/Reader
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.1'
services:

reader:
image: hectorqin/reader
container_name: reader
restart: always
ports:
- 4396:8080
volumes:
- ./logs:/logs
- ./storage:/storage
environment:
- SPRING_PROFILES_ACTIVE=prod
- READER_APP_USERBOOKLIMIT=500
- READER_APP_CACHECHAPTERCONTENT=true
EOF
docker-compose up -d
ufw allow 4396/tcp
yellow "-----------------------------------------------"
green " Web 端口:4396"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):4396"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):4396"
echo
green " Reader 安装完毕!"
yellow "-----------------------------------------------"
}
reader_install

WeChat Markdown Editor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# WeChat Markdown Editor

function wechat-markdown-editor_install(){
if nc -z localhost 13480; then
echo " 13480 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "wechat"; then
echo " wechat 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/WeChat-Markdown-Editor ]; then
mkdir -p /root/docker/WeChat-Markdown-Editor
fi
cd /root/docker/WeChat-Markdown-Editor
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
md:
restart: always
container_name: wechat
ports:
- '13480:80'
image: 'doocs/md:latest'
EOF
docker-compose up -d
ufw allow 13480/tcp
yellow "-----------------------------------------------"
green " Web 端口:13480"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):13480"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):13480"
echo
green " WeChat Markdown Editor 安装完毕!"
yellow "-----------------------------------------------"
}
wechat-markdown-editor_install

ZFile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# ZFile

function zfile_install(){
if nc -z localhost 9180; then
echo " 9180 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "zfile"; then
echo " zfile 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/ZFile ]; then
mkdir -p /root/docker/ZFile
fi
cd /root/docker/ZFile
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
zfile:
container_name: zfile
restart: always
ports:
- '9180:8080'
volumes:
- './db:/root/.zfile-v4/db'
- './logs:/root/.zfile-v4/logs'
- './file:/data/file'
image: zhaojun1998/zfile
EOF
docker-compose up -d
ufw allow 9180/tcp
yellow "-----------------------------------------------"
green " Web 端口:9180"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):9180"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):9180"
echo
green " ZFile 安装完毕!"
yellow "-----------------------------------------------"
}
zfile_install

WordPress

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# WordPress

function wordpress_install(){
if nc -z localhost 7080 && nc -z localhost 7081; then
echo " 7080 7081 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "wordpress" && docker ps -a --format "{{.Names}}" | grep -q "wordpress_mysql" && docker ps -a --format "{{.Names}}" | grep -q "wordpress_phpmyadmin"; then
echo " wordpress wordpress_mysql wordpress_phpmyadmin 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/WordPress ]; then
mkdir -p /root/docker/WordPress
fi
cd /root/docker/WordPress
if [ -f "uploads.ini" ]; then
green " uploads.ini 文件已经存在, 跳过创建步骤."
else
cat <<EOF > uploads.ini
file_uploads = On
upload_max_filesize = 256M
post_max_size = 256M
EOF
green " uploads.ini 创建成功,用于设置上传大小。"
fi
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.1'

services:

wordpress:
container_name: wordpress
image: wordpress
restart: always
ports:
- 7080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress_user
WORDPRESS_DB_PASSWORD: wordpress_password
WORDPRESS_DB_NAME: wordpress_db
volumes:
- ./html:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini

db:
container_name: wordpress_mysql
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpress_db
MYSQL_USER: wordpress_user
MYSQL_PASSWORD: wordpress_password
MYSQL_RANDOM_ROOT_PASSWORD: rootpassword
volumes:
- ./mysql:/var/lib/mysql

phpmyadmin:
container_name: wordpress_phpmyadmin
image: phpmyadmin
restart: always
ports:
- 7081:80
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD : rootpassword
EOF
docker-compose up -d
ufw allow 7080/tcp
ufw allow 7081/tcp
yellow "-----------------------------------------------"
green " Web 端口:7080 7081"
echo
green " WordPress"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):7080"
echo
green " PHPMyAdmin"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):7081"
echo
green " WordPress"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):7080"
echo
green " PHPMyAdmin"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):7081"
echo
green " WordPress 安装完毕!"
yellow "-----------------------------------------------"
}
wordpress_install

qBittorrent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# qBittorrent

function qbittorrent_install(){
if nc -z localhost 6881 && nc -z localhost 8081; then
echo " 6881 8081 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "qbittorrent"; then
echo " qbittorrent 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/qBittorrent ]; then
mkdir -p /root/docker/qBittorrent
fi
cd /root/docker/qBittorrent
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "2"
services:
qbittorrent:
image: linuxserver/qbittorrent
container_name: qbittorrent
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- UMASK_SET=022
- WEBUI_PORT=8081
volumes:
- ./config:/config
- ./downloads:/downloads
ports:
- 6881:6881
- 6881:6881/udp
- 8081:8081
restart: unless-stopped
EOF
docker-compose up -d
ufw allow 6881/tcp
ufw allow 6881/udp
ufw allow 8081/tcp
yellow "-----------------------------------------------"
green " Web 端口:8081"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8081"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):8081"
echo
green " 初始账号:admin"
green " 初始密码:adminadmin"
echo
green " qBittorrent 安装完毕!"
yellow "-----------------------------------------------"
}
qbittorrent_install

Halo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Halo

function halo_install(){
if nc -z localhost 8040; then
echo " 8040 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "halo"; then
echo " halo 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Halo ]; then
mkdir -p /root/docker/Halo
fi
cd /root/docker/Halo
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
halo:
container_name: halo
restart: always
ports:
- '8040:8090'
volumes:
- './halo:/root/.halo'
image: 'halohub/halo:1.5.4'
EOF
docker-compose up -d
ufw allow 8040/tcp
yellow "-----------------------------------------------"
green " Web 端口:8040"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8040"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):8040"
echo
green " Halo 安装完毕!"
yellow "-----------------------------------------------"
}
halo_install

Stirling PDF

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Stirling PDF

function stirling-pdf_install(){
if nc -z localhost 8077; then
echo " 8077 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "spdf"; then
echo " spdf 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Stirling-PDF ]; then
mkdir -p /root/docker/Stirling-PDF
fi
cd /root/docker/Stirling-PDF
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3'

services:
s-pdf:
image: frooodle/s-pdf
container_name: spdf
restart: unless-stopped
ports:
- 8077:8080
EOF
docker-compose up -d
ufw allow 8077/tcp
yellow "-----------------------------------------------"
green " Web 端口:8077"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8077"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):8077"
echo
green " Stirling PDF 安装完毕!"
yellow "-----------------------------------------------"
}
stirling-pdf_install

Sshwifty

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Sshwifty

function sshwifty_install(){
if nc -z localhost 8090; then
echo " 8090 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "sshwifty"; then
echo " sshwifty 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Sshwifty ]; then
mkdir -p /root/docker/Sshwifty
fi
cd /root/docker/Sshwifty
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
sshwifty:
restart: always
ports:
- '8090:8182'
container_name: sshwifty
image: 'niruix/sshwifty:latest'
EOF
docker-compose up -d
ufw allow 8090/tcp
yellow "-----------------------------------------------"
green " Web 端口:8090"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8090"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):8090"
echo
green " Sshwifty 安装完毕!"
yellow "-----------------------------------------------"
}
sshwifty_install

RustDesk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# RustDesk

function rustdesk_install(){
if nc -z localhost 21115 && nc -z localhost 21116 && nc -z localhost 21117 && nc -z localhost 21118 && nc -z localhost 21119; then
echo " 21115 21116 21117 21118 21119 中的端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "hbbs" && docker ps -a --format "{{.Names}}" | grep -q "hbbr"; then
echo " hbbs hbbr 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/RustDesk ]; then
mkdir -p /root/docker/RustDesk
fi
cd /root/docker/RustDesk
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3'

networks:
rustdesk-net:
external: false

services:
hbbs:
container_name: hbbs
ports:
- 21115:21115
- 21116:21116
- 21116:21116/udp
- 21118:21118
image: rustdesk/rustdesk-server:latest
command: hbbs -r https://rustdesk.rahn.top
volumes:
- ./hbbs:/root
networks:
- rustdesk-net
depends_on:
- hbbr
restart: unless-stopped

hbbr:
container_name: hbbr
ports:
- 21117:21117
- 21119:21119
image: rustdesk/rustdesk-server:latest
command: hbbr
volumes:
- ./hbbr:/root
networks:
- rustdesk-net
restart: unless-stopped
EOF
docker-compose up -d
ufw allow 21115/tcp
ufw allow 21116/udp
ufw allow 21116/tcp
ufw allow 21117/tcp
ufw allow 21118/tcp
ufw allow 21119/tcp
yellow "-----------------------------------------------"
green " Web 端口:21117"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):21117"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):21117"
echo
green " ID 服务器 = https://rustdesk.rahn.top"
echo
cd /root/docker/RustDesk/hbbs
green " Key = $(cat id_ed25519.pub)"
echo
green " RustDesk 安装完毕!"
yellow "-----------------------------------------------"
}
rustdesk_install

Weserv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Weserv

function weserv_install(){
if nc -z localhost 9999; then
echo " 9999 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "weserv"; then
echo " weserv 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Weserv ]; then
mkdir -p /root/docker/Weserv
fi
cd /root/docker/Weserv
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
weserv:
ports:
- '9999:80'
container_name: weserv
restart: always
image: 'ghcr.io/weserv/images:5.x'
EOF
docker-compose up -d
ufw allow 9999/tcp
yellow "-----------------------------------------------"
green " Web 端口:9999"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):9999"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):9999"
echo
green " Weserv 安装完毕!"
yellow "-----------------------------------------------"
}
weserv_install

Jellyfin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Jellyfin

function jellyfin_install(){
if nc -z localhost 8096; then
echo " 8096 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "jellyfin"; then
echo " jellyfin 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Jellyfin ]; then
mkdir -p /root/docker/Jellyfin
fi
cd /root/docker/Jellyfin
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
jellyfin:
container_name: jellyfin
ports:
- '8096:8096'
volumes:
- './config:/config'
- './cache:/cache'
- './media:/media'
- './movies:/movies'
- './tvshows:/tvshows'
- './animation:/animation'
environment:
- TZ=Asia/Shanghai
restart: always
image: rahn2029/jellyfin
EOF
docker-compose up -d
ufw allow 8096/tcp
yellow "-----------------------------------------------"
green " Web 端口:8096"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8096"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):8096"
echo
green " Jellyfin 安装完毕!"
yellow "-----------------------------------------------"
}
jellyfin_install

Homepage

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Homepage

function homepage_install(){
if nc -z localhost 3344; then
echo " 3344 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "homepage"; then
echo " homepage 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Homepage ]; then
mkdir -p /root/docker/Homepage
fi
cd /root/docker/Homepage
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "3.3"

services:
homepage:
image: rahn2029/homepage
container_name: homepage
ports:
- 3344:3000
volumes:
- ./config:/app/config
- ./images:/app/public/images
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
EOF
docker-compose up -d
ufw allow 3344/tcp
yellow "-----------------------------------------------"
green " Web 端口:3344"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):3344"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):3344"
echo
green " Homepage 安装完毕!"
yellow "-----------------------------------------------"
}
homepage_install

Hexo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Hexo

function hexo_install(){
if nc -z localhost 4000; then
echo " 4000 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "hexo"; then
echo " hexo 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Hexo ]; then
mkdir -p /root/docker/Hexo
fi
cd /root/docker/Hexo
if [ -d "blog" ]; then
green " blog 文件夹已经存在, 跳过执行 docker cp 命令"
else
docker run -itd --name hexo -p 4000:4000 rahn2029/hexo-github
docker cp hexo:blog $(pwd)/blog
docker stop hexo && docker rm hexo
fi
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
hexo-butterfly:
container_name: hexo
restart: always
ports:
- '4000:4000'
volumes:
- './blog:/blog'
image: 'rahn2029/hexo-github'
EOF
docker-compose up -d
ufw allow 4000/tcp
yellow "-----------------------------------------------"
green " Web 端口:4000"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):4000"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):4000"
echo
green " Hexo 安装完毕!"
yellow "-----------------------------------------------"
}
hexo_install

Duplicati

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Duplicati

function duplicati_install(){
if nc -z localhost 8050; then
echo " 8050 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "duplicati"; then
echo " duplicati 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Duplicati ]; then
mkdir -p /root/docker/Duplicati
fi
cd /root/docker/Duplicati
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "2.1"
services:
duplicati:
image: lscr.io/linuxserver/duplicati
container_name: duplicati
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
volumes:
- ./config:/config
- ./backups:/backups
- /root/docker:/source
ports:
- 8050:8200
restart: unless-stopped
EOF
docker-compose up -d
ufw allow 8050/tcp
yellow "-----------------------------------------------"
green " Web 端口:8050"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8050"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):8050"
echo
green " Duplicati 安装完毕!"
yellow "-----------------------------------------------"
}
duplicati_install

Syncthing

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Syncthing

function syncthing_install(){
if nc -z localhost 8384; then
echo " 8384 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "syncthing"; then
echo " syncthing 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Syncthing ]; then
mkdir -p /root/docker/Syncthing
fi
cd /root/docker/Syncthing
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: "2.1"
services:
syncthing:
image: lscr.io/linuxserver/syncthing
container_name: syncthing
hostname: syncthing
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- ./config:/config
ports:
- 8384:8384
- 22000:22000/tcp
- 22000:22000/udp
- 21027:21027/udp
restart: unless-stopped
EOF
docker-compose up -d
ufw allow 8384/tcp
ufw allow 22000/tcp
ufw allow 22000/udp
ufw allow 21027/udp
yellow "-----------------------------------------------"
green " Web 端口:8384"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):8384"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):8384"
echo
green " Syncthing 安装完毕!"
yellow "-----------------------------------------------"
}
syncthing_install

V2RayA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# V2RayA

function v2raya_install(){
if docker ps -a --format "{{.Names}}" | grep -q "v2raya"; then
echo " v2raya 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/V2RayA ]; then
mkdir -p /root/docker/V2RayA
fi
cd /root/docker/V2RayA
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'

services:
v2raya:
image: mzz2017/v2raya
container_name: v2raya
restart: always
privileged: true
network_mode: host
environment:
- V2RAYA_LOG_FILE=/tmp/v2raya.log
volumes:
- /lib/modules:/lib/modules:ro
- /etc/resolv.conf:/etc/resolv.conf
- /etc/v2raya:/etc/v2raya
EOF
docker-compose up -d
yellow "-----------------------------------------------"
green " Web 端口:2017"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):2017"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):2017"
echo
green " V2RayA 安装完毕!"
yellow "-----------------------------------------------"
}
v2raya_install

X-UI

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# X-UI

function x-ui_install(){
if nc -z localhost 52441 && nc -z localhost 52442 ; then
echo " 52441 52442 端口已经被占用,请检查相关进程"
exit 1
fi
bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)
ufw allow 52441/tcp
ufw allow 52442/tcp
yellow "-----------------------------------------------"
green " Web 端口:52441"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):52441"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):52441"
yellow "-----------------------------------------------"
green " location:/docs"
echo
green " http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):52441/docs"
yellow "-----------------------------------------------"
green " 节点端口:52442"
echo
green " Advanced"
yellow "-----------------------------------------------"
echo "location /docs {
proxy_redirect off;
proxy_pass http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):52442;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_read_timeout 300s;
# Show realip in v2ray access.log
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}"
yellow "-----------------------------------------------"
green " X-UI 安装完毕!"
yellow "-----------------------------------------------"
}
x-ui_install

SwapFile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# SwapFile

add_swap(){

# root 权限
if [[ $EUID -ne 0 ]]; then
red "Error:This script must be run as root!"
exit 1
fi

# ovz 检测
if [[ -d "/proc/vz" ]]; then
red "Your VPS is based on OpenVZ,not supported!"
exit 1
fi
yellow "-----------------------------------------------"
green "请输入需要添加的 swap 大小,建议为内存的 2 倍!"
yellow "-----------------------------------------------"
read -p "请输入 swap 的数值: " swapsize

# 检查是否存在 swapfile
grep -q "swapfile" /etc/fstab

# 如果不存在将为其创建 swap
if [ $? -ne 0 ]; then
yellow "-----------------------------------------------"
green "并未发现 swapfile 文件,正在为您创建 swapfile 文件"
yellow "-----------------------------------------------"
fallocate -l ${swapsize}M /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap defaults 0 0' >> /etc/fstab
yellow "-----------------------------------------------"
green "swapfile 文件创建成功,swap 信息如下:"
yellow "-----------------------------------------------"
cat /proc/swaps
yellow "-----------------------------------------------"
cat /proc/meminfo | grep Swap
yellow "-----------------------------------------------"
else
yellow "-----------------------------------------------"
red "swapfile 文件已经存在!"
yellow "-----------------------------------------------"
fi
}

del_swap(){

# root 权限
if [[ $EUID -ne 0 ]]; then
red "Error:This script must be run as root!"
exit 1
fi

# ovz 检测
if [[ -d "/proc/vz" ]]; then
red "Your VPS is based on OpenVZ,not supported!"
exit 1
fi

# 检查是否存在 swapfile
grep -q "swapfile" /etc/fstab

# 如果存在将其删除
if [ $? -eq 0 ]; then
yellow "-----------------------------------------------"
green "发现 swapfile 文件,正在将其删除..."
yellow "-----------------------------------------------"
sed -i '/swapfile/d' /etc/fstab
echo "3" > /proc/sys/vm/drop_caches
swapoff -a
rm -f /swapfile
yellow "-----------------------------------------------"
green "swapfile 文件删除完毕!"
yellow "-----------------------------------------------"
else
yellow "-----------------------------------------------"
red "并未发现 swapfile 文件,删除失败!"
yellow "-----------------------------------------------"
fi
}


function start_menu(){
clear
yellow "-----------------------------------------------"
red " SwapFile —— 交换空间"
yellow "-----------------------------------------------"
green " 1. 添加 swapfile"
green " 2. 删除 swapfile"
yellow "-----------------------------------------------"
red " 0. 退出脚本"
echo
read -p "请输入数字:" menuNumberInput
case "$menuNumberInput" in
1 )
add_swap
;;
2 )
del_swap
;;
0 )
exit
;;
* )
clear
red "请输入正确数字!"
start_menu
;;
esac
}
start_menu

Clear

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# 删除所有不使用的镜像

function imageprune(){
docker image prune --force --all
yellow "--------------------------------------------------"
green " docker image prune --force --all"
echo
green " 删除所有不使用的镜像 完毕!"
yellow "--------------------------------------------------"
}

# 删除所有停止的容器

function containerprune(){
docker container prune -f
yellow "--------------------------------------------------"
green " docker container prune -f"
echo
green " 删除所有停止的容器 完毕!"
yellow "--------------------------------------------------"
}

# Tachidesk

function tachidesk_clear(){
cd /root/docker/Tachidesk/data/thumbnails
rm -rf *
yellow "--------------------------------------------------"
green " Tachidesk thumbnails 清空完毕!"
yellow "--------------------------------------------------"
}

# 磁盘

function diskcondition(){
yellow "--------------------------------------------------"
green "磁盘使用信息如下:"
yellow "--------------------------------------------------"
df -h /dev/vda1
yellow "--------------------------------------------------"
}

# 内存

function freememory(){
yellow "--------------------------------------------------"
green "内存使用信息如下:"
yellow "--------------------------------------------------"
free -m
yellow "--------------------------------------------------"
}

function start_menu(){
clear
yellow "-----------------------------------------------"
red " SwapFile —— 交换空间"
yellow "-----------------------------------------------"
green " 1. 查看磁盘信息"
green " 2. 查看内存信息"
green " 3. 删除所有停止的容器"
green " 4. 删除所有不使用的镜像"
green " 5. Tachidesk thumbnails 文件夹清空"
yellow "-----------------------------------------------"
red " 0. 退出脚本"
echo
read -p "请输入数字:" menuNumberInput
case "$menuNumberInput" in
1 )
diskcondition
;;
2 )
freememory
;;
3 )
containerprune
;;
4 )
imageprune
;;
5 )
tachidesk_clear
;;
0 )
exit
;;
* )
clear
red "请输入正确数字!"
start_menu
;;
esac
}
start_menu

Coder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#! /bin/bash

red(){
echo -e "\033[31m\033[01m$1\033[0m"
}
green(){
echo -e "\033[32m\033[01m$1\033[0m"
}
yellow(){
echo -e "\033[33m\033[01m$1\033[0m"
}


# Coder

function coder_install(){
if nc -z localhost 10000; then
echo " 10000 端口已经被占用,请检查相关进程"
exit 1
fi
if docker ps -a --format "{{.Names}}" | grep -q "coder"; then
echo " coder 容器名已经被占用"
exit 1
fi
if [ ! -d /root/docker/Coder ]; then
mkdir -p /root/docker/Coder
fi
cd /root/docker/Coder
if [ -f "docker-compose.yml" ]; then
rm docker-compose.yml
fi
cat <<EOF > docker-compose.yml
version: '3.3'
services:
code-server:
user: root
ports:
- '10000:8080'
container_name: coder
volumes:
- '/root/docker:/home/code'
#- './config.yaml:/root/.config/code-server/config.yaml'
image: rahn2029/vscode:1.0
EOF
docker-compose up -d
ufw allow 10000/tcp
yellow "-----------------------------------------------"
green " Web 端口:10000"
echo
green " Docker IP = $(ip addr show docker0 | grep 'inet\b' | awk '{print $2}' | cut -d '/' -f1):10000"
echo
green " Web 网址 = http://$(ifconfig $(ifconfig | grep -oP 'enp\w+') | grep 'inet ' | awk '{print $2}'):10000"
echo
green " 将 config.yaml 文件拷贝到当前文件夹下"
green " docker cp code-server:/root/.config/code-server/config.yaml /root/docker/Coder/config.yaml"
echo
green " 查看 Web 登陆密码"
green " docker exec code-server cat /root/.config/code-server/config.yaml"
echo
green " Coder 安装完毕!"
yellow "-----------------------------------------------"
}
coder_install