├── .gitignore
├── docker
├── es-cluster.sh
├── redis-cluster.sh
├── nexus3.sh
├── buildx.sh
├── nacos.sh
├── skywalking-ui.sh
├── redis.sh
├── rustdesk-server.sh
├── postgresql.sh
├── gitlab.sh
├── kibana.sh
├── minio.sh
├── mysql.sh
├── es.sh
├── uninstall.sh
├── skywalking-oap.sh
├── ssr.sh
└── install.sh
├── README_ZH.md
├── README.md
├── docker-install.sh
└── k8s-install.sh
/.gitignore:
--------------------------------------------------------------------------------
1 | /.idea/
--------------------------------------------------------------------------------
/docker/es-cluster.sh:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/README_ZH.md:
--------------------------------------------------------------------------------
1 | [English](README.md)
2 |
3 | # 一键安装脚本
4 |
5 | Linux 的快速安装脚本
6 |
7 | ## 建议系统
8 |
9 | - 系统: CentOS 8+/Ubuntu 20+/Debian 11+
10 | - CPU: x86_64/amd64 arm64/aarch64
11 |
12 | ## 安装 Kubernetes (K8s)
13 |
14 | - 系统: CentOS 7+ / Ubuntu 18+ / Debian 10+
15 | - CPU: x86_64/amd64 arm64/aarch64
16 | - Kubernetes 版本: v1.29
17 |
18 | 安装命令:
19 |
20 | ```bash
21 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/k8s-install.sh)
22 | ```
23 |
24 | ## 安装 Docker 和基于 Docker 的服务
25 |
26 | - 系统: CentOS 7+ / Ubuntu 18+ / Debian 10+
27 | - CPU: x86_64/amd64 arm64/aarch64
28 | - Docker 版本: Latest
29 |
30 | 安装命令:
31 |
32 | ```bash
33 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker-install.sh)
34 | ```
35 |
36 | ## 其他
37 |
38 | Telegram Channel: https://t.me/jonssonyan_channel
39 |
40 | 你可以在 YouTube 上订阅我的频道: https://www.youtube.com/@jonssonyan
41 |
42 | 如果这个项目对你有帮助,你可以请我喝杯咖啡:
43 |
44 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [简体中文](README_ZH.md)
2 |
3 | # Install Script
4 |
5 | Quick installation scripts for Linux servers
6 |
7 | ## Recommended OS
8 |
9 | - OS: CentOS 8+/Ubuntu 20+/Debian 11+
10 | - CPU: x86_64/amd64 arm64/aarch64
11 |
12 | ## Install Kubernetes (K8s)
13 |
14 | - OS: CentOS 7+ / Ubuntu 18+ / Debian 10+
15 | - CPU: x86_64/amd64 arm64/aarch64
16 | - Kubernetes Version: v1.29
17 |
18 | Installation Command:
19 |
20 | ```bash
21 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/k8s-install.sh)
22 | ```
23 |
24 | ## Install Docker and Docker-based Services
25 |
26 | - OS: CentOS 7+ / Ubuntu 18+ / Debian 10+
27 | - CPU: x86_64/amd64 arm64/aarch64
28 | - Docker Version: Latest
29 |
30 | Installation Command:
31 |
32 | ```bash
33 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker-install.sh)
34 | ```
35 |
36 | ## Other
37 |
38 | Telegram Channel: https://t.me/jonssonyan_channel
39 |
40 | You can subscribe to my channel on YouTube: https://www.youtube.com/@jonssonyan
41 |
42 | If this project is helpful to you, you can buy me a cup of coffee.
43 |
44 |
45 |
--------------------------------------------------------------------------------
/docker/redis-cluster.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Redis Cluster Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | # Redis
12 | REDIS_CLUSTER_DATA="/dockerdata/redis-cluster/"
13 | redis_cluster_ip="jy-redis-cluster"
14 | redis_cluster_port=6378
15 | redis_cluster_pass=""
16 | }
17 |
18 | echo_content() {
19 | local color_code
20 | case $1 in
21 | "red") color_code="\033[31m" ;;
22 | "green") color_code="\033[32m" ;;
23 | "yellow") color_code="\033[33m" ;;
24 | "blue") color_code="\033[34m" ;;
25 | "purple") color_code="\033[35m" ;;
26 | "skyBlue") color_code="\033[36m" ;;
27 | "white") color_code="\033[37m" ;;
28 | *) color_code="\033[0m" ;;
29 | esac
30 | ${ECHO_TYPE} "${color_code}$2\033[0m"
31 | }
32 |
33 | create_dirs() {
34 | mkdir -p ${REDIS_CLUSTER_DATA}
35 | mkdir -p ${REDIS_CLUSTER_DATA}data/
36 | }
37 |
38 | install_docker() {
39 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
40 | }
41 |
42 | install_redis_cluster() {
43 | if [[ -z $(docker ps -q -f "name=^${redis_cluster_ip}$") ]]; then
44 | echo_content skyBlue "---> 安装 Redis 集群"
45 | else
46 | echo_content skyBlue "---> 你已经安装了 Redis 集群"
47 | fi
48 | }
49 |
50 | main() {
51 | cd "$HOME" || exit 1
52 |
53 | init_var
54 |
55 | create_dirs
56 |
57 | install_docker
58 |
59 | install_redis_cluster
60 | }
61 |
62 | main "$@"
63 |
--------------------------------------------------------------------------------
/docker/nexus3.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Nexus3 Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | NEXUS3_DATA="/dockerdata/nexus3/"
12 | nexus3_ip="jy-nexus3"
13 | nexus3_port=8081
14 | }
15 |
16 | echo_content() {
17 | local color_code
18 | case $1 in
19 | "red") color_code="\033[31m" ;;
20 | "green") color_code="\033[32m" ;;
21 | "yellow") color_code="\033[33m" ;;
22 | "blue") color_code="\033[34m" ;;
23 | "purple") color_code="\033[35m" ;;
24 | "skyBlue") color_code="\033[36m" ;;
25 | "white") color_code="\033[37m" ;;
26 | *) color_code="\033[0m" ;;
27 | esac
28 | ${ECHO_TYPE} "${color_code}$2\033[0m"
29 | }
30 |
31 | create_dirs() {
32 | mkdir -p ${NEXUS3_DATA}
33 | }
34 |
35 | install_nexus3() {
36 | if [[ -z $(docker ps -q -f "name=^${nexus3_ip}$") ]]; then
37 | echo_content skyBlue "---> 安装 Nexus3"
38 |
39 | read -r -p "请输入Nexus3的端口(默认:8081): " nexus3_port
40 | [[ -z "${nexus3_port}" ]] && nexus3_port=8081
41 |
42 | docker pull sonatype/nexus3:3.49.0 &&
43 | docker run -d --name ${nexus3_ip} --restart always \
44 | - p ${nexus3_port}:8081 \
45 | -v ${NEXUS3_DATA}:/nexus-data \
46 | -e TZ=Asia/Shanghai \
47 | sonatype/nexus3:3.49.0
48 |
49 | if [[ -n $(docker ps -q -f "name=^${nexus3_ip}$" -f "status=running") ]]; then
50 | password=$(docker exec ${nexus3_ip} cat /nexus-data/admin.password)
51 | echo_content skyBlue "---> Nexus3安装完成"
52 | echo_content yellow "---> Nexus3 admin的密码(请妥善保存): ${password}"
53 | else
54 | echo_content red "---> Nexus3安装失败或运行异常,请尝试修复或卸载重装"
55 | exit 1
56 | fi
57 | else
58 | echo_content skyBlue "---> 你已经安装了Nexus3"
59 | fi
60 | }
61 |
62 | main() {
63 | cd "$HOME" || exit 1
64 |
65 | init_var
66 |
67 | create_dirs
68 |
69 | install_docker
70 |
71 | install_nexus3
72 | }
73 |
74 | main "$@"
75 |
--------------------------------------------------------------------------------
/docker/buildx.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Docker buildx Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | buildx_ip="jy-buildx"
12 | DOCKER_CONFIG_PATH='/root/.docker/'
13 | docker_config='/root/.docker/config.json'
14 | }
15 |
16 | echo_content() {
17 | local color_code
18 | case $1 in
19 | "red") color_code="\033[31m" ;;
20 | "green") color_code="\033[32m" ;;
21 | "yellow") color_code="\033[33m" ;;
22 | "blue") color_code="\033[34m" ;;
23 | "purple") color_code="\033[35m" ;;
24 | "skyBlue") color_code="\033[36m" ;;
25 | "white") color_code="\033[37m" ;;
26 | *) color_code="\033[0m" ;;
27 | esac
28 | ${ECHO_TYPE} "${color_code}$2\033[0m"
29 | }
30 |
31 | install_docker() {
32 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
33 | }
34 |
35 | install_buildx() {
36 | if docker buildx inspect --bootstrap | grep -q "${buildx_ip}"; then
37 | echo_content skyBlue "---> buildx is already installed"
38 | return
39 | fi
40 |
41 | echo_content skyBlue "---> Installing buildx"
42 |
43 | mkdir -p "${DOCKER_CONFIG_PATH}"
44 | if [[ -f "${docker_config}" ]]; then
45 | if ! grep -q "experimental" "${docker_config}"; then
46 | jq '.experimental="enabled"' "${docker_config}" >"${docker_config}.tmp" && mv "${docker_config}.tmp" "${docker_config}"
47 | fi
48 | else
49 | cat >"${docker_config}" < buildx installation complete"
61 | else
62 | echo_content red "---> buildx installation failed"
63 | exit 1
64 | fi
65 | }
66 |
67 | main() {
68 | cd "$HOME" || exit 1
69 |
70 | init_var
71 |
72 | install_docker
73 |
74 | install_buildx
75 | }
76 |
77 | main "$@"
78 |
--------------------------------------------------------------------------------
/docker/nacos.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Nacos Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | NACOS_DATA="/dockerdata/nacos/"
12 | nacos_ip="jy-nacos"
13 | nacos_port=8848
14 | }
15 |
16 | echo_content() {
17 | local color_code
18 | case $1 in
19 | "red") color_code="\033[31m" ;;
20 | "green") color_code="\033[32m" ;;
21 | "yellow") color_code="\033[33m" ;;
22 | "blue") color_code="\033[34m" ;;
23 | "purple") color_code="\033[35m" ;;
24 | "skyBlue") color_code="\033[36m" ;;
25 | "white") color_code="\033[37m" ;;
26 | *) color_code="\033[0m" ;;
27 | esac
28 | ${ECHO_TYPE} "${color_code}$2\033[0m"
29 | }
30 |
31 | create_dirs() {
32 | mkdir -p ${NACOS_DATA}
33 | }
34 |
35 | install_docker() {
36 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
37 | }
38 |
39 | install_nacos() {
40 | if [[ -z $(docker ps -q -f "name=^${nacos_ip}$") ]]; then
41 | echo_content skyBlue "---> 安装 Nacos"
42 |
43 | read -r -p "请输入Nacos的端口(默认:8848): " nacos_port
44 | [[ -z "${nacos_port}" ]] && nacos_port=8848
45 |
46 | docker pull nacos/nacos-server:v2.1.2 &&
47 | docker run -d --name ${nacos_ip} --restart=always \
48 | --network=host \
49 | -e MODE=standalone \
50 | -e NACOS_SERVER_PORT=${nacos_port} \
51 | -e TZ=Asia/Shanghai \
52 | nacos/nacos-server:v2.1.2
53 | if [[ -n $(docker ps -q -f "name=^${nacos_ip}$" -f "status=running") ]]; then
54 | echo_content skyBlue "---> Nacos安装完成"
55 | echo_content yellow "---> Nacos的登录地址: http://ip:${nacos_port}/nacos/#/login"
56 | echo_content yellow "---> Nacos的用户号名(请妥善保存): nacos"
57 | echo_content yellow "---> Nacos的密码(请妥善保存): nacos"
58 | else
59 | echo_content red "---> Nacos安装失败或运行异常,请尝试修复或卸载重装"
60 | exit 1
61 | fi
62 | else
63 | echo_content skyBlue "---> 你已经安装了Nacos"
64 | fi
65 | }
66 |
67 | main() {
68 | cd "$HOME" || exit 1
69 |
70 | init_var
71 |
72 | create_dirs
73 |
74 | install_docker
75 |
76 | install_nacos
77 | }
78 |
79 | main "$@"
80 |
--------------------------------------------------------------------------------
/docker/skywalking-ui.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # SkyWalking UI Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | SW_DATA="/dockerdata/skywalking/"
12 |
13 | sw_ui_ip="jy-skywalking-ui"
14 | sw_ui_port=8080
15 | sw_oap_url="http://127.0.0.1:12800"
16 | }
17 |
18 | echo_content() {
19 | local color_code
20 | case $1 in
21 | "red") color_code="\033[31m" ;;
22 | "green") color_code="\033[32m" ;;
23 | "yellow") color_code="\033[33m" ;;
24 | "blue") color_code="\033[34m" ;;
25 | "purple") color_code="\033[35m" ;;
26 | "skyBlue") color_code="\033[36m" ;;
27 | "white") color_code="\033[37m" ;;
28 | *) color_code="\033[0m" ;;
29 | esac
30 | ${ECHO_TYPE} "${color_code}$2\033[0m"
31 | }
32 |
33 | create_dirs() {
34 | mkdir -p ${SW_DATA}
35 | }
36 |
37 | install_docker() {
38 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
39 | }
40 |
41 | install_skywalking_ui() {
42 | if [[ -z $(docker ps -q -f "name=^${sw_ui_ip}$") ]]; then
43 | echo_content skyBlue "---> 安装 SkyWalking UI"
44 |
45 | read -r -p "请输入SkyWalking UI的端口(默认:8080): " sw_ui_port
46 | [[ -z "${sw_ui_port}" ]] && sw_ui_port=8080
47 | read -r -p "请输入SkyWalking OAP的URL(默认:http://127.0.0.1:12800): " sw_oap_url
48 | [[ -z "${sw_oap_url}" ]] && sw_oap_url="http://127.0.0.1:12800"
49 |
50 | docker pull apache/skywalking-ui:9.5.0 &&
51 | docker run -d --name ${sw_ui_ip} --restart always \
52 | --network=host \
53 | -e TZ=Asia/Shanghai \
54 | -e SW_SERVER_PORT=${sw_ui_port} \
55 | -e SW_OAP_ADDRESS="${sw_oap_url}" \
56 | apache/skywalking-ui:9.5.0
57 |
58 | if [[ -n $(docker ps -q -f "name=^${sw_ui_ip}$" -f "status=running") ]]; then
59 | echo_content skyBlue "---> SkyWalking UI安装完成"
60 | else
61 | echo_content red "---> SkyWalking UI安装失败或运行异常,请尝试修复或卸载重装"
62 | exit 1
63 | fi
64 | else
65 | echo_content skyBlue "---> 你已经安装了SkyWalking UI"
66 | fi
67 | }
68 |
69 | main() {
70 | cd "$HOME" || exit 1
71 |
72 | init_var
73 |
74 | create_dirs
75 |
76 | install_docker
77 |
78 | install_skywalking_ui
79 | }
80 |
81 | main "$@"
82 |
--------------------------------------------------------------------------------
/docker/redis.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Redis Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | # Redis
12 | REDIS_DATA="/dockerdata/redis/"
13 | redis_ip="jy-redis"
14 | redis_port=6378
15 | redis_pass=""
16 | }
17 |
18 | echo_content() {
19 | local color_code
20 | case $1 in
21 | "red") color_code="\033[31m" ;;
22 | "green") color_code="\033[32m" ;;
23 | "yellow") color_code="\033[33m" ;;
24 | "blue") color_code="\033[34m" ;;
25 | "purple") color_code="\033[35m" ;;
26 | "skyBlue") color_code="\033[36m" ;;
27 | "white") color_code="\033[37m" ;;
28 | *) color_code="\033[0m" ;;
29 | esac
30 | ${ECHO_TYPE} "${color_code}$2\033[0m"
31 | }
32 |
33 | create_dirs() {
34 | mkdir -p ${REDIS_DATA}
35 | mkdir -p ${REDIS_DATA}data/
36 | }
37 |
38 | install_docker() {
39 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
40 | }
41 |
42 | install_redis() {
43 | if [[ -z $(docker ps -q -f "name=^${redis_ip}$") ]]; then
44 | echo_content skyBlue "---> 安装 Redis"
45 |
46 | read -r -p "请输入 Redis 的端口(默认:6378): " redis_port
47 | [[ -z "${redis_port}" ]] && redis_port=6378
48 | while read -r -p "请输入 Redis 的密码(必填): " redis_pass; do
49 | if [[ -z "${redis_pass}" ]]; then
50 | echo_content red "密码不能为空"
51 | else
52 | break
53 | fi
54 | done
55 |
56 | docker pull redis:6.2.13 &&
57 | docker run -d --name ${redis_ip} --restart always \
58 | --network=host \
59 | -e TZ=Asia/Shanghai \
60 | -v ${REDIS_DATA}data/:/data/ \
61 | -v ${REDIS_DATA}etc/:/usr/local/etc/redis/ \
62 | redis:6.2.13 \
63 | redis-server --requirepass "${redis_pass}" --port "${redis_port}"
64 |
65 | if [[ -n $(docker ps -q -f "name=^${redis_ip}$" -f "status=running") ]]; then
66 | echo_content skyBlue "---> Redis 安装完成"
67 | echo_content yellow "---> Redis 的数据库密码(请妥善保存): ${redis_pass}"
68 | else
69 | echo_content red "---> Redis 安装失败或运行异常,请尝试修复或卸载重装"
70 | exit 1
71 | fi
72 | else
73 | echo_content skyBlue "---> 你已经安装了 Redis"
74 | fi
75 | }
76 |
77 | main() {
78 | cd "$HOME" || exit 1
79 |
80 | init_var
81 |
82 | create_dirs
83 |
84 | install_docker
85 |
86 | install_redis
87 | }
88 |
89 | main "$@"
90 |
--------------------------------------------------------------------------------
/docker/rustdesk-server.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # RustDesk Server Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | # https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-oss/install/#docker示范
9 |
10 | init_var() {
11 | ECHO_TYPE="echo -e"
12 |
13 | # RustDesk Server
14 | RUSTDESK_SERVER="/dockerdata/rustdesk-server/"
15 | # hbbr RustDesk 中继服务器
16 | rustdesk_server_hbbr="jy-rustdesk-server-hbbr"
17 | # hbbs RustDesk ID注册服务器
18 | rustdesk_server_hbbs="jy-rustdesk-server-hbbs"
19 | }
20 |
21 | echo_content() {
22 | local color_code
23 | case $1 in
24 | "red") color_code="\033[31m" ;;
25 | "green") color_code="\033[32m" ;;
26 | "yellow") color_code="\033[33m" ;;
27 | "blue") color_code="\033[34m" ;;
28 | "purple") color_code="\033[35m" ;;
29 | "skyBlue") color_code="\033[36m" ;;
30 | "white") color_code="\033[37m" ;;
31 | *) color_code="\033[0m" ;;
32 | esac
33 | ${ECHO_TYPE} "${color_code}$2\033[0m"
34 | }
35 |
36 | create_dirs() {
37 | mkdir -p ${RUSTDESK_SERVER}
38 | mkdir -p ${RUSTDESK_SERVER}data/
39 | }
40 |
41 | install_docker() {
42 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
43 | }
44 |
45 | install_rustdesk_bbr() {
46 | if [[ -z $(docker ps -q -f "name=^${rustdesk_server_hbbr}$") ]]; then
47 | echo_content skyBlue "---> 安装 RustDesk Server hbbr"
48 |
49 | docker run -d --name ${rustdesk_server_hbbr} --restart always \
50 | --network=host \
51 | -e TZ=Asia/Shanghai \
52 | -v ${RUSTDESK_SERVER}data/:/root/ \
53 | rustdesk/rustdesk-server hbbr
54 |
55 | else
56 | echo_content skyBlue "---> 你已经安装了 RustDesk Server hbbr"
57 | fi
58 |
59 | if [[ -z $(docker ps -q -f "name=^${rustdesk_server_hbbr}$") ]]; then
60 | install_rustdesk_hbbs
61 | fi
62 |
63 | }
64 |
65 | install_rustdesk_hbbs() {
66 | if [[ -z $(docker ps -q -f "name=^${rustdesk_server_hbbs}$") ]]; then
67 | echo_content skyBlue "---> 安装 RustDesk Server hbbs"
68 |
69 | docker run -d --name ${rustdesk_server_hbbs} --restart always \
70 | --network=host \
71 | -e TZ=Asia/Shanghai \
72 | -v ${RUSTDESK_SERVER}data/:/root/ \
73 | rustdesk/rustdesk-server hbbs
74 |
75 | else
76 | echo_content skyBlue "---> 你已经安装了 RustDesk Server hbbs"
77 | fi
78 | }
79 |
80 | main() {
81 | cd "$HOME" || exit 1
82 |
83 | init_var
84 |
85 | create_dirs
86 |
87 | install_docker
88 |
89 | install_rustdesk_bbr
90 | }
91 |
92 | main "$@"
93 |
--------------------------------------------------------------------------------
/docker/postgresql.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # PostgreSQL Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | POSTGRESQL_DATA="/dockerdata/postgresql/"
12 | postgresql_ip="jy-postgresql"
13 | postgresql_port=9876
14 | postgresql_user="postgres"
15 | postgresql_pas=""
16 | }
17 |
18 | echo_content() {
19 | local color_code
20 | case $1 in
21 | "red") color_code="\033[31m" ;;
22 | "green") color_code="\033[32m" ;;
23 | "yellow") color_code="\033[33m" ;;
24 | "blue") color_code="\033[34m" ;;
25 | "purple") color_code="\033[35m" ;;
26 | "skyBlue") color_code="\033[36m" ;;
27 | "white") color_code="\033[37m" ;;
28 | *) color_code="\033[0m" ;;
29 | esac
30 | ${ECHO_TYPE} "${color_code}$2\033[0m"
31 | }
32 |
33 | create_dirs() {
34 | mkdir -p ${POSTGRESQL_DATA}
35 | }
36 |
37 | install_docker() {
38 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
39 | }
40 |
41 | install_postgresql() {
42 | if [[ -z $(docker ps -q -f "name=^${postgresql_ip}$") ]]; then
43 | read -r -p "请输入数据库的端口(默认:9876): " postgresql_port
44 | [[ -z "${postgresql_port}" ]] && postgresql_port=9876
45 | read -r -p "请输入数据库的用户名(默认:postgres): " postgresql_user
46 | [[ -z "${postgresql_user}" ]] && postgresql_user="postgres"
47 | while read -r -p "请输入数据库的密码(必填): " postgresql_pas; do
48 | if [[ -z "${postgresql_pas}" ]]; then
49 | echo_content red "密码不能为空"
50 | else
51 | break
52 | fi
53 | done
54 |
55 | docker pull postgres:13 &&
56 | docker run -d --name ${postgresql_ip} --restart always \
57 | --network=host \
58 | -e POSTGRES_USER="${postgresql_user}" \
59 | -e POSTGRES_PASSWORD="${postgresql_pas}" \
60 | -e TZ="Asia/Shanghai" \
61 | -v ${POSTGRESQL_DATA}data:/var/lib/postgresql/data \
62 | postgres:13 \
63 | -c "port=${postgresql_port}"
64 |
65 | if [[ -n $(docker ps -q -f "name=^${postgresql_ip}$" -f "status=running") ]]; then
66 | echo_content skyBlue "---> PostgreSQL 安装完成"
67 | echo_content yellow "---> PostgreSQL postgres 的数据库密码(请妥善保存): ${postgresql_pas}"
68 | else
69 | echo_content red "---> PostgreSQL 安装失败或运行异常,请尝试修复或卸载重装"
70 | exit 1
71 | fi
72 | else
73 | echo_content skyBlue "---> 你已经安装了 PostgreSQL"
74 | fi
75 | }
76 |
77 | main() {
78 | cd "$HOME" || exit 1
79 |
80 | init_var
81 |
82 | create_dirs
83 |
84 | install_docker
85 |
86 | install_postgresql
87 | }
88 |
89 | main "$@"
90 |
--------------------------------------------------------------------------------
/docker/gitlab.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # GitLab Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | # 官方文档:https://docs.gitlab.com/ee/install/docker.html
9 |
10 | init_var() {
11 | ECHO_TYPE="echo -e"
12 |
13 | GITLAB_DATA="/dockerdata/gitlab/"
14 | GITLAB_CONFIG="${GITLAB_DATA}config/"
15 | GITLAB_LOG="${GITLAB_DATA}logs/"
16 | GITLAB_OPT="${GITLAB_DATA}opt/"
17 | gitlab_ip="jy-gitlab"
18 | gitlab_http_port=80
19 | gitlab_https_port=443
20 | gitlab_ssh_port=22
21 | }
22 |
23 | echo_content() {
24 | local color_code
25 | case $1 in
26 | "red") color_code="\033[31m" ;;
27 | "green") color_code="\033[32m" ;;
28 | "yellow") color_code="\033[33m" ;;
29 | "blue") color_code="\033[34m" ;;
30 | "purple") color_code="\033[35m" ;;
31 | "skyBlue") color_code="\033[36m" ;;
32 | "white") color_code="\033[37m" ;;
33 | *) color_code="\033[0m" ;;
34 | esac
35 | ${ECHO_TYPE} "${color_code}$2\033[0m"
36 | }
37 |
38 | create_dirs() {
39 | mkdir -p ${GITLAB_DATA}
40 | mkdir -p ${GITLAB_CONFIG}
41 | mkdir -p ${GITLAB_LOG}
42 | mkdir -p ${GITLAB_OPT}
43 | }
44 |
45 | install_gitlab() {
46 | if [[ -z $(docker ps -q -f "name=^${gitlab_ip}$") ]]; then
47 | echo_content skyBlue "---> 安装 GitLab"
48 |
49 | read -r -p "请输入GitLab的HTTP端口(默认:80): " gitlab_http_port
50 | [[ -z "${gitlab_http_port}" ]] && gitlab_http_port=80
51 | read -r -p "请输入GitLab的HTTPS端口(默认:443): " gitlab_https_port
52 | [[ -z "${gitlab_https_port}" ]] && gitlab_https_port=443
53 | read -r -p "请输入GitLab的SSH端口(默认:22): " gitlab_ssh_port
54 | [[ -z "${gitlab_ssh_port}" ]] && gitlab_ssh_port=22
55 |
56 | docker pull gitlab/gitlab-ce:15.11.11-ce.0 &&
57 | docker run -d --name ${gitlab_ip} --restart always \
58 | -e TZ=Asia/Shanghai \
59 | -p ${gitlab_http_port}:80 \
60 | -p ${gitlab_https_port}:443 \
61 | -p ${gitlab_ssh_port}:22 \
62 | -v ${GITLAB_CONFIG}gitlab.rb:/etc/gitlab/gitlab.rb \
63 | -v ${GITLAB_LOG}:/var/log/gitlab \
64 | -v ${GITLAB_OPT}:/var/opt/gitlab \
65 | gitlab/gitlab-ce:15.11.11-ce.0
66 |
67 | if [[ -n $(docker ps -q -f "name=^${gitlab_ip}$" -f "status=running") ]]; then
68 | gitlab_password=$(docker exec cat ${GITLAB_CONFIG}initial_root_password)
69 | echo_content skyBlue "---> GitLab安装完成"
70 | echo_content yellow "---> GitLab的用户号名(请妥善保存): root"
71 | echo_content yellow "---> GitLab的密码(请妥善保存): ${gitlab_password}"
72 | else
73 | echo_content red "---> GitLab安装失败或运行异常,请尝试修复或卸载重装"
74 | exit 1
75 | fi
76 | else
77 | echo_content skyBlue "---> 你已经安装了GitLab"
78 | fi
79 | }
80 |
81 | main() {
82 | cd "$HOME" || exit 1
83 |
84 | init_var
85 |
86 | create_dirs
87 |
88 | install_docker
89 |
90 | install_gitlab
91 | }
92 |
93 | main "$@"
94 |
--------------------------------------------------------------------------------
/docker/kibana.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Kibana Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | # 官方文档:https://www.elastic.co/guide/en/kibana/7.17/settings.html
9 |
10 | init_var() {
11 | ECHO_TYPE="echo -e"
12 |
13 | KIBANA_DATA="/dockerdata/kibana/"
14 | KIBANA_DATA_CONFIG="${KIBANA_DATA}config/"
15 | kibana_ip="jy-kibana"
16 | kibana_server_port=5601
17 | kibana_server_name="jy-kibana"
18 | es_url="http://127.0.0.1:9200"
19 | es_username="elastic"
20 | es_password="elastic"
21 | }
22 |
23 | echo_content() {
24 | local color_code
25 | case $1 in
26 | "red") color_code="\033[31m" ;;
27 | "green") color_code="\033[32m" ;;
28 | "yellow") color_code="\033[33m" ;;
29 | "blue") color_code="\033[34m" ;;
30 | "purple") color_code="\033[35m" ;;
31 | "skyBlue") color_code="\033[36m" ;;
32 | "white") color_code="\033[37m" ;;
33 | *) color_code="\033[0m" ;;
34 | esac
35 | ${ECHO_TYPE} "${color_code}$2\033[0m"
36 | }
37 |
38 | create_dirs() {
39 | mkdir -p ${KIBANA_DATA}
40 | mkdir -p ${KIBANA_DATA}config/
41 | }
42 |
43 | install_docker() {
44 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
45 | }
46 |
47 | install_kibana() {
48 | if [[ -z $(docker ps -q -f "name=^${kibana_ip}$") ]]; then
49 | echo_content skyBlue "---> 安装 Kibana"
50 |
51 | read -r -p "请输入Kibana的端口(默认:5601): " kibana_server_port
52 | [[ -z "${kibana_server_port}" ]] && kibana_server_port=5601
53 | read -r -p "请输入Kibana的主机名(默认:jy-kibana): " kibana_server_name
54 | [[ -z "${kibana_server_name}" ]] && kibana_server_name="jy-kibana"
55 |
56 | read -r -p "请输入Elasticsearch的URL(默认:http://127.0.0.1:9200): " es_url
57 | [[ -z "${es_url}" ]] && es_url="http://127.0.0.1:9200"
58 | read -r -p "请输入Elasticsearch的用户名(默认:elastic): " es_username
59 | [[ -z "${es_username}" ]] && es_username="elastic"
60 | read -r -p "请输入Elasticsearch的密码(默认:elastic): " es_password
61 | [[ -z "${es_password}" ]] && es_password="elastic"
62 |
63 | cat >${KIBANA_DATA}config/kibana.yml < Kibana安装完成"
82 | else
83 | echo_content red "---> Kibana安装失败或运行异常,请尝试修复或卸载重装"
84 | exit 1
85 | fi
86 | else
87 | echo_content skyBlue "---> 你已经安装了Kibana"
88 | fi
89 | }
90 |
91 | main() {
92 | cd "$HOME" || exit 1
93 |
94 | init_var
95 |
96 | create_dirs
97 |
98 | install_docker
99 |
100 | install_kibana
101 | }
102 |
103 | main "$@"
104 |
--------------------------------------------------------------------------------
/docker/minio.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Minio Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | MINIO_DATA="/dockerdata/minio/"
12 | MINIO_DATA_DATA="${MINIO_DATA}data/"
13 | MINIO_DATA_CONFIG="${MINIO_DATA}config/"
14 | minio_ip="jy-minio"
15 | minio_server_port=9000
16 | minio_console_port=9001
17 | minio_root_user="admin"
18 | minio_root_password=""
19 | }
20 |
21 | echo_content() {
22 | local color_code
23 | case $1 in
24 | "red") color_code="\033[31m" ;;
25 | "green") color_code="\033[32m" ;;
26 | "yellow") color_code="\033[33m" ;;
27 | "blue") color_code="\033[34m" ;;
28 | "purple") color_code="\033[35m" ;;
29 | "skyBlue") color_code="\033[36m" ;;
30 | "white") color_code="\033[37m" ;;
31 | *) color_code="\033[0m" ;;
32 | esac
33 | ${ECHO_TYPE} "${color_code}$2\033[0m"
34 | }
35 |
36 | create_dirs() {
37 | mkdir -p ${MINIO_DATA}
38 | mkdir -p ${MINIO_DATA_DATA}
39 | mkdir -p ${MINIO_DATA_CONFIG}
40 | }
41 |
42 | install_docker() {
43 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
44 | }
45 |
46 | install_minio() {
47 | if [[ -z $(docker ps -q -f "name=^${minio_ip}$") ]]; then
48 | echo_content skyBlue "---> 安装 Minio"
49 |
50 | read -r -p "请输入Minio的服务端口(默认:9000): " minio_server_port
51 | [[ -z "${minio_server_port}" ]] && minio_server_port=9000
52 | read -r -p "请输入Minio的控制台端口(默认:9001): " minio_console_port
53 | [[ -z "${minio_console_port}" ]] && minio_console_port=9001
54 | read -r -p "请输入Minio的控制台用户名(默认:admin): " minio_root_user
55 | [[ -z "${minio_root_user}" ]] && minio_root_user="admin"
56 | while read -r -p "请输入Minio的控制台密码: " minio_root_password; do
57 | if [[ -z "${minio_root_password}" ]]; then
58 | echo_content red "密码不能为空"
59 | elif [[ ${#minio_root_password} -lt 8 ]]; then
60 | echo_content red "密码长度不能小于8位"
61 | else
62 | break
63 | fi
64 | done
65 |
66 | docker pull minio/minio &&
67 | docker run -d --name ${minio_ip} --restart=always \
68 | --network=host \
69 | -e "MINIO_ROOT_USER=${minio_root_user}" \
70 | -e "MINIO_ROOT_PASSWORD=${minio_root_password}" \
71 | -e TZ=Asia/Shanghai \
72 | -v ${MINIO_DATA_DATA}:/data \
73 | -v ${MINIO_DATA_CONFIG}:/root/.minio \
74 | minio/minio \
75 | server /data --address ":${minio_server_port}" --console-address ":${minio_console_port}"
76 |
77 | if [[ -n $(docker ps -q -f "name=^${minio_ip}$" -f "status=running") ]]; then
78 | echo_content skyBlue "---> Minio安装完成"
79 | echo_content yellow "---> Minio的用户号名(请妥善保存): ${minio_root_user}"
80 | echo_content yellow "---> Minio的密码(请妥善保存): ${minio_root_password}"
81 | else
82 | echo_content red "---> Minio安装失败或运行异常,请尝试修复或卸载重装"
83 | exit 1
84 | fi
85 | else
86 | echo_content skyBlue "---> 你已经安装了Minio"
87 | fi
88 | }
89 |
90 | main() {
91 | cd "$HOME" || exit 1
92 |
93 | init_var
94 |
95 | create_dirs
96 |
97 | install_docker
98 |
99 | install_minio
100 | }
101 |
102 | main "$@"
103 |
--------------------------------------------------------------------------------
/docker/mysql.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # MySQL Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | MySQL_DATA="/dockerdata/mysql/"
12 | MySQL_DATA_MYSQL="${MySQL_DATA}/mysql/"
13 | mysql_ip="jy-mysql"
14 | mysql_port=9507
15 | mysql_user="root"
16 | mysql_pas=""
17 | }
18 |
19 | echo_content() {
20 | local color_code
21 | case $1 in
22 | "red") color_code="\033[31m" ;;
23 | "green") color_code="\033[32m" ;;
24 | "yellow") color_code="\033[33m" ;;
25 | "blue") color_code="\033[34m" ;;
26 | "purple") color_code="\033[35m" ;;
27 | "skyBlue") color_code="\033[36m" ;;
28 | "white") color_code="\033[37m" ;;
29 | *) color_code="\033[0m" ;;
30 | esac
31 | ${ECHO_TYPE} "${color_code}$2\033[0m"
32 | }
33 |
34 | create_dirs() {
35 | mkdir -p ${MySQL_DATA}
36 | mkdir -p ${MySQL_DATA_MYSQL}
37 | }
38 |
39 | install_docker() {
40 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
41 | }
42 |
43 | install_mysql() {
44 | if [[ -z $(docker ps -q -f "name=^${mysql_ip}$") ]]; then
45 | echo_content skyBlue "---> 安装 MySQL"
46 |
47 | read -r -p "请输入数据库的端口(默认:9507): " mysql_port
48 | [[ -z "${mysql_port}" ]] && mysql_port=9507
49 | read -r -p "请输入数据库的用户名(默认:root): " mysql_user
50 | [[ -z "${mysql_user}" ]] && mysql_user="root"
51 | while read -r -p "请输入数据库的密码(必填): " mysql_pas; do
52 | if [[ -z "${mysql_pas}" ]]; then
53 | echo_content red "密码不能为空"
54 | else
55 | break
56 | fi
57 | done
58 |
59 | if [[ "${mysql_user}" == "root" ]]; then
60 | docker pull mysql:5.7.42 &&
61 | docker run -d --name ${mysql_ip} --restart always \
62 | --network=host \
63 | -e MYSQL_ROOT_PASSWORD="${mysql_pas}" \
64 | -e TZ=Asia/Shanghai \
65 | -v ${MySQL_DATA_MYSQL}:/var/lib/mysql \
66 | mysql:5.7.42 \
67 | --port ${mysql_port} \
68 | --character-set-server=utf8mb4 \
69 | --collation-server=utf8mb4_unicode_ci
70 | else
71 | docker pull mysql:5.7.42 &&
72 | docker run -d --name ${mysql_ip} --restart always \
73 | --network=host \
74 | -e MYSQL_ROOT_PASSWORD="${mysql_pas}" \
75 | -e MYSQL_USER="${mysql_user}" \
76 | -e MYSQL_PASSWORD="${mysql_pas}" \
77 | -e TZ=Asia/Shanghai \
78 | -v ${MySQL_DATA_MYSQL}:/var/lib/mysql \
79 | mysql:5.7.42 \
80 | --port ${mysql_port} \
81 | --character-set-server=utf8mb4 \
82 | --collation-server=utf8mb4_unicode_ci
83 | fi
84 |
85 | if [[ -n $(docker ps -q -f "name=^${mysql_ip}$" -f "status=running") ]]; then
86 | echo_content skyBlue "---> MySQL 安装完成"
87 | echo_content yellow "---> MySQL root 的数据库密码(请妥善保存): ${mysql_pas}"
88 | if [[ "${mysql_user}" != "root" ]]; then
89 | echo_content yellow "---> MySQL ${mysql_user}的数据库密码(请妥善保存): ${mysql_pas}"
90 | fi
91 | else
92 | echo_content red "---> MySQL 安装失败或运行异常,请尝试修复或卸载重装"
93 | exit 1
94 | fi
95 | else
96 | echo_content skyBlue "---> 你已经安装了 MySQL"
97 | fi
98 | }
99 |
100 | main() {
101 | cd "$HOME" || exit 1
102 |
103 | init_var
104 |
105 | create_dirs
106 |
107 | install_docker
108 |
109 | install_mysql
110 | }
111 |
112 | main "$@"
113 |
--------------------------------------------------------------------------------
/docker/es.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Elasticsearch Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | # 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docker.html#docker
9 | # 设置密码:进入容器执行 `elasticsearch-setup-passwords interactive`
10 |
11 | init_var() {
12 | ECHO_TYPE="echo -e"
13 |
14 | ES_DATA="/dockerdata/es/"
15 | ES_DATA_CONFIG="${ES_DATA}config/"
16 | ES_DATA_LOGS="${ES_DATA}logs/"
17 | ES_DATA_DATA="${ES_DATA}data/"
18 | ES_DATA_PLUGINS="${ES_DATA}plugins/"
19 | es_ip="jy-es"
20 | es_http_port=9200
21 | es_transport_port=9300
22 | es_node_name='node-1'
23 | }
24 |
25 | echo_content() {
26 | local color_code
27 | case $1 in
28 | "red") color_code="\033[31m" ;;
29 | "green") color_code="\033[32m" ;;
30 | "yellow") color_code="\033[33m" ;;
31 | "blue") color_code="\033[34m" ;;
32 | "purple") color_code="\033[35m" ;;
33 | "skyBlue") color_code="\033[36m" ;;
34 | "white") color_code="\033[37m" ;;
35 | *) color_code="\033[0m" ;;
36 | esac
37 | ${ECHO_TYPE} "${color_code}$2\033[0m"
38 | }
39 |
40 | create_dirs() {
41 | mkdir -p ${ES_DATA}
42 | mkdir -p ${ES_DATA_CONFIG} ${ES_DATA_LOGS} ${ES_DATA_DATA} ${ES_DATA_PLUGINS}
43 | chmod -R g+rwx ${ES_DATA}
44 | }
45 |
46 | install_docker() {
47 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
48 | }
49 |
50 | install_es() {
51 | if [[ -z $(docker ps -q -f "name=^${es_ip}$") ]]; then
52 | echo_content skyBlue "---> 安装 Elasticsearch"
53 |
54 | read -r -p "请输入ES的HTTP端口(默认:9200): " es_http_port
55 | [[ -z "${es_http_port}" ]] && es_http_port=9200
56 | read -r -p "请输入ES的传输端口(默认:9300): " es_transport_port
57 | [[ -z "${es_transport_port}" ]] && es_transport_port=9300
58 | read -r -p "请输入ES的节点名称(默认:node-1): " es_node_name
59 | [[ -z "${es_node_name}" ]] && es_node_name='node-1'
60 |
61 | cat >${ES_DATA}config/elasticsearch.yml < Elasticsearch安装完成"
87 | echo_content yellow "---> 设置密码请进入容器执行: elasticsearch-setup-passwords interactive"
88 | else
89 | echo_content red "---> Elasticsearch安装失败或运行异常,请尝试修复或卸载重装"
90 | exit 1
91 | fi
92 | else
93 | echo_content skyBlue "---> 你已经安装了Elasticsearch"
94 | fi
95 | }
96 |
97 | main() {
98 | cd "$HOME" || exit 1
99 |
100 | init_var
101 |
102 | create_dirs
103 |
104 | install_docker
105 |
106 | install_es
107 | }
108 |
109 | main "$@"
--------------------------------------------------------------------------------
/docker/uninstall.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Docker Uninstallation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | package_manager=""
12 | release=""
13 | version=""
14 | get_arch=""
15 | }
16 |
17 | echo_content() {
18 | local color_code
19 | case $1 in
20 | "red") color_code="\033[31m" ;;
21 | "green") color_code="\033[32m" ;;
22 | "yellow") color_code="\033[33m" ;;
23 | "blue") color_code="\033[34m" ;;
24 | "purple") color_code="\033[35m" ;;
25 | "skyBlue") color_code="\033[36m" ;;
26 | "white") color_code="\033[37m" ;;
27 | *) color_code="\033[0m" ;;
28 | esac
29 | ${ECHO_TYPE} "${color_code}$2\033[0m"
30 | }
31 |
32 | # 检查系统
33 | check_sys() {
34 | if [[ $(id -u) != "0" ]]; then
35 | echo_content red "You must be root to run this script"
36 | exit 1
37 | fi
38 |
39 | if [[ $(command -v yum) ]]; then
40 | package_manager='yum'
41 | elif [[ $(command -v dnf) ]]; then
42 | package_manager='dnf'
43 | elif [[ $(command -v apt-get) ]]; then
44 | package_manager='apt-get'
45 | elif [[ $(command -v apt) ]]; then
46 | package_manager='apt'
47 | fi
48 |
49 | if [[ -z "${package_manager}" ]]; then
50 | echo_content red "This system is not currently supported"
51 | exit 1
52 | fi
53 |
54 | if [[ -n $(find /etc -name "redhat-release") ]] || grep /dev/null; then
57 | version=$(rpm -q --queryformat '%{VERSION}' centos-stream-release)
58 | elif rpm -q centos-release &>/dev/null; then
59 | version=$(rpm -q --queryformat '%{VERSION}' centos-release)
60 | fi
61 | elif grep 请先安装 Docker"
126 | fi
127 | }
128 |
129 | main() {
130 | cd "$HOME" || exit 1
131 |
132 | init_var
133 |
134 | check_sys
135 |
136 | uninstall_docker
137 | }
138 |
139 | main "$@"
140 |
--------------------------------------------------------------------------------
/docker/skywalking-oap.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # SkyWalking Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | can_google=0
12 |
13 | SW_DATA="/dockerdata/skywalking/"
14 | SW_DATA_OAP_LIBS="${SW_DATA}oap-libs/"
15 | sw_oap_ip="jy-skywalking-oap"
16 | sw_oap_http=12800
17 | sw_oap_grpc=11800
18 |
19 | es_url="http://127.0.0.1:9200"
20 | es_username="elastic"
21 | es_password="elastic"
22 |
23 | mysql_jdbc_url="jdbc:mysql://127.0.0.1:9507/skywalking"
24 | mysql_user="root"
25 | mysql_pass="123456"
26 |
27 | mysql_connector_java_url_aliyun="https://mirrors.aliyun.com/mysql/Connector-J/mysql-connector-java-8.0.28.tar.gz"
28 | mysql_connector_java_url="https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar"
29 | }
30 |
31 | echo_content() {
32 | local color_code
33 | case $1 in
34 | "red") color_code="\033[31m" ;;
35 | "green") color_code="\033[32m" ;;
36 | "yellow") color_code="\033[33m" ;;
37 | "blue") color_code="\033[34m" ;;
38 | "purple") color_code="\033[35m" ;;
39 | "skyBlue") color_code="\033[36m" ;;
40 | "white") color_code="\033[37m" ;;
41 | *) color_code="\033[0m" ;;
42 | esac
43 | ${ECHO_TYPE} "${color_code}$2\033[0m"
44 | }
45 |
46 | can_connect() {
47 | if ping -c2 -i0.3 -W1 "$1" &>/dev/null; then
48 | return 0
49 | else
50 | return 1
51 | fi
52 | }
53 |
54 | create_dirs() {
55 | mkdir -p ${SW_DATA}
56 | mkdir -p ${SW_DATA_OAP_LIBS}
57 | }
58 |
59 | install_docker() {
60 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
61 | }
62 |
63 | install_skywalking() {
64 | if [[ -z $(docker ps -q -f "name=^${sw_oap_ip}$") ]]; then
65 | echo_content skyBlue "---> 安装 SkyWalking OAP"
66 |
67 | echo_content yellow "---> 设置 SkyWalking OAP 存储方式"
68 | echo_content yellow "1. Elasticsearch7"
69 | echo_content yellow "2. MySQL"
70 | read -r -p "请选择(默认:1): " sw_storage
71 | [[ -z "${sw_storage}" ]] && sw_storage=1
72 |
73 | if [[ "${sw_storage}" == "1" ]]; then
74 | read -r -p "请输入Elasticsearch的URL(默认:http://127.0.0.1:9200): " es_url
75 | [[ -z "${es_url}" ]] && es_url="http://127.0.0.1:9200"
76 | read -r -p "请输入Elasticsearch的用户名(默认:elastic): " es_username
77 | [[ -z "${es_username}" ]] && es_username="elastic"
78 | read -r -p "请输入Elasticsearch的密码(默认:elastic): " es_password
79 | [[ -z "${es_password}" ]] && es_password="elastic"
80 |
81 | docker pull apache/skywalking-oap-server:9.5.0 &&
82 | docker run -d --name ${sw_oap_ip} --restart always \
83 | --network=host \
84 | -e TZ=Asia/Shanghai \
85 | -e SW_CORE_REST_PORT=${sw_oap_http} \
86 | -e SW_CORE_GRPC_PORT=${sw_oap_grpc} \
87 | -e SW_STORAGE=elasticsearch \
88 | -e SW_STORAGE_ES_CLUSTER_NODES="${es_url}" \
89 | -e SW_ES_USER="${es_username}" \
90 | -e SW_ES_PASSWORD="${es_password}" \
91 | apache/skywalking-oap-server:9.5.0
92 | elif [[ "${sw_storage}" == "2" ]]; then
93 | read -r -p "请输入MySQL的JDBC URL(默认:jdbc:mysql://127.0.0.1:9507/skywalking): " mysql_jdbc_url
94 | [[ -z "${mysql_jdbc_url}" ]] && mysql_jdbc_url="jdbc:mysql://127.0.0.1:9507/skywalking"
95 | read -r -p "请输入数据库的用户名(默认:root): " mysql_user
96 | [[ -z "${mysql_user}" ]] && mysql_user="root"
97 | while read -r -p "请输入数据库的密码(必填): " mysql_pass; do
98 | if [[ -z "${mysql_pass}" ]]; then
99 | echo_content red "密码不能为空"
100 | else
101 | break
102 | fi
103 | done
104 |
105 | # 下载MySQL驱动
106 | can_connect www.google.com && can_google=1
107 |
108 | if [[ ${can_google} == 0 ]]; then
109 | wget -c ${mysql_connector_java_url_aliyun} -O ${SW_DATA_OAP_LIBS}mysql-connector-java-8.0.28.tar.gz &&
110 | tar -zxvf ${SW_DATA_OAP_LIBS}mysql-connector-java-8.0.28.tar.gz -C ${SW_DATA_OAP_LIBS} &&
111 | cp ${SW_DATA_OAP_LIBS}mysql-connector-java-8.0.28/mysql-connector-java-8.0.28.jar ${SW_DATA_OAP_LIBS}
112 | else
113 | wget -c ${mysql_connector_java_url} -O ${SW_DATA_OAP_LIBS}mysql-connector-java-8.0.28.jar
114 | fi
115 | docker pull apache/skywalking-oap-server:9.5.0 &&
116 | docker run -d --name ${sw_oap_ip} --restart always \
117 | --network=host \
118 | -e TZ=Asia/Shanghai \
119 | -e SW_CORE_REST_PORT=${sw_oap_http} \
120 | -e SW_CORE_GRPC_PORT=${sw_oap_grpc} \
121 | -e SW_STORAGE=mysql \
122 | -e SW_JDBC_URL="${mysql_jdbc_url}" \
123 | -e SW_DATA_SOURCE_USER="${mysql_user}" \
124 | -e SW_DATA_SOURCE_PASSWORD="${mysql_pass}" \
125 | -v ${SW_DATA_OAP_LIBS}mysql-connector-java-8.0.28.jar:/skywalking/oap-libs/mysql-connector-java-8.0.28.jar \
126 | apache/skywalking-oap-server:9.5.0
127 | fi
128 |
129 | if [[ -n $(docker ps -q -f "name=^${sw_oap_ip}$" -f "status=running") ]]; then
130 | echo_content skyBlue "---> SkyWalking OAP安装完成"
131 | else
132 | echo_content red "---> SkyWalking OAP安装失败或运行异常,请尝试修复或卸载重装"
133 | exit 1
134 | fi
135 | else
136 | echo_content skyBlue "---> 你已经安装了SkyWalking OAP"
137 | fi
138 | }
139 |
140 | main() {
141 | cd "$HOME" || exit 1
142 |
143 | init_var
144 |
145 | create_dirs
146 |
147 | install_docker
148 |
149 | install_skywalking
150 | }
151 |
152 | main "$@"
153 |
--------------------------------------------------------------------------------
/docker/ssr.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # SSR Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e
7 |
8 | init_var() {
9 | ECHO_TYPE="echo -e"
10 |
11 | # ShadowsocksR
12 | SSR_DATA="/dockerdata/ssr/"
13 | ssr_ip="jy-ssr"
14 | ssr_port=80
15 | ssr_password="123456"
16 | ssr_method=""
17 | ssr_protocols=""
18 | ssr_obfs=""
19 | methods=(
20 | none
21 | aes-256-cfb
22 | aes-192-cfb
23 | aes-128-cfb
24 | aes-256-cfb8
25 | aes-192-cfb8
26 | aes-128-cfb8
27 | aes-256-ctr
28 | aes-192-ctr
29 | aes-128-ctr
30 | chacha20-ietf
31 | chacha20
32 | salsa20
33 | xchacha20
34 | xsalsa20
35 | rc4-md5
36 | )
37 | # https://github.com/shadowsocksr-rm/shadowsocks-rss/blob/master/ssr.md
38 | protocols=(
39 | origin
40 | verify_deflate
41 | auth_sha1_v4
42 | auth_sha1_v4_compatible
43 | auth_aes128_md5
44 | auth_aes128_sha1
45 | auth_chain_a
46 | auth_chain_b
47 | auth_chain_c
48 | auth_chain_d
49 | auth_chain_e
50 | auth_chain_f
51 | )
52 | obfs=(
53 | plain
54 | http_simple
55 | http_simple_compatible
56 | http_post
57 | http_post_compatible
58 | tls1.2_ticket_auth
59 | tls1.2_ticket_auth_compatible
60 | tls1.2_ticket_fastauth
61 | tls1.2_ticket_fastauth_compatible
62 | )
63 | }
64 |
65 | echo_content() {
66 | local color_code
67 | case $1 in
68 | "red") color_code="\033[31m" ;;
69 | "green") color_code="\033[32m" ;;
70 | "yellow") color_code="\033[33m" ;;
71 | "blue") color_code="\033[34m" ;;
72 | "purple") color_code="\033[35m" ;;
73 | "skyBlue") color_code="\033[36m" ;;
74 | "white") color_code="\033[37m" ;;
75 | *) color_code="\033[0m" ;;
76 | esac
77 | ${ECHO_TYPE} "${color_code}$2\033[0m"
78 | }
79 |
80 | create_dirs() {
81 | mkdir -p ${SSR_DATA}
82 | }
83 |
84 | install_docker() {
85 | bash <(curl -fsSL https://github.com/jonssonyan/install-script/raw/main/docker/install.sh)
86 | }
87 |
88 | install_ssr() {
89 | if [[ -z $(docker ps -q -f "name=^${ssr_ip}$") ]]; then
90 | echo_content skyBlue "---> 安装 ShadowsocksR"
91 |
92 | read -r -p "请输入ShadowsocksR的端口(默认:80): " ssr_port
93 | [[ -z "${ssr_port}" ]] && ssr_port=80
94 | read -r -p "请输入ShadowsocksR的密码(默认:123456): " ssr_password
95 | [[ -z "${ssr_password}" ]] && ssr_password="123456"
96 |
97 | while true; do
98 | for ((i = 1; i <= ${#methods[@]}; i++)); do
99 | hint="${methods[$i - 1]}"
100 | echo "${i}) $(echo_content yellow "${hint}")"
101 | done
102 | read -r -p "请选择ShadowsocksR的加密类型(默认:${methods[0]}): " r_methods
103 | [[ -z "${r_methods}" ]] && r_methods=1
104 | expr ${r_methods} + 1 &>/dev/null
105 | if [[ "$?" != "0" ]]; then
106 | echo_content red "请输入数字"
107 | continue
108 | fi
109 | if [[ "${r_methods}" -lt 1 || "${r_methods}" -gt ${#methods[@]} ]]; then
110 | echo_content red "输入的数字范围在 1 到 ${#methods[@]}"
111 | continue
112 | fi
113 | ssr_method=${methods[r_methods - 1]}
114 | break
115 | done
116 |
117 | while true; do
118 | for ((i = 1; i <= ${#protocols[@]}; i++)); do
119 | hint="${protocols[$i - 1]}"
120 | echo "${i}) $(echo_content yellow "${hint}")"
121 | done
122 | read -r -p "请选择ShadowsocksR的协议(默认:${protocols[0]}): " r_protocols
123 | [[ -z "${r_protocols}" ]] && r_protocols=1
124 | expr ${r_protocols} + 1 &>/dev/null
125 | if [[ "$?" != "0" ]]; then
126 | echo_content red "请输入数字"
127 | continue
128 | fi
129 | if [[ "${r_protocols}" -lt 1 || "${r_protocols}" -gt ${#protocols[@]} ]]; then
130 | echo_content red "输入的数字范围在 1 到 ${#protocols[@]}"
131 | continue
132 | fi
133 | ssr_protocols=${protocols[r_protocols - 1]}
134 | break
135 | done
136 |
137 | while true; do
138 | for ((i = 1; i <= ${#obfs[@]}; i++)); do
139 | hint="${obfs[$i - 1]}"
140 | echo "${i}) $(echo_content yellow "${hint}")"
141 | done
142 | read -r -p "请选择ShadowsocksR的混淆方式(默认:${obfs[0]}): " r_obfs
143 | [[ -z "${r_obfs}" ]] && r_obfs=1
144 | expr ${r_obfs} + 1 &>/dev/null
145 | if [[ "$?" != "0" ]]; then
146 | echo_content red "请输入数字"
147 | continue
148 | fi
149 | if [[ "${r_obfs}" -lt 1 || "${r_obfs}" -gt ${#obfs[@]} ]]; then
150 | echo_content red "输入的数字范围在 1 到 ${#obfs[@]}"
151 | continue
152 | fi
153 | ssr_obfs=${obfs[r_obfs - 1]}
154 | break
155 | done
156 |
157 | cat >${SSR_DATA}config.json < ShadowsocksR安装完成"
187 | echo_content yellow "---> 端口: ${ssr_port}"
188 | echo_content yellow "---> 密码(请妥善保存): ${ssr_password}"
189 | echo_content yellow "---> 加密类型: ${ssr_method}"
190 | echo_content yellow "---> 协议: ${ssr_protocols}"
191 | echo_content yellow "---> 混淆方式: ${ssr_obfs}"
192 | else
193 | echo_content red "---> ShadowsocksR安装失败或运行异常,请尝试修复或卸载重装"
194 | exit 1
195 | fi
196 | else
197 | echo_content skyBlue "---> 你已经安装了ShadowsocksR"
198 | fi
199 | }
200 |
201 | main() {
202 | cd "$HOME" || exit 1
203 |
204 | init_var
205 |
206 | create_dirs
207 |
208 | install_docker
209 |
210 | install_ssr
211 | }
212 |
213 | main "$@"
214 |
--------------------------------------------------------------------------------
/docker/install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Docker Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e # Exit immediately if a command exits with a non-zero status
7 |
8 | # Initialize variables
9 | init_var() {
10 | ECHO_TYPE="echo -e"
11 |
12 | # System variables
13 | package_manager=""
14 | release=""
15 | version=""
16 | arch=""
17 | can_access_internet=1 # Default to true, will check google.com accessibility
18 |
19 | # Docker directories and files
20 | DOCKER_DATA="/dockerdata"
21 |
22 | # Docker configuration
23 | docker_mirror='"https://docker.m.daocloud.io"'
24 | DOCKER_CONFIG="/etc/docker"
25 | }
26 |
27 | # Colorized output functions
28 | echo_content() {
29 | local color_code
30 | case $1 in
31 | "red") color_code="\033[31m" ;;
32 | "green") color_code="\033[32m" ;;
33 | "yellow") color_code="\033[33m" ;;
34 | "blue") color_code="\033[34m" ;;
35 | "purple") color_code="\033[35m" ;;
36 | "skyBlue") color_code="\033[36m" ;;
37 | "white") color_code="\033[37m" ;;
38 | *) color_code="\033[0m" ;;
39 | esac
40 | ${ECHO_TYPE} "${color_code}$2\033[0m"
41 | }
42 |
43 | # Create necessary directories
44 | create_dirs() {
45 | mkdir -p ${DOCKER_DATA}
46 | }
47 |
48 | # Check if can connect to a host
49 | can_connect() {
50 | ping -c2 -i0.3 -W1 "$1" &>/dev/null
51 | return $?
52 | }
53 |
54 | # Check if service exists
55 | service_exists() {
56 | systemctl list-units --type=service --all | grep -Fq "$1.service"
57 | }
58 |
59 | # Check system compatibility and gather information
60 | check_system() {
61 | if [[ $(id -u) != "0" ]]; then
62 | echo_content red "You must be root to run this script"
63 | exit 1
64 | fi
65 |
66 | # Check internet connectivity
67 | if ! can_connect www.google.com; then
68 | can_access_internet=0
69 | echo_content yellow "Limited internet connectivity detected. Using Chinese mirrors."
70 | fi
71 |
72 | # Determine package manager
73 | if command -v yum &>/dev/null; then
74 | package_manager='yum'
75 | elif command -v dnf &>/dev/null; then
76 | package_manager='dnf'
77 | elif command -v apt-get &>/dev/null; then
78 | package_manager='apt-get'
79 | elif command -v apt &>/dev/null; then
80 | package_manager='apt'
81 | else
82 | echo_content red "Unsupported system. No compatible package manager found."
83 | exit 1
84 | fi
85 |
86 | # Determine OS distribution and version
87 | if [[ -n $(find /etc -name "redhat-release") ]] || grep /dev/null; then
90 | version=$(rpm -q --queryformat '%{VERSION}' centos-stream-release)
91 | elif rpm -q centos-release &>/dev/null; then
92 | version=$(rpm -q --queryformat '%{VERSION}' centos-release)
93 | fi
94 | elif grep Installing dependencies"
145 |
146 | if [[ "${package_manager}" == 'apt-get' || "${package_manager}" == 'apt' ]]; then
147 | ${package_manager} update -y
148 | fi
149 |
150 | ${package_manager} install -y \
151 | curl \
152 | wget \
153 | systemd \
154 | lrzsz \
155 | bash-completion
156 |
157 | echo_content skyBlue "---> Dependencies installed"
158 | }
159 |
160 | # Prepare environment
161 | prepare_environment() {
162 | echo_content skyBlue "---> Preparing environment"
163 |
164 | # Sync time
165 | timedatectl set-timezone Asia/Shanghai && timedatectl set-local-rtc 0
166 | echo_content skyBlue "---> Timezone set to Asia/Shanghai"
167 |
168 | # Restart required services
169 | if service_exists "rsyslog"; then
170 | systemctl restart rsyslog
171 | fi
172 |
173 | case "${release}" in
174 | centos)
175 | if service_exists "crond"; then
176 | systemctl restart crond
177 | fi
178 | ;;
179 | debian | ubuntu)
180 | if service_exists "cron"; then
181 | systemctl restart cron
182 | fi
183 | ;;
184 | esac
185 |
186 | # Disable SELinux if enabled
187 | if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then
188 | setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
189 | echo_content skyBlue "---> SELinux disabled"
190 | fi
191 |
192 | echo_content skyBlue "---> Environment preparation complete"
193 | }
194 |
195 | # Configure Docker daemon
196 | setup_docker() {
197 | echo_content skyBlue "---> Configuring Docker daemon"
198 |
199 | mkdir -p ${DOCKER_CONFIG}
200 |
201 | if [[ ${can_access_internet} == 0 ]]; then
202 | cat >${DOCKER_CONFIG}/daemon.json <${DOCKER_CONFIG}/daemon.json < Docker daemon configured"
224 | }
225 |
226 | # Install Docker
227 | install_docker() {
228 | if command -v docker &>/dev/null; then
229 | echo_content skyBlue "---> Docker is already installed"
230 | return
231 | fi
232 |
233 | echo_content skyBlue "---> Installing Docker"
234 |
235 | if [[ "${release}" == "centos" ]]; then
236 | if [[ "${package_manager}" == "dnf" ]]; then
237 | ${package_manager} install -y dnf-plugins-core
238 | else
239 | ${package_manager} install -y yum-utils
240 | fi
241 | if [[ ${can_access_internet} == 0 ]]; then
242 | ${package_manager} config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
243 | else
244 | ${package_manager} config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
245 | fi
246 | ${package_manager} makecache || ${package_manager} makecache fast
247 | elif [[ "${release}" == "debian" || "${release}" == "ubuntu" ]]; then
248 | ${package_manager} update -y
249 | ${package_manager} install -y \
250 | ca-certificates \
251 | curl \
252 | gnupg \
253 | lsb-release
254 |
255 | sudo install -m 0755 -d /etc/apt/keyrings
256 | if [[ ${can_access_internet} == 0 ]]; then
257 | sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/${release}/gpg -o /etc/apt/keyrings/docker.asc
258 | sudo chmod a+r /etc/apt/keyrings/docker.asc
259 | echo \
260 | "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/${release} \
261 | $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" |
262 | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
263 | else
264 | sudo curl -fsSL https://download.docker.com/linux/${release}/gpg -o /etc/apt/keyrings/docker.asc
265 | sudo chmod a+r /etc/apt/keyrings/docker.asc
266 | echo \
267 | "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/${release} \
268 | $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" |
269 | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
270 | fi
271 | ${package_manager} update -y
272 | fi
273 |
274 | ${package_manager} install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
275 |
276 | setup_docker
277 |
278 | systemctl enable docker && systemctl restart docker
279 |
280 | if command -v docker &>/dev/null; then
281 | echo_content skyBlue "---> Docker installation complete"
282 | else
283 | echo_content red "---> Docker installation failed"
284 | exit 1
285 | fi
286 | }
287 |
288 | # Main execution function
289 | main() {
290 | cd "$HOME" || exit 1
291 |
292 | # Initialize variables
293 | init_var
294 |
295 | # Create necessary directories
296 | create_dirs
297 |
298 | # Check system compatibility
299 | check_system
300 |
301 | # Install basic dependencies
302 | install_dependencies
303 |
304 | # Default behavior: prepare environment and install Docker
305 | prepare_environment
306 |
307 | install_docker
308 | }
309 |
310 | # Execute main function with all arguments
311 | main "$@"
312 |
--------------------------------------------------------------------------------
/docker-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Docker Services Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e # Exit immediately if a command exits with a non-zero status
7 |
8 | # Initialize variables
9 | init_var() {
10 | ECHO_TYPE="echo -e"
11 | SCRIPT_VERSION="1.2.0"
12 |
13 | # System variables
14 | package_manager=""
15 | release=""
16 | version=""
17 | arch=""
18 |
19 | # Docker directories and files
20 | DOCKER_DATA="/dockerdata"
21 |
22 | # Remote script base URL
23 | REMOTE_SCRIPT_BASE="https://github.com/jonssonyan/install-script/raw/main/docker"
24 | }
25 |
26 | # Colorized output functions
27 | echo_content() {
28 | local color_code
29 | case $1 in
30 | "red") color_code="\033[31m" ;;
31 | "green") color_code="\033[32m" ;;
32 | "yellow") color_code="\033[33m" ;;
33 | "blue") color_code="\033[34m" ;;
34 | "purple") color_code="\033[35m" ;;
35 | "skyBlue") color_code="\033[36m" ;;
36 | "white") color_code="\033[37m" ;;
37 | *) color_code="\033[0m" ;;
38 | esac
39 | ${ECHO_TYPE} "${color_code}$2\033[0m"
40 | }
41 |
42 | # Create necessary directories
43 | create_dirs() {
44 | mkdir -p ${DOCKER_DATA}
45 | }
46 |
47 | # Check if service exists
48 | service_exists() {
49 | systemctl list-units --type=service --all | grep -Fq "$1.service"
50 | }
51 |
52 | # Check system compatibility and gather information
53 | check_system() {
54 | if [[ $(id -u) != "0" ]]; then
55 | echo_content red "You must be root to run this script"
56 | exit 1
57 | fi
58 |
59 | # Determine package manager
60 | if command -v yum &>/dev/null; then
61 | package_manager='yum'
62 | elif command -v dnf &>/dev/null; then
63 | package_manager='dnf'
64 | elif command -v apt-get &>/dev/null; then
65 | package_manager='apt-get'
66 | elif command -v apt &>/dev/null; then
67 | package_manager='apt'
68 | else
69 | echo_content red "Unsupported system. No compatible package manager found."
70 | exit 1
71 | fi
72 |
73 | # Determine OS distribution and version
74 | if [[ -n $(find /etc -name "redhat-release") ]] || grep /dev/null; then
77 | version=$(rpm -q --queryformat '%{VERSION}' centos-stream-release)
78 | elif rpm -q centos-release &>/dev/null; then
79 | version=$(rpm -q --queryformat '%{VERSION}' centos-release)
80 | fi
81 | elif grep Installing dependencies"
132 |
133 | if [[ "${package_manager}" == 'apt-get' || "${package_manager}" == 'apt' ]]; then
134 | ${package_manager} update -y
135 | fi
136 |
137 | ${package_manager} install -y \
138 | curl \
139 | wget \
140 | systemd \
141 | lrzsz \
142 | bash-completion
143 |
144 | echo_content skyBlue "---> Dependencies installed"
145 | }
146 |
147 | # Prepare environment
148 | prepare_environment() {
149 | echo_content skyBlue "---> Preparing environment"
150 |
151 | # Sync time
152 | timedatectl set-timezone Asia/Shanghai && timedatectl set-local-rtc 0
153 | echo_content skyBlue "---> Timezone set to Asia/Shanghai"
154 |
155 | # Restart required services
156 | if service_exists "rsyslog"; then
157 | systemctl restart rsyslog
158 | fi
159 |
160 | case "${release}" in
161 | centos)
162 | if service_exists "crond"; then
163 | systemctl restart crond
164 | fi
165 | ;;
166 | debian | ubuntu)
167 | if service_exists "cron"; then
168 | systemctl restart cron
169 | fi
170 | ;;
171 | esac
172 |
173 | # Disable SELinux
174 | if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then
175 | setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
176 | echo_content skyBlue "---> SELinux disabled"
177 | fi
178 |
179 | echo_content skyBlue "---> Environment preparation complete"
180 | }
181 |
182 | # Install Docker service with remote script
183 | install_docker_service() {
184 | local service_name=$1
185 | local script_name=$2
186 | local require_docker=$3
187 |
188 | echo_content skyBlue "---> Installing ${service_name}"
189 |
190 | # Check if Docker is required and not installed
191 | if [[ "${require_docker}" == "true" ]] && ! command -v docker &>/dev/null; then
192 | echo_content yellow "---> Docker not found, installing Docker first..."
193 | bash <(curl -fsSL ${REMOTE_SCRIPT_BASE}/install.sh)
194 | fi
195 |
196 | # Run the remote installation script
197 | bash <(curl -fsSL ${REMOTE_SCRIPT_BASE}/${script_name})
198 |
199 | echo_content skyBlue "---> ${service_name} installation complete"
200 | }
201 |
202 | # Show installation help
203 | show_help() {
204 | echo_content green "Docker Services Installation Script v${SCRIPT_VERSION}"
205 | echo_content green "Usage: $0 [option]"
206 | echo_content green "Options:"
207 | echo_content yellow " docker Install Docker Engine"
208 | echo_content yellow " buildx Install Docker Buildx"
209 | echo_content yellow " uninstall Uninstall Docker"
210 | echo_content yellow " mysql Install MySQL 5.7.38"
211 | echo_content yellow " postgresql Install PostgreSQL 13"
212 | echo_content yellow " redis Install Redis 6.2.13"
213 | echo_content yellow " elasticsearch Install Elasticsearch 7.17.10"
214 | echo_content yellow " kibana Install Kibana 7.17.10"
215 | echo_content yellow " minio Install Minio"
216 | echo_content yellow " nacos Install Nacos v2.1.2"
217 | echo_content yellow " ssr Install ShadowsocksR"
218 | echo_content yellow " nexus3 Install Nexus3"
219 | echo_content yellow " gitlab Install GitLab"
220 | echo_content yellow " skywalking-oap Install SkyWalking OAP"
221 | echo_content yellow " skywalking-ui Install SkyWalking UI"
222 | echo_content yellow " rustdesk-server Install RustDesk Server"
223 | echo_content yellow " help Show this help message"
224 | echo_content yellow "If no option is provided, the interactive menu will be displayed."
225 | }
226 |
227 | # Main menu for interactive use
228 | show_menu() {
229 | clear
230 | echo_content red "=============================================================="
231 | echo_content skyBlue "Docker Services Installation Script v${SCRIPT_VERSION}"
232 | echo_content skyBlue "Supported OS: CentOS 8+/Ubuntu 20+/Debian 11+"
233 | echo_content skyBlue "Author: jonssonyan "
234 | echo_content skyBlue "Github: https://github.com/jonssonyan/install-script"
235 | echo_content red "=============================================================="
236 | echo_content yellow "1. Install Docker Engine"
237 | echo_content yellow "2. Install Docker Buildx"
238 | echo_content yellow "3. Uninstall Docker"
239 | echo_content green "=============================================================="
240 | echo_content yellow "4. Install MySQL 5.7.38"
241 | echo_content yellow "5. Install PostgreSQL 13"
242 | echo_content yellow "6. Install Redis 6.2.13"
243 | echo_content yellow "7. Install Elasticsearch 7.17.10"
244 | echo_content yellow "8. Install Kibana 7.17.10"
245 | echo_content yellow "9. Install Minio"
246 | echo_content yellow "10. Install Nacos v2.1.2"
247 | echo_content yellow "11. Install ShadowsocksR"
248 | echo_content yellow "12. Install Nexus3"
249 | echo_content yellow "13. Install GitLab"
250 | echo_content yellow "14. Install SkyWalking OAP"
251 | echo_content yellow "15. Install SkyWalking UI"
252 | echo_content yellow "16. Install RustDesk Server"
253 | echo_content red "=============================================================="
254 | echo_content yellow "0. Exit"
255 | echo_content red "=============================================================="
256 | }
257 |
258 | # Process CLI arguments
259 | process_args() {
260 | case "$1" in
261 | docker)
262 | prepare_environment
263 | install_docker_service "Docker Engine" "install.sh" "false"
264 | ;;
265 | buildx)
266 | install_docker_service "Docker Buildx" "buildx.sh" "true"
267 | ;;
268 | uninstall)
269 | install_docker_service "Docker" "uninstall.sh" "true"
270 | ;;
271 | mysql)
272 | install_docker_service "MySQL" "mysql.sh" "true"
273 | ;;
274 | postgresql)
275 | install_docker_service "PostgreSQL" "postgresql.sh" "true"
276 | ;;
277 | redis)
278 | install_docker_service "Redis" "redis.sh" "true"
279 | ;;
280 | elasticsearch)
281 | install_docker_service "Elasticsearch" "es.sh" "true"
282 | ;;
283 | kibana)
284 | install_docker_service "Kibana" "kibana.sh" "true"
285 | ;;
286 | minio)
287 | install_docker_service "Minio" "minio.sh" "true"
288 | ;;
289 | nacos)
290 | install_docker_service "Nacos" "nacos.sh" "true"
291 | ;;
292 | ssr)
293 | install_docker_service "ShadowsocksR" "ssr.sh" "true"
294 | ;;
295 | nexus3)
296 | install_docker_service "Nexus3" "nexus3.sh" "true"
297 | ;;
298 | gitlab)
299 | install_docker_service "GitLab" "gitlab.sh" "true"
300 | ;;
301 | skywalking-oap)
302 | install_docker_service "SkyWalking OAP" "skywalking-oap.sh" "true"
303 | ;;
304 | skywalking-ui)
305 | install_docker_service "SkyWalking UI" "skywalking-ui.sh" "true"
306 | ;;
307 | rustdesk-server)
308 | install_docker_service "RustDesk Server" "rustdesk-server.sh" "true"
309 | ;;
310 | help | --help | -h)
311 | show_help
312 | ;;
313 | *)
314 | return 1
315 | ;;
316 | esac
317 | return 0
318 | }
319 |
320 | # Main execution function
321 | main() {
322 | cd "$HOME" || exit 1
323 |
324 | # Initialize variables
325 | init_var
326 |
327 | # Create necessary directories
328 | create_dirs
329 |
330 | # Check system compatibility
331 | check_system
332 |
333 | # Install basic dependencies
334 | install_dependencies
335 |
336 | # Prepare environment
337 | prepare_environment
338 |
339 | # Process command line arguments if provided
340 | if [[ $# -gt 0 ]]; then
341 | if process_args "$@"; then
342 | exit 0
343 | fi
344 | fi
345 |
346 | # Interactive menu
347 | while true; do
348 | show_menu
349 | read -r -p "Please choose an option: " input_option
350 | case ${input_option} in
351 | 1)
352 | install_docker_service "Docker Engine" "install.sh" "false"
353 | echo_content yellow "Press Enter to continue..."
354 | read -r
355 | ;;
356 | 2)
357 | install_docker_service "Docker Buildx" "buildx.sh" "true"
358 | echo_content yellow "Press Enter to continue..."
359 | read -r
360 | ;;
361 | 3)
362 | install_docker_service "Docker" "uninstall.sh"
363 | echo_content yellow "Press Enter to continue..."
364 | read -r
365 | ;;
366 | 4)
367 | install_docker_service "MySQL" "mysql.sh" "true"
368 | echo_content yellow "Press Enter to continue..."
369 | read -r
370 | ;;
371 | 5)
372 | install_docker_service "PostgreSQL" "postgresql.sh" "true"
373 | echo_content yellow "Press Enter to continue..."
374 | read -r
375 | ;;
376 | 6)
377 | install_docker_service "Redis" "redis.sh" "true"
378 | echo_content yellow "Press Enter to continue..."
379 | read -r
380 | ;;
381 | 7)
382 | install_docker_service "Elasticsearch" "es.sh" "true"
383 | echo_content yellow "Press Enter to continue..."
384 | read -r
385 | ;;
386 | 8)
387 | install_docker_service "Kibana" "kibana.sh" "true"
388 | echo_content yellow "Press Enter to continue..."
389 | read -r
390 | ;;
391 | 9)
392 | install_docker_service "Minio" "minio.sh" "true"
393 | echo_content yellow "Press Enter to continue..."
394 | read -r
395 | ;;
396 | 10)
397 | install_docker_service "Nacos" "nacos.sh" "true"
398 | echo_content yellow "Press Enter to continue..."
399 | read -r
400 | ;;
401 | 11)
402 | install_docker_service "ShadowsocksR" "ssr.sh" "true"
403 | echo_content yellow "Press Enter to continue..."
404 | read -r
405 | ;;
406 | 12)
407 | install_docker_service "Nexus3" "nexus3.sh" "true"
408 | echo_content yellow "Press Enter to continue..."
409 | read -r
410 | ;;
411 | 13)
412 | install_docker_service "GitLab" "gitlab.sh" "true"
413 | echo_content yellow "Press Enter to continue..."
414 | read -r
415 | ;;
416 | 14)
417 | install_docker_service "SkyWalking OAP" "skywalking-oap.sh" "true"
418 | echo_content yellow "Press Enter to continue..."
419 | read -r
420 | ;;
421 | 15)
422 | install_docker_service "SkyWalking UI" "skywalking-ui.sh" "true"
423 | echo_content yellow "Press Enter to continue..."
424 | read -r
425 | ;;
426 | 16)
427 | install_docker_service "RustDesk Server" "rustdesk-server.sh" "true"
428 | echo_content yellow "Press Enter to continue..."
429 | read -r
430 | ;;
431 | 0)
432 | echo_content green "Exiting..."
433 | exit 0
434 | ;;
435 | *)
436 | echo_content red "Invalid option. Please try again."
437 | sleep 2
438 | ;;
439 | esac
440 | done
441 | }
442 |
443 | # Execute main function with all arguments
444 | main "$@"
445 |
--------------------------------------------------------------------------------
/k8s-install.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | # Kubernetes Installation Script
3 | # Author: jonssonyan
4 | # Github: https://github.com/jonssonyan/install-script
5 |
6 | set -e # Exit immediately if a command exits with a non-zero status
7 |
8 | # Initialize variables
9 | init_var() {
10 | ECHO_TYPE="echo -e"
11 | SCRIPT_VERSION="1.1.0"
12 |
13 | # System variables
14 | package_manager=""
15 | release=""
16 | version=""
17 | arch=""
18 | can_access_internet=1 # Default to true, will be set to 0 if can't reach google
19 |
20 | # Host settings
21 | host_name="k8s-master"
22 | public_ip=""
23 |
24 | # K8s directories and files
25 | K8S_DATA="/k8sdata"
26 | K8S_LOG="${K8S_DATA}/log"
27 | K8S_NETWORK="${K8S_DATA}/network"
28 | k8s_lock_file="${K8S_DATA}/k8s.lock"
29 |
30 | # K8s configuration
31 | k8s_version="1.29"
32 | k8s_versions="1.24 1.25 1.26 1.27 1.28 1.29 1.30 1.31"
33 | is_master=1
34 | k8s_cri_sock="unix:///var/run/containerd/containerd.sock"
35 | network="flannel"
36 | network_file="${K8S_NETWORK}/kube-flannel.yml"
37 |
38 | # URLs and mirrors
39 | kube_flannel_url="https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml"
40 | calico_url="https://docs.projectcalico.org/manifests/calico.yaml"
41 | k8s_mirror="https://registry.cn-hangzhou.aliyuncs.com/google_containers"
42 | docker_mirror='"https://docker.m.daocloud.io"'
43 | }
44 |
45 | # Colorized output functions
46 | echo_content() {
47 | local color_code
48 | case $1 in
49 | "red") color_code="\033[31m" ;;
50 | "green") color_code="\033[32m" ;;
51 | "yellow") color_code="\033[33m" ;;
52 | "blue") color_code="\033[34m" ;;
53 | "purple") color_code="\033[35m" ;;
54 | "skyBlue") color_code="\033[36m" ;;
55 | "white") color_code="\033[37m" ;;
56 | *) color_code="\033[0m" ;;
57 | esac
58 | ${ECHO_TYPE} "${color_code}$2\033[0m"
59 | }
60 |
61 | # Create necessary directories
62 | create_dirs() {
63 | mkdir -p ${K8S_DATA} ${K8S_LOG} ${K8S_NETWORK}
64 | }
65 |
66 | # Check if can connect to a host
67 | can_connect() {
68 | ping -c2 -i0.3 -W1 "$1" &>/dev/null
69 | return $?
70 | }
71 |
72 | # Get configuration value from lock file
73 | get_config_val() {
74 | grep "^$1=" ${k8s_lock_file} | cut -d= -f2
75 | }
76 |
77 | # Check if service exists
78 | service_exists() {
79 | systemctl list-units --type=service --all | grep -Fq "$1.service"
80 | }
81 |
82 | # Check system compatibility and gather information
83 | check_system() {
84 | if [[ $(id -u) != "0" ]]; then
85 | echo_content red "You must be root to run this script"
86 | exit 1
87 | fi
88 |
89 | # Check internet connectivity
90 | if ! can_connect www.google.com; then
91 | can_access_internet=0
92 | echo_content yellow "Limited internet connectivity detected. Using Chinese mirrors."
93 | fi
94 |
95 | # Determine package manager
96 | if command -v yum &>/dev/null; then
97 | package_manager='yum'
98 | elif command -v dnf &>/dev/null; then
99 | package_manager='dnf'
100 | elif command -v apt-get &>/dev/null; then
101 | package_manager='apt-get'
102 | elif command -v apt &>/dev/null; then
103 | package_manager='apt'
104 | else
105 | echo_content red "Unsupported system. No compatible package manager found."
106 | exit 1
107 | fi
108 |
109 | # Determine OS distribution and version
110 | if [[ -n $(find /etc -name "redhat-release") ]] || grep /dev/null; then
113 | version=$(rpm -q --queryformat '%{VERSION}' centos-stream-release)
114 | elif rpm -q centos-release &>/dev/null; then
115 | version=$(rpm -q --queryformat '%{VERSION}' centos-release)
116 | fi
117 | elif grep >/etc/hosts
168 | hostnamectl set-hostname "$1"
169 | echo_content green "Hostname set to: $1"
170 | }
171 |
172 | # Install dependencies
173 | install_dependencies() {
174 | echo_content green "---> Installing dependencies"
175 |
176 | if [[ "${package_manager}" == 'apt-get' || "${package_manager}" == 'apt' ]]; then
177 | ${package_manager} update -y
178 | fi
179 |
180 | ${package_manager} install -y \
181 | curl \
182 | wget \
183 | systemd \
184 | lrzsz \
185 | bash-completion \
186 | gpg
187 |
188 | echo_content skyBlue "---> Dependencies installed"
189 | }
190 |
191 | # Prepare environment
192 | prepare_environment() {
193 | echo_content green "---> Preparing environment"
194 |
195 | # Sync time
196 | timedatectl set-timezone Asia/Shanghai && timedatectl set-local-rtc 0
197 | echo_content skyBlue "---> Timezone set to Asia/Shanghai"
198 |
199 | # Restart required services
200 | if service_exists "rsyslog"; then
201 | systemctl restart rsyslog
202 | fi
203 |
204 | case "${release}" in
205 | centos)
206 | if service_exists "crond"; then
207 | systemctl restart crond
208 | fi
209 | ;;
210 | debian | ubuntu)
211 | if service_exists "cron"; then
212 | systemctl restart cron
213 | fi
214 | ;;
215 | esac
216 |
217 | # Disable SELinux
218 | if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then
219 | setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
220 | echo_content skyBlue "---> SELinux disabled"
221 | fi
222 |
223 | # Disable swap
224 | swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
225 | echo_content skyBlue "---> Swap disabled"
226 |
227 | echo_content skyBlue "---> Environment preparation complete"
228 | }
229 |
230 | # Configure containerd
231 | configure_containerd() {
232 | echo_content green "---> Configuring containerd"
233 |
234 | mkdir -p /etc/containerd
235 | containerd config default >/etc/containerd/config.toml
236 |
237 | # Enable SystemdCgroup
238 | sed -i "s#SystemdCgroup = false#SystemdCgroup = true#g" /etc/containerd/config.toml
239 |
240 | # Configure mirrors if limited internet access
241 | if [[ ${can_access_internet} == 0 ]]; then
242 | k8s_mirror_escape=${k8s_mirror//\//\\\/}
243 | docker_mirror_escape=${docker_mirror//\//\\\/}
244 |
245 | # Replace registry.k8s.io with mirror
246 | sed -i "s#registry.k8s.io#${k8s_mirror_escape}#g" /etc/containerd/config.toml
247 |
248 | # Add Docker.io mirror
249 | sed -i "/\[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors\]/a\ [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"docker.io\"]" /etc/containerd/config.toml
250 | sed -i "/\[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"docker.io\"\]/a\ endpoint = [${docker_mirror_escape}]" /etc/containerd/config.toml
251 |
252 | # Add registry.k8s.io mirror
253 | sed -i "/endpoint = \[${docker_mirror_escape}]/a\ [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"registry.k8s.io\"]" /etc/containerd/config.toml
254 | sed -i "/\[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"registry.k8s.io\"\]/a\ endpoint = [\"${k8s_mirror_escape}\"]" /etc/containerd/config.toml
255 |
256 | # Add k8s.gcr.io mirror
257 | sed -i "/endpoint = \[\"${k8s_mirror_escape}\"]/a\ [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"k8s.gcr.io\"]" /etc/containerd/config.toml
258 | sed -i "/\[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"k8s.gcr.io\"\]/a\ endpoint = [\"${k8s_mirror_escape}\"]" /etc/containerd/config.toml
259 | fi
260 |
261 | systemctl daemon-reload
262 | echo_content skyBlue "---> containerd configured"
263 | }
264 |
265 | # Install containerd
266 | install_containerd() {
267 | if command -v containerd &>/dev/null; then
268 | echo_content skyBlue "---> containerd is already installed"
269 | return
270 | fi
271 |
272 | echo_content green "---> Installing containerd"
273 |
274 | if [[ "${release}" == "centos" ]]; then
275 | if [[ "${package_manager}" == "dnf" ]]; then
276 | ${package_manager} install -y dnf-plugins-core
277 | else
278 | ${package_manager} install -y yum-utils
279 | fi
280 | if [[ ${can_access_internet} == 0 ]]; then
281 | ${package_manager} config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
282 | else
283 | ${package_manager} config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
284 | fi
285 | ${package_manager} makecache || ${package_manager} makecache fast
286 | elif [[ "${release}" == "debian" || "${release}" == "ubuntu" ]]; then
287 | ${package_manager} update -y
288 | ${package_manager} install -y \
289 | ca-certificates \
290 | curl \
291 | gnupg \
292 | lsb-release
293 |
294 | sudo install -m 0755 -d /etc/apt/keyrings
295 | if [[ ${can_access_internet} == 0 ]]; then
296 | sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/${release}/gpg -o /etc/apt/keyrings/docker.asc
297 | sudo chmod a+r /etc/apt/keyrings/docker.asc
298 | echo \
299 | "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/${release} \
300 | $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" |
301 | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
302 | else
303 | sudo curl -fsSL https://download.docker.com/linux/${release}/gpg -o /etc/apt/keyrings/docker.asc
304 | sudo chmod a+r /etc/apt/keyrings/docker.asc
305 | echo \
306 | "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/${release} \
307 | $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" |
308 | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
309 | fi
310 | ${package_manager} update -y
311 | fi
312 |
313 | ${package_manager} install -y containerd.io
314 |
315 | configure_containerd
316 |
317 | systemctl enable containerd && systemctl restart containerd
318 |
319 | if command -v containerd &>/dev/null; then
320 | echo_content skyBlue "---> containerd installation complete"
321 | else
322 | echo_content red "---> containerd installation failed"
323 | exit 1
324 | fi
325 | }
326 |
327 | # Install Kubernetes runtime
328 | install_runtime() {
329 | echo_content green "---> Installing container runtime"
330 |
331 | # Setup kernel modules for networking
332 | cat >/etc/modules-load.d/k8s.conf </etc/sysctl.d/k8s.conf <>${k8s_lock_file}
352 |
353 | echo_content skyBlue "---> Container runtime installation complete"
354 | }
355 |
356 | # Setup Kubernetes bash completion
357 | setup_bash_completion() {
358 | echo_content green "---> Setting up bash completion for Kubernetes tools"
359 |
360 | if ! grep -q bash_completion "$HOME/.bashrc"; then
361 | echo "source /usr/share/bash-completion/bash_completion" >>"$HOME/.bashrc"
362 | fi
363 |
364 | if command -v kubectl &>/dev/null && ! grep -q kubectl "$HOME/.bashrc"; then
365 | echo "source <(kubectl completion bash)" >>"$HOME/.bashrc"
366 | fi
367 |
368 | if command -v kubeadm &>/dev/null && ! grep -q kubeadm "$HOME/.bashrc"; then
369 | echo "source <(kubeadm completion bash)" >>"$HOME/.bashrc"
370 | fi
371 |
372 | if command -v crictl &>/dev/null && ! grep -q crictl "$HOME/.bashrc"; then
373 | echo "source <(crictl completion bash)" >>"$HOME/.bashrc"
374 | fi
375 |
376 | source "$HOME/.bashrc"
377 | echo_content skyBlue "---> Bash completion setup complete"
378 | }
379 |
380 | # Install Kubernetes network plugin
381 | install_network_plugin() {
382 | if ! systemctl is-active kubelet >/dev/null 2>&1; then
383 | echo_content yellow "---> Kubelet not running, skipping network plugin installation"
384 | return
385 | fi
386 |
387 | if kubectl get pods -n kube-system 2>/dev/null | grep -E 'calico|flannel' >/dev/null; then
388 | echo_content skyBlue "---> Network plugin already installed"
389 | return
390 | fi
391 |
392 | echo_content green "---> Installing network plugin: ${network}"
393 |
394 | if [[ ${network} == "flannel" ]]; then
395 | wget --no-check-certificate -O "${network_file}" ${kube_flannel_url} || {
396 | echo_content red "---> Failed to download flannel manifest"
397 | exit 1
398 | }
399 |
400 | kubectl create -f "${network_file}" || {
401 | echo_content red "---> Failed to apply flannel manifest"
402 | exit 1
403 | }
404 | elif [[ ${network} == "calico" ]]; then
405 | wget --no-check-certificate -O "${K8S_NETWORK}/calico.yaml" ${calico_url} || {
406 | echo_content red "---> Failed to download calico manifest"
407 | exit 1
408 | }
409 |
410 | kubectl create -f "${K8S_NETWORK}/calico.yaml" || {
411 | echo_content red "---> Failed to apply calico manifest"
412 | exit 1
413 | }
414 | fi
415 |
416 | echo_content skyBlue "---> Network plugin installation complete"
417 | }
418 |
419 | # Set up Kubernetes components
420 | setup_kubernetes() {
421 | echo_content green "---> Setting up Kubernetes components"
422 |
423 | # Configure kubelet to use systemd cgroup driver
424 | for file in /etc/default/kubelet /etc/sysconfig/kubelet; do
425 | if [[ -f "$file" ]]; then
426 | if ! grep -q "KUBELET_EXTRA_ARGS" "$file"; then
427 | echo 'KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"' >>"$file"
428 | fi
429 | break
430 | fi
431 | done
432 |
433 | # Configure crictl
434 | if command -v crictl &>/dev/null; then
435 | crictl config --set runtime-endpoint=${k8s_cri_sock}
436 | crictl config --set image-endpoint=${k8s_cri_sock}
437 | fi
438 |
439 | # Setup bash completion
440 | setup_bash_completion
441 |
442 | echo_content skyBlue "---> Kubernetes components setup complete"
443 | }
444 |
445 | # Setup Kubernetes repository
446 | setup_kubernetes_repo() {
447 | echo_content green "---> Setting up Kubernetes repository for version ${k8s_version}"
448 |
449 | if [[ "${release}" == "centos" ]]; then
450 | if [[ ${can_access_internet} == 0 ]]; then
451 | cat < Kubernetes repository setup complete"
490 | }
491 |
492 | # Install Kubernetes
493 | install_kubernetes() {
494 | if command -v kubeadm &>/dev/null; then
495 | echo_content skyBlue "---> Kubernetes is already installed"
496 | return
497 | fi
498 |
499 | echo_content green "---> Installing Kubernetes ${k8s_version}"
500 |
501 | # Get node type
502 | echo_content yellow "Please select node type:"
503 | echo_content yellow "1) Master node (control plane)"
504 | echo_content yellow "2) Worker node"
505 | read -r -p "Your choice (default: 1): " node_type_choice
506 |
507 | case ${node_type_choice} in
508 | 2)
509 | is_master=0
510 | ;;
511 | *)
512 | is_master=1
513 | ;;
514 | esac
515 |
516 | echo "is_master=${is_master}" >>${k8s_lock_file}
517 |
518 | # Check CPU cores for master node
519 | if [[ ${is_master} == 1 && $(grep -c "processor" /proc/cpuinfo) -lt 2 ]]; then
520 | echo_content red "Error: Master node requires at least 2 CPU cores"
521 | exit 1
522 | fi
523 |
524 | # Get public IP
525 | echo_content yellow "Please enter this node's public IP address (required):"
526 | read -r -p "> " public_ip
527 |
528 | if [[ -z "${public_ip}" ]]; then
529 | echo_content red "Error: Public IP cannot be empty"
530 | exit 1
531 | fi
532 |
533 | echo "public_ip=${public_ip}" >>${k8s_lock_file}
534 |
535 | # Get hostname
536 | echo_content yellow "Please enter hostname for this node (default: k8s-master):"
537 | read -r -p "> " host_name
538 |
539 | [[ -z "${host_name}" ]] && host_name="k8s-master"
540 | set_hostname ${host_name}
541 |
542 | # Get Kubernetes version
543 | echo_content yellow "Please select Kubernetes version:"
544 | echo_content yellow "Available versions: ${k8s_versions}"
545 | read -r -p "Enter version (default: ${k8s_version}): " selected_version
546 |
547 | [[ -z "${selected_version}" ]] && selected_version="${k8s_version}"
548 |
549 | if ! echo "${k8s_versions}" | grep -w -q "${selected_version}"; then
550 | echo_content red "Error: Version ${selected_version} is not supported"
551 | exit 1
552 | fi
553 |
554 | k8s_version="${selected_version}"
555 | echo "k8s_version=${k8s_version}" >>${k8s_lock_file}
556 |
557 | # Install container runtime
558 | install_runtime
559 |
560 | # Setup Kubernetes repositories
561 | setup_kubernetes_repo
562 |
563 | # Install Kubernetes components
564 | echo_content green "---> Installing Kubernetes components for version ${k8s_version}"
565 |
566 | if [[ -z "${k8s_version}" ]]; then
567 | ${package_manager} install -y kubelet kubeadm kubectl
568 | else
569 | if [[ ${package_manager} == "yum" || ${package_manager} == "dnf" ]]; then
570 | ${package_manager} install -y kubelet-"${k8s_version}" kubeadm-"${k8s_version}" kubectl-"${k8s_version}"
571 | elif [[ ${package_manager} == "apt" || ${package_manager} == "apt-get" ]]; then
572 | kubelet_version=$(apt-cache madison kubelet | grep ${k8s_version} | head -n1 | awk '{print $3}')
573 | kubeadm_version=$(apt-cache madison kubeadm | grep ${k8s_version} | head -n1 | awk '{print $3}')
574 | kubectl_version=$(apt-cache madison kubectl | grep ${k8s_version} | head -n1 | awk '{print $3}')
575 | ${package_manager} install -y kubelet="${kubelet_version}" kubeadm="${kubeadm_version}" kubectl="${kubectl_version}"
576 | fi
577 | fi
578 |
579 | # Setup Kubernetes components
580 | setup_kubernetes
581 |
582 | # Enable and start kubelet
583 | systemctl enable --now kubelet
584 |
585 | if command -v kubeadm &>/dev/null; then
586 | echo_content skyBlue "---> Kubernetes installation complete"
587 | else
588 | echo_content red "---> Kubernetes installation failed"
589 | exit 1
590 | fi
591 | }
592 |
593 | # Initialize Kubernetes master node
594 | initialize_kubernetes_master() {
595 | if ! command -v kubeadm &>/dev/null; then
596 | echo_content red "---> Kubernetes is not installed. Please install Kubernetes first."
597 | return
598 | fi
599 |
600 | # Load configuration from lock file
601 | is_master=$(get_config_val is_master)
602 | public_ip=$(get_config_val public_ip)
603 | k8s_version=$(get_config_val k8s_version)
604 | k8s_cri_sock=$(get_config_val k8s_cri_sock)
605 |
606 | if [[ "${is_master}" != "1" ]]; then
607 | echo_content yellow "---> This is configured as a worker node."
608 | echo_content yellow "---> Please run 'kubeadm join' command provided by your master node."
609 | echo_content yellow "---> If you forgot the command, run this on the master node:"
610 | echo_content green " kubeadm token create --print-join-command"
611 | return
612 | fi
613 |
614 | echo_content green "---> Initializing Kubernetes master node"
615 |
616 | # Get exact Kubernetes version
617 | k8s_version_mini=$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable-"${k8s_version}".txt) || {
618 | echo_content yellow "---> Could not determine exact Kubernetes version, using specified version"
619 | k8s_version_mini="v${k8s_version}.0"
620 | }
621 |
622 | # Initialize Kubernetes master
623 | local init_log="${K8S_LOG}/kubeadm-init-$(date +%Y%m%d-%H%M%S).log"
624 |
625 | echo_content green "---> Running kubeadm init with version ${k8s_version_mini}"
626 |
627 | if [[ ${can_access_internet} == 0 ]]; then
628 | kubeadm init \
629 | --apiserver-advertise-address="${public_ip}" \
630 | --image-repository="${k8s_mirror}" \
631 | --kubernetes-version="${k8s_version_mini}" \
632 | --service-cidr=10.96.0.0/12 \
633 | --pod-network-cidr=10.244.0.0/16 \
634 | --cri-socket="${k8s_cri_sock}" | tee "${init_log}"
635 | else
636 | kubeadm init \
637 | --apiserver-advertise-address="${public_ip}" \
638 | --kubernetes-version="${k8s_version_mini}" \
639 | --service-cidr=10.96.0.0/12 \
640 | --pod-network-cidr=10.244.0.0/16 \
641 | --cri-socket="${k8s_cri_sock}" | tee "${init_log}"
642 | fi
643 |
644 | if [[ ${PIPESTATUS[0]} -eq 0 ]]; then
645 | # Set up kubeconfig
646 | mkdir -p "$HOME"/.kube
647 | cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config
648 | chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config
649 |
650 | echo_content skyBlue "---> Kubernetes master node initialization complete"
651 |
652 | # Extract join command for future use
653 | local join_command=$(grep -A 1 "kubeadm join" "${init_log}" | tr -d '\\\n' | sed 's/^[ \t]*//')
654 | echo "${join_command}" >"${K8S_DATA}/join-command.txt"
655 | echo_content green "---> Worker join command saved to ${K8S_DATA}/join-command.txt"
656 |
657 | # Install network plugin
658 | install_network_plugin
659 |
660 | # Print cluster status
661 | echo_content green "---> Kubernetes cluster status:"
662 | kubectl get nodes
663 | else
664 | echo_content red "---> Kubernetes master node initialization failed"
665 | echo_content yellow "---> Check logs in ${init_log}"
666 | exit 1
667 | fi
668 | }
669 |
670 | # Reset Kubernetes
671 | reset_kubernetes() {
672 | if ! command -v kubeadm &>/dev/null; then
673 | echo_content yellow "---> Kubernetes is not installed, nothing to reset"
674 | return
675 | fi
676 |
677 | echo_content green "---> Resetting Kubernetes cluster"
678 |
679 | echo_content yellow "WARNING: This will remove all Kubernetes configurations and data!"
680 | read -r -p "Are you sure you want to continue? (y/N): " confirm_reset
681 |
682 | if [[ ! ${confirm_reset} =~ ^[Yy]$ ]]; then
683 | echo_content yellow "---> Reset cancelled"
684 | return
685 | fi
686 |
687 | # Reset Kubernetes
688 | kubeadm reset -f
689 |
690 | # Clean up directories
691 | rm -rf /etc/cni /etc/kubernetes /var/lib/dockershim /var/lib/etcd /var/lib/kubelet /var/run/kubernetes "$HOME"/.kube
692 |
693 | # Reset iptables
694 | iptables -F && iptables -X
695 | iptables -t nat -F && iptables -t nat -X
696 | iptables -t raw -F && iptables -t raw -X
697 | iptables -t mangle -F && iptables -t mangle -X
698 |
699 | # Reload systemd
700 | systemctl daemon-reload
701 |
702 | # Restart container runtime
703 | if command -v docker &>/dev/null; then
704 | systemctl restart docker
705 | elif command -v containerd &>/dev/null; then
706 | systemctl restart containerd
707 | fi
708 |
709 | # Apply sysctl settings
710 | sysctl --system
711 |
712 | # Remove lock file
713 | rm -f ${k8s_lock_file}
714 |
715 | echo_content skyBlue "---> Kubernetes reset complete"
716 | }
717 |
718 | # Display cluster information
719 | show_cluster_info() {
720 | if ! command -v kubectl &>/dev/null; then
721 | echo_content yellow "---> Kubernetes is not installed"
722 | return
723 | fi
724 |
725 | if ! kubectl cluster-info &>/dev/null; then
726 | echo_content yellow "---> Kubernetes cluster is not running or kubeconfig is not configured"
727 | return
728 | fi
729 |
730 | echo_content green "---> Cluster Information"
731 | echo "----------------------------------------"
732 | kubectl cluster-info
733 | echo "----------------------------------------"
734 | echo_content green "---> Node Status"
735 | echo "----------------------------------------"
736 | kubectl get nodes -o wide
737 | echo "----------------------------------------"
738 | echo_content green "---> Pod Status"
739 | echo "----------------------------------------"
740 | kubectl get pods --all-namespaces
741 | echo "----------------------------------------"
742 | }
743 |
744 | # Display installation help
745 | show_help() {
746 | echo_content green "Kubernetes Installation Script v${SCRIPT_VERSION}"
747 | echo_content green "Usage: $0 [option]"
748 | echo_content green "Options:"
749 | echo_content yellow " install Install Kubernetes"
750 | echo_content yellow " init Initialize Kubernetes master node"
751 | echo_content yellow " reset Reset Kubernetes cluster"
752 | echo_content yellow " info Show cluster information"
753 | echo_content yellow " help Show this help message"
754 | echo_content yellow "If no option is provided, the interactive menu will be displayed."
755 | }
756 |
757 | # Main menu for interactive use
758 | show_menu() {
759 | clear
760 | echo_content red "=============================================================="
761 | echo_content skyBlue "Kubernetes Installation Script v${SCRIPT_VERSION}"
762 | echo_content skyBlue "Supported OS: CentOS 8+/Ubuntu 20+/Debian 11+"
763 | echo_content skyBlue "Author: Original by jonssonyan, optimized version"
764 | echo_content skyBlue "Github: https://github.com/jonssonyan/install-script"
765 | echo_content red "=============================================================="
766 | echo_content yellow "1. Install Kubernetes"
767 | echo_content yellow "2. Initialize Kubernetes Master Node"
768 | echo_content yellow "3. Show Cluster Information"
769 | echo_content red "=============================================================="
770 | echo_content yellow "4. Reset Kubernetes"
771 | echo_content red "=============================================================="
772 | echo_content yellow "0. Exit"
773 | echo_content red "=============================================================="
774 | }
775 |
776 | # Check if lock file exists and load configuration
777 | check_lock_file() {
778 | if [[ -f "${k8s_lock_file}" ]]; then
779 | echo_content skyBlue "---> Loading configuration from ${k8s_lock_file}"
780 |
781 | is_master=$(get_config_val is_master)
782 | public_ip=$(get_config_val public_ip)
783 | k8s_version=$(get_config_val k8s_version)
784 | k8s_cri_sock=$(get_config_val k8s_cri_sock)
785 |
786 | echo_content skyBlue "---> Configuration loaded"
787 | else
788 | echo_content yellow "---> No configuration found. This appears to be a new installation."
789 | fi
790 | }
791 |
792 | # Process CLI arguments
793 | process_args() {
794 | case "$1" in
795 | install)
796 | prepare_environment
797 | install_kubernetes
798 | ;;
799 | init)
800 | initialize_kubernetes_master
801 | ;;
802 | reset)
803 | reset_kubernetes
804 | ;;
805 | info)
806 | show_cluster_info
807 | ;;
808 | help | --help | -h)
809 | show_help
810 | ;;
811 | *)
812 | return 1
813 | ;;
814 | esac
815 | return 0
816 | }
817 |
818 | # Main execution function
819 | main() {
820 | cd "$HOME" || exit 1
821 |
822 | # Initialize variables
823 | init_var
824 |
825 | # Create necessary directories
826 | create_dirs
827 |
828 | # Check system compatibility
829 | check_system
830 |
831 | # Install basic dependencies
832 | install_dependencies
833 |
834 | # Check for existing configuration
835 | check_lock_file
836 |
837 | # Process command line arguments if provided
838 | if [[ $# -gt 0 ]]; then
839 | if process_args "$@"; then
840 | exit 0
841 | fi
842 | fi
843 |
844 | # Interactive menu
845 | while true; do
846 | show_menu
847 | read -r -p "Please choose an option: " input_option
848 | case ${input_option} in
849 | 1)
850 | prepare_environment
851 | install_kubernetes
852 | echo_content yellow "Press Enter to continue..."
853 | read -r
854 | ;;
855 | 2)
856 | initialize_kubernetes_master
857 | echo_content yellow "Press Enter to continue..."
858 | read -r
859 | ;;
860 | 3)
861 | show_cluster_info
862 | echo_content yellow "Press Enter to continue..."
863 | read -r
864 | ;;
865 | 4)
866 | reset_kubernetes
867 | echo_content yellow "Press Enter to continue..."
868 | read -r
869 | ;;
870 | 0)
871 | echo_content green "Exiting..."
872 | exit 0
873 | ;;
874 | *)
875 | echo_content red "Invalid option. Please try again."
876 | sleep 2
877 | ;;
878 | esac
879 | done
880 | }
881 |
882 | # Execute main function with all arguments
883 | main "$@"
884 |
--------------------------------------------------------------------------------