Init
This commit is contained in:
160
.gitignore
vendored
Normal file
160
.gitignore
vendored
Normal file
@@ -0,0 +1,160 @@
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
.pybuilder/
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
# For a library or package, you might want to ignore these files since the code is
|
||||
# intended to run in multiple environments; otherwise, check them in:
|
||||
# .python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# poetry
|
||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||
#poetry.lock
|
||||
|
||||
# pdm
|
||||
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||
#pdm.lock
|
||||
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||
# in version control.
|
||||
# https://pdm.fming.dev/#use-with-ide
|
||||
.pdm.toml
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# PyCharm
|
||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
#.idea/
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 ghuang.top
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
111
README.md
Normal file
111
README.md
Normal file
@@ -0,0 +1,111 @@
|
||||
# vps
|
||||
vps脚本
|
||||
|
||||
## 初始化脚本 (init)
|
||||
|
||||
- 00-disable-password
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/00-disable-password.sh && chmod +x 00-disable-password.sh && ./00-disable-password.sh
|
||||
```
|
||||
|
||||
- 01-sysUpdate
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/01-sysUpdate.sh && chmod +x 01-sysUpdate.sh && ./01-sysUpdate.sh
|
||||
```
|
||||
|
||||
- 02-sysCleanup
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/02-sysCleanup.sh && chmod +x 02-sysCleanup.sh && ./02-sysCleanup.sh
|
||||
```
|
||||
|
||||
- 03-docker
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/03-docker.sh && chmod +x 03-docker.sh && ./03-docker.sh
|
||||
```
|
||||
|
||||
- ddns-go
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/ddns-go.sh && chmod +x ddns-go.sh && ./ddns-go.sh
|
||||
```
|
||||
|
||||
- vps_init
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/vps_init.sh && chmod +x vps_init.sh && ./vps_init.sh
|
||||
```
|
||||
|
||||
- xray-manager
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/xray-manager.sh && chmod +x xray-manager.sh && ./xray-manager.sh
|
||||
```
|
||||
|
||||
## 安装脚本 (install)
|
||||
|
||||
- 01-Nginx
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/01-Nginx.sh && chmod +x 01-Nginx.sh && ./01-Nginx.sh
|
||||
```
|
||||
|
||||
- 02-NginxProxy
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/02-NginxProxy.sh && chmod +x 02-NginxProxy.sh && ./02-NginxProxy.sh
|
||||
```
|
||||
|
||||
- 03-X-UI
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/03-X-UI.sh && chmod +x 03-X-UI.sh && ./03-X-UI.sh
|
||||
```
|
||||
|
||||
- 04-FRP
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/04-FRP.sh && chmod +x 04-FRP.sh && ./04-FRP.sh
|
||||
```
|
||||
|
||||
- 05-ZeroTier
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/05-ZeroTier.sh && chmod +x 05-ZeroTier.sh && ./05-ZeroTier.sh
|
||||
```
|
||||
|
||||
- 06-Rustdesk
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/06-Rustdesk.sh && chmod +x 06-Rustdesk.sh && ./06-Rustdesk.sh
|
||||
```
|
||||
|
||||
- 07-Alist
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/07-Alist.sh && chmod +x 07-Alist.sh && ./07-Alist.sh
|
||||
```
|
||||
|
||||
- 08-Duplicati
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/08-Duplicati.sh && chmod +x 08-Duplicati.sh && ./08-Duplicati.sh
|
||||
```
|
||||
|
||||
- 09-Syncthing
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/09-Syncthing.sh && chmod +x 09-Syncthing.sh && ./09-Syncthing.sh
|
||||
```
|
||||
|
||||
- 10-Vaultwarden
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/10-Vaultwarden.sh && chmod +x 10-Vaultwarden.sh && ./10-Vaultwarden.sh
|
||||
```
|
||||
|
||||
- 11-EasyImage
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/11-EasyImage.sh && chmod +x 11-EasyImage.sh && ./11-EasyImage.sh
|
||||
```
|
||||
|
||||
- 12-Wordpress
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/12-Wordpress.sh && chmod +x 12-Wordpress.sh && ./12-Wordpress.sh
|
||||
```
|
||||
|
||||
- 13-Nextcloud
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/13-Nextcloud.sh && chmod +x 13-Nextcloud.sh && ./13-Nextcloud.sh
|
||||
```
|
||||
|
||||
- 14-Joplin
|
||||
```sh
|
||||
curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/14-Joplin.sh && chmod +x 14-Joplin.sh && ./14-Joplin.sh
|
||||
```
|
||||
44
init/00-disable-password.sh
Normal file
44
init/00-disable-password.sh
Normal file
@@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 00-disable-password.sh && ./00-disable-password.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/00-disable-password.sh && chmod +x 00-disable-password.sh && ./00-disable-password.sh
|
||||
|
||||
|
||||
# 用户设置
|
||||
new_ssh_port="4399" # 根据需求修改端口
|
||||
|
||||
echo "1、关闭 SSH 密码登录并启用密钥认证"
|
||||
disablePasswordLogin() {
|
||||
# 备份 SSH 配置文件
|
||||
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
|
||||
|
||||
# 修改 SSH 配置文件
|
||||
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin prohibit-password/g' /etc/ssh/sshd_config
|
||||
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/g' /etc/ssh/sshd_config
|
||||
|
||||
# 确保 PubkeyAuthentication 开启
|
||||
sed -i 's/^#\?PubkeyAuthentication.*/PubkeyAuthentication yes/g' /etc/ssh/sshd_config
|
||||
|
||||
# 修改端口
|
||||
sed -i 's/^#\?Port [0-9]\+/Port '$new_ssh_port'/g' /etc/ssh/sshd_config
|
||||
|
||||
# 重启 SSH 服务
|
||||
service sshd restart
|
||||
}
|
||||
disablePasswordLogin
|
||||
|
||||
echo "2、开启防火墙并允许新的 SSH 端口"
|
||||
openUfwPort() {
|
||||
echo "开启防火墙并允许新的SSH端口: $new_ssh_port"
|
||||
apt update -y && apt install -y ufw
|
||||
ufw --force enable
|
||||
ufw allow $new_ssh_port
|
||||
ufw status
|
||||
}
|
||||
openUfwPort
|
||||
|
||||
echo "------------------------"
|
||||
echo "修改后的信息:"
|
||||
echo "端口: $new_ssh_port"
|
||||
echo "SSH 密码登录: 已关闭"
|
||||
echo "请确保您的公钥已正确上传到服务器的 ~/.ssh/authorized_keys 文件中。"
|
||||
echo "------------------------"
|
||||
15
init/01-sysUpdate.sh
Normal file
15
init/01-sysUpdate.sh
Normal file
@@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 01-sysUpdate.sh && ./01-sysUpdate.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/01-sysUpdate.sh && chmod +x 01-sysUpdate.sh && ./01-sysUpdate.sh
|
||||
|
||||
echo "系统更新"
|
||||
|
||||
if [ -f "/etc/debian_version" ]; then
|
||||
apt update -y && DEBIAN_FRONTEND=noninteractive apt full-upgrade -y
|
||||
fi
|
||||
|
||||
# 1、VPS Initialization
|
||||
apt update -y && apt upgrade -y # 更新一下包
|
||||
apt install -y wget curl sudo vim git ufw # Debian系统比较干净,安装常用的软件
|
||||
sudo usermod -aG sudo root
|
||||
|
||||
14
init/02-sysCleanup.sh
Normal file
14
init/02-sysCleanup.sh
Normal file
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 02-sysCleanup.sh && ./02-sysCleanup.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/02-sysCleanup.sh && chmod +x 02-sysCleanup.sh && ./02-sysCleanup.sh
|
||||
|
||||
echo "系统清理"
|
||||
|
||||
apt autoremove --purge -y
|
||||
apt clean -y
|
||||
apt autoclean -y
|
||||
apt remove --purge $(dpkg -l | awk '/^rc/ {print $2}') -y
|
||||
journalctl --rotate
|
||||
journalctl --vacuum-time=1s
|
||||
journalctl --vacuum-size=50M
|
||||
apt remove --purge $(dpkg -l | awk '/^ii linux-(image|headers)-[^ ]+/{print $2}' | grep -v $(uname -r | sed 's/-.*//') | xargs) -y
|
||||
31
init/03-docker.sh
Normal file
31
init/03-docker.sh
Normal file
@@ -0,0 +1,31 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 03-docker.sh && ./03-docker.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/03-docker.sh && chmod +x 03-docker.sh && ./03-docker.sh
|
||||
|
||||
echo "初始化vps"
|
||||
|
||||
# 检查 Docker 是否已安装
|
||||
if ! command -v docker &> /dev/null; then
|
||||
# 如果 Docker 未安装,则安装它
|
||||
echo "安装 Docker..."
|
||||
curl -fsSL https://get.docker.com | sudo sh
|
||||
else
|
||||
echo "Docker 已经安装."
|
||||
fi
|
||||
|
||||
# 安装 Docker Compose
|
||||
if ! command -v docker-compose &> /dev/null; then
|
||||
# 如果 Docker Compose 未安装,则安装它
|
||||
echo "安装 Docker Compose..."
|
||||
#apt install -y docker-compose
|
||||
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||
chmod +x /usr/local/bin/docker-compose
|
||||
else
|
||||
echo "Docker Compose 已经安装."
|
||||
fi
|
||||
|
||||
echo "------------------------"
|
||||
echo "Docker的版本"
|
||||
docker --version
|
||||
docker-compose --version
|
||||
echo "------------------------"
|
||||
782
init/ddns-go.sh
Normal file
782
init/ddns-go.sh
Normal file
@@ -0,0 +1,782 @@
|
||||
#!/bin/bash
|
||||
# ddns-go 自动安装脚本
|
||||
# 使用方法: chmod +x ddns-go.sh && ./ddns-go.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/ddns-go.sh && chmod +x ddns-go.sh && ./ddns-go.sh
|
||||
|
||||
# 彩色输出
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[0;33m'
|
||||
BLUE='\033[0;34m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 全局变量
|
||||
DDNS_VERSION="" # 当前指定的 ddns-go 版本
|
||||
DDNS_PATH="/root/ddns"
|
||||
SCRIPT_VERSION="1.0.0"
|
||||
|
||||
# 日志函数
|
||||
log_info() {
|
||||
echo -e "${GREEN}[信息]${NC} $1"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${YELLOW}[警告]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[错误]${NC} $1"
|
||||
}
|
||||
|
||||
# 获取最新版本号
|
||||
get_latest_version() {
|
||||
local version=""
|
||||
|
||||
# 方法1:利用GitHub重定向特性获取最新版本
|
||||
local redirect_url=$(curl -s -L -o /dev/null -w '%{url_effective}' https://github.com/jeessy2/ddns-go/releases/latest 2>/dev/null)
|
||||
version=$(echo "$redirect_url" | grep -o 'tag/v[0-9.]*' | cut -d/ -f2 2>/dev/null)
|
||||
|
||||
# 如果获取失败,尝试备用方法
|
||||
if [[ -z "$version" ]]; then
|
||||
# 方法2: 通过API获取
|
||||
version=$(curl -s https://api.github.com/repos/jeessy2/ddns-go/releases/latest | grep -o '"tag_name": "v[0-9.]*"' | cut -d'"' -f4 2>/dev/null)
|
||||
fi
|
||||
|
||||
# 如果还是失败,返回默认版本
|
||||
if [[ -z "$version" ]]; then
|
||||
version="v6.9.1" # 默认版本
|
||||
fi
|
||||
|
||||
# 直接返回版本号,不打印任何日志
|
||||
echo "$version"
|
||||
}
|
||||
|
||||
# 检测系统架构
|
||||
detect_arch() {
|
||||
# 获取架构
|
||||
local arch=$(uname -m)
|
||||
local arch_type=""
|
||||
|
||||
# 转换架构名称为ddns-go使用的格式
|
||||
case "$arch" in
|
||||
x86_64)
|
||||
arch_type="linux_x86_64"
|
||||
;;
|
||||
i386|i686)
|
||||
arch_type="linux_x86"
|
||||
;;
|
||||
aarch64|arm64)
|
||||
arch_type="linux_arm64"
|
||||
;;
|
||||
armv7*|armv6*)
|
||||
arch_type="linux_armv7"
|
||||
;;
|
||||
armv8*)
|
||||
arch_type="linux_arm64"
|
||||
;;
|
||||
*)
|
||||
log_warn "未知架构: $arch,将尝试使用x86_64版本"
|
||||
arch_type="linux_x86_64"
|
||||
;;
|
||||
esac
|
||||
|
||||
# 直接返回结果而不是写入临时文件
|
||||
echo "$arch_type"
|
||||
}
|
||||
|
||||
# 获取IP地址信息
|
||||
get_ip_info() {
|
||||
local ipv4=$(curl -s ipv4.ip.sb)
|
||||
local ipv6=$(curl -s ipv6.ip.sb 2>/dev/null || echo "无")
|
||||
|
||||
echo "$ipv4|$ipv6"
|
||||
}
|
||||
|
||||
# 配置防火墙 - 仅处理 UFW
|
||||
configure_firewall() {
|
||||
local port=$1
|
||||
log_info "配置防火墙"
|
||||
|
||||
# 检查是否安装了 ufw
|
||||
if command -v ufw &>/dev/null; then
|
||||
# 检查ufw是否启用
|
||||
local ufw_status=$(ufw status | grep -o "Status: active" 2>/dev/null)
|
||||
|
||||
if [[ -z "$ufw_status" ]]; then
|
||||
log_warn "UFW 防火墙未启用,可能需要手动配置防火墙规则"
|
||||
log_info "您可以运行 'sudo ufw enable' 启用 UFW 防火墙"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 检查端口是否已经开放
|
||||
if ufw status | grep -q "$port/tcp"; then
|
||||
log_info "端口 $port 已经开放,跳过"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 开放端口
|
||||
echo -n "配置 UFW 防火墙,开放端口 $port... "
|
||||
if ufw allow "$port/tcp" &>/dev/null; then
|
||||
echo -e "${GREEN}完成${NC}"
|
||||
log_info "已在 UFW 防火墙开放端口: $port"
|
||||
else
|
||||
echo -e "${RED}失败${NC}"
|
||||
log_warn "无法开放端口 $port"
|
||||
fi
|
||||
else
|
||||
log_warn "未检测到 UFW 防火墙,跳过防火墙配置"
|
||||
log_info "如需管理防火墙规则,请安装 UFW: sudo apt install ufw"
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 关闭防火墙端口 - 仅处理 UFW
|
||||
close_firewall_port() {
|
||||
local port=$1
|
||||
log_info "关闭防火墙端口"
|
||||
|
||||
# 检查是否安装了 ufw
|
||||
if command -v ufw &>/dev/null; then
|
||||
# 检查ufw是否启用
|
||||
local ufw_status=$(ufw status | grep -o "Status: active" 2>/dev/null)
|
||||
|
||||
if [[ -z "$ufw_status" ]]; then
|
||||
log_warn "UFW 防火墙未启用,跳过防火墙配置"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 检查端口是否已开放在UFW中
|
||||
if ! ufw status | grep -q "$port/tcp"; then
|
||||
log_info "端口 $port 未在 UFW 中开放,跳过"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 关闭端口
|
||||
echo -n "关闭 UFW 防火墙端口 $port... "
|
||||
if ufw delete allow "$port/tcp" &>/dev/null; then
|
||||
echo -e "${GREEN}完成${NC}"
|
||||
log_info "已关闭 UFW 防火墙端口: $port"
|
||||
else
|
||||
echo -e "${RED}失败${NC}"
|
||||
log_warn "无法关闭端口 $port"
|
||||
fi
|
||||
else
|
||||
log_warn "未检测到 UFW 防火墙,跳过防火墙配置"
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 安装 ddns-go
|
||||
install_ddns_go() {
|
||||
clear
|
||||
echo "=================================================="
|
||||
echo -e "${GREEN}开始安装 ddns-go${NC}"
|
||||
echo "=================================================="
|
||||
|
||||
log_info "开始安装 ddns-go..."
|
||||
|
||||
# 询问用户是否自定义端口
|
||||
local web_port="9876" # 默认端口
|
||||
read -rp "是否自定义web访问端口? [y/N] " custom_port
|
||||
if [[ "$custom_port" =~ ^[yY]$ ]]; then
|
||||
while true; do
|
||||
read -rp "请输入端口号 (1-65535): " web_port
|
||||
if [[ "$web_port" =~ ^[0-9]+$ ]] && [ "$web_port" -ge 1 ] && [ "$web_port" -le 65535 ]; then
|
||||
log_info "将使用端口: $web_port"
|
||||
break
|
||||
else
|
||||
log_error "无效的端口号,请输入1-65535之间的数字"
|
||||
fi
|
||||
done
|
||||
else
|
||||
log_info "将使用默认端口: $web_port"
|
||||
fi
|
||||
|
||||
# 更新软件包
|
||||
log_info "更新软件包..."
|
||||
apt update -y && apt upgrade -y
|
||||
|
||||
# 安装必要工具
|
||||
log_info "安装必要工具..."
|
||||
apt install -y wget curl sudo vim git
|
||||
|
||||
# 创建安装目录
|
||||
mkdir -p $DDNS_PATH
|
||||
|
||||
# 1. 获取版本 - 先获取所有必要变量,不输出日志
|
||||
local version=""
|
||||
if [[ -n "$DDNS_VERSION" ]]; then
|
||||
version="$DDNS_VERSION"
|
||||
else
|
||||
version=$(get_latest_version)
|
||||
fi
|
||||
|
||||
# 2. 移除版本号前的 'v'
|
||||
local version_num=${version#v}
|
||||
|
||||
# 3. 检测系统架构 - 使用改进后的函数,直接返回结果
|
||||
local arch_suffix=$(detect_arch)
|
||||
|
||||
# 4. 构建下载URL - 使用纯文本变量
|
||||
local download_file="ddns-go_${version_num}_${arch_suffix}.tar.gz"
|
||||
local download_path="${DDNS_PATH}/${download_file}"
|
||||
local download_url="https://github.com/jeessy2/ddns-go/releases/download/${version}/${download_file}"
|
||||
|
||||
# 5. 现在安全地输出日志
|
||||
log_info "获取到最新版本:$version"
|
||||
log_info "检测到系统架构: $(uname -m) (使用: $arch_suffix)"
|
||||
log_info "下载链接: $download_url"
|
||||
|
||||
# 6. 下载文件 - 统一使用curl下载
|
||||
log_info "正在下载 ddns-go..."
|
||||
|
||||
if curl -s -L -o "$download_path" "$download_url"; then
|
||||
log_info "下载成功"
|
||||
else
|
||||
log_error "下载失败,请检查网络连接"
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 7. 解压文件
|
||||
log_info "正在解压文件..."
|
||||
if tar -zxf "$download_path" -C $DDNS_PATH; then
|
||||
log_info "解压成功"
|
||||
else
|
||||
log_error "解压失败"
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 8. 设置权限
|
||||
chmod +x $DDNS_PATH/ddns-go
|
||||
|
||||
# 9. 验证可执行文件
|
||||
log_info "验证 ddns-go 二进制文件..."
|
||||
if [ ! -f $DDNS_PATH/ddns-go ]; then
|
||||
log_error "未找到 ddns-go 可执行文件"
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 10. 测试运行
|
||||
if ! $DDNS_PATH/ddns-go -h > /dev/null 2>&1; then
|
||||
log_error "ddns-go 可执行文件无法运行,可能是架构不匹配"
|
||||
log_info "尝试检查更多架构版本..."
|
||||
|
||||
# 清理之前的文件
|
||||
rm -rf $DDNS_PATH/*
|
||||
|
||||
# 尝试其他架构版本
|
||||
local try_arch_list=("linux_arm64" "linux_armv7" "linux_x86" "linux_x86_64")
|
||||
local success=false
|
||||
|
||||
for try_arch in "${try_arch_list[@]}"; do
|
||||
if [ "$try_arch" != "$arch_suffix" ]; then
|
||||
log_info "尝试 $try_arch 架构版本..."
|
||||
|
||||
# 构建下载信息
|
||||
local try_file="ddns-go_${version_num}_${try_arch}.tar.gz"
|
||||
local try_path="${DDNS_PATH}/${try_file}"
|
||||
local try_url="https://github.com/jeessy2/ddns-go/releases/download/${version}/${try_file}"
|
||||
|
||||
# 下载并解压 - 统一使用curl
|
||||
if curl -s -L -o "$try_path" "$try_url" &&
|
||||
tar -zxf "$try_path" -C $DDNS_PATH &&
|
||||
chmod +x $DDNS_PATH/ddns-go; then
|
||||
|
||||
# 测试是否可运行
|
||||
if $DDNS_PATH/ddns-go -h > /dev/null 2>&1; then
|
||||
log_info "$try_arch 架构版本可以运行"
|
||||
success=true
|
||||
break
|
||||
else
|
||||
log_warn "$try_arch 架构版本不兼容"
|
||||
fi
|
||||
else
|
||||
log_warn "$try_arch 架构版本下载或解压失败"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# 如果所有架构都尝试失败
|
||||
if [ "$success" = false ]; then
|
||||
log_error "无法找到合适的版本,安装失败"
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 11. 安装服务
|
||||
log_info "安装系统服务..."
|
||||
cd $DDNS_PATH
|
||||
./ddns-go -s install -l 0.0.0.0:$web_port
|
||||
|
||||
# 12. 验证服务
|
||||
if systemctl status ddns-go > /dev/null 2>&1; then
|
||||
log_info "ddns-go 服务已成功安装并运行"
|
||||
else
|
||||
log_warn "ddns-go 服务可能未正确启动,请手动检查: systemctl status ddns-go"
|
||||
fi
|
||||
|
||||
# 13. 获取IP信息
|
||||
local ip_info=$(get_ip_info)
|
||||
local ipv4=$(echo "$ip_info" | cut -d'|' -f1)
|
||||
|
||||
# 14. 配置防火墙
|
||||
configure_firewall $web_port
|
||||
|
||||
log_info "ddns-go 安装完成!"
|
||||
echo "=================================================="
|
||||
echo -e "${GREEN}安装成功!${NC}"
|
||||
echo -e "${CYAN}Web管理界面访问地址: http://$ipv4:$web_port${NC}"
|
||||
echo -e "请在浏览器中打开上述地址进行配置"
|
||||
echo "=================================================="
|
||||
|
||||
# 清理下载文件
|
||||
rm -f "$download_path"
|
||||
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
}
|
||||
|
||||
# 卸载服务
|
||||
uninstall_ddns_go() {
|
||||
clear
|
||||
echo "=================================================="
|
||||
echo -e "${RED}开始卸载 ddns-go${NC}"
|
||||
echo "=================================================="
|
||||
|
||||
# 确认卸载
|
||||
echo -e "${YELLOW}警告: 这将卸载 ddns-go 并删除相关文件${NC}"
|
||||
read -rp "是否继续? [Y/n] " confirm
|
||||
if [[ "$confirm" =~ ^[nN]$ ]]; then
|
||||
log_info "卸载已取消"
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_info "正在卸载 ddns-go 服务..."
|
||||
|
||||
# 获取端口信息用于关闭防火墙
|
||||
local port=""
|
||||
if [ -d "$DDNS_PATH" ] && [ -f "$DDNS_PATH/config.yaml" ]; then
|
||||
port=$(grep -o 'listen: 0.0.0.0:[0-9]*' "$DDNS_PATH/config.yaml" 2>/dev/null | grep -o '[0-9]*$' | head -n 1)
|
||||
fi
|
||||
|
||||
if [[ -z "$port" ]]; then
|
||||
port=$(systemctl status ddns-go 2>/dev/null | grep -o '\-l 0.0.0.0:[0-9]*' | grep -o '[0-9]*$' | head -n 1)
|
||||
fi
|
||||
|
||||
if [ -d "$DDNS_PATH" ]; then
|
||||
cd $DDNS_PATH
|
||||
if [ -f "./ddns-go" ]; then
|
||||
./ddns-go -s uninstall
|
||||
log_info "服务已卸载"
|
||||
else
|
||||
log_error "找不到 ddns-go 可执行文件"
|
||||
fi
|
||||
|
||||
# 询问是否删除文件
|
||||
read -rp "是否删除所有 ddns-go 文件? [Y/n] " delete_confirm
|
||||
if [[ ! "$delete_confirm" =~ ^[nN]$ ]]; then
|
||||
rm -rf $DDNS_PATH
|
||||
log_info "所有文件已删除"
|
||||
else
|
||||
log_info "文件已保留"
|
||||
fi
|
||||
else
|
||||
log_error "找不到 ddns-go 安装目录"
|
||||
fi
|
||||
|
||||
# 关闭防火墙端口
|
||||
if [[ -n "$port" ]]; then
|
||||
close_firewall_port $port
|
||||
fi
|
||||
|
||||
log_info "ddns-go 卸载完成!"
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
}
|
||||
|
||||
# 更新 ddns-go
|
||||
update_ddns_go() {
|
||||
clear
|
||||
echo "=================================================="
|
||||
echo -e "${YELLOW}更新 ddns-go${NC}"
|
||||
echo "=================================================="
|
||||
|
||||
# 检查是否已安装
|
||||
if [ ! -d "$DDNS_PATH" ] || [ ! -f "$DDNS_PATH/ddns-go" ]; then
|
||||
log_error "ddns-go 未安装,请先安装"
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 获取当前版本
|
||||
local current_version=""
|
||||
current_version=$($DDNS_PATH/ddns-go -v 2>&1 | grep -o 'v[0-9.]*' | head -n 1)
|
||||
|
||||
if [[ -z "$current_version" ]]; then
|
||||
log_warn "无法获取当前版本信息"
|
||||
current_version="未知"
|
||||
fi
|
||||
|
||||
log_info "当前版本: $current_version"
|
||||
|
||||
# 获取最新版本
|
||||
local latest_version=$(get_latest_version)
|
||||
log_info "最新版本: $latest_version"
|
||||
|
||||
# 比较版本
|
||||
if [[ "$current_version" == "$latest_version" ]]; then
|
||||
log_info "已经是最新版本"
|
||||
read -rp "是否强制更新? [y/N] " force_update
|
||||
if [[ ! "$force_update" =~ ^[yY]$ ]]; then
|
||||
log_info "更新已取消"
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# 备份配置
|
||||
local config_backup="$DDNS_PATH/config.yaml.bak"
|
||||
if [ -f "$DDNS_PATH/config.yaml" ]; then
|
||||
log_info "备份配置文件..."
|
||||
cp "$DDNS_PATH/config.yaml" "$config_backup"
|
||||
fi
|
||||
|
||||
# 停止服务
|
||||
log_info "停止 ddns-go 服务..."
|
||||
cd $DDNS_PATH
|
||||
./ddns-go -s uninstall
|
||||
|
||||
# 下载新版本
|
||||
log_info "下载新版本..."
|
||||
|
||||
# 检测系统架构 - 使用改进后的函数,直接返回结果
|
||||
local arch_suffix=$(detect_arch)
|
||||
local version_num=${latest_version#v}
|
||||
|
||||
# 构建下载URL
|
||||
local download_file="ddns-go_${version_num}_${arch_suffix}.tar.gz"
|
||||
local download_path="${DDNS_PATH}/${download_file}"
|
||||
local download_url="https://github.com/jeessy2/ddns-go/releases/download/${latest_version}/${download_file}"
|
||||
|
||||
log_info "下载链接: $download_url"
|
||||
|
||||
# 删除原来的二进制文件
|
||||
rm -f $DDNS_PATH/ddns-go
|
||||
|
||||
# 下载文件 - 统一使用curl下载
|
||||
if curl -s -L -o "$download_path" "$download_url"; then
|
||||
log_info "下载成功"
|
||||
else
|
||||
log_error "下载失败,请检查网络连接"
|
||||
log_warn "将恢复服务"
|
||||
if [ -f "$config_backup" ]; then
|
||||
cp "$config_backup" "$DDNS_PATH/config.yaml"
|
||||
fi
|
||||
cd $DDNS_PATH
|
||||
./ddns-go -s install -l 0.0.0.0:9876
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 解压文件
|
||||
log_info "解压新版本..."
|
||||
if tar -zxf "$download_path" -C $DDNS_PATH; then
|
||||
log_info "解压成功"
|
||||
else
|
||||
log_error "解压失败"
|
||||
log_warn "将恢复服务"
|
||||
if [ -f "$config_backup" ]; then
|
||||
cp "$config_backup" "$DDNS_PATH/config.yaml"
|
||||
fi
|
||||
cd $DDNS_PATH
|
||||
./ddns-go -s install -l 0.0.0.0:9876
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 设置权限
|
||||
chmod +x $DDNS_PATH/ddns-go
|
||||
|
||||
# 恢复配置
|
||||
if [ -f "$config_backup" ]; then
|
||||
log_info "恢复配置文件..."
|
||||
cp "$config_backup" "$DDNS_PATH/config.yaml"
|
||||
fi
|
||||
|
||||
# 获取当前配置的端口
|
||||
local port="9876"
|
||||
if [ -f "$DDNS_PATH/config.yaml" ]; then
|
||||
local config_port=$(grep -o 'listen: 0.0.0.0:[0-9]*' "$DDNS_PATH/config.yaml" 2>/dev/null | grep -o '[0-9]*$' | head -n 1)
|
||||
if [[ -n "$config_port" ]]; then
|
||||
port="$config_port"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 安装服务
|
||||
log_info "重新安装服务..."
|
||||
cd $DDNS_PATH
|
||||
./ddns-go -s install -l 0.0.0.0:$port
|
||||
|
||||
# 验证更新
|
||||
local new_version=$($DDNS_PATH/ddns-go -v 2>&1 | grep -o 'v[0-9.]*' | head -n 1)
|
||||
if [[ -z "$new_version" ]]; then
|
||||
new_version="未知"
|
||||
fi
|
||||
log_info "更新完成,当前版本: $new_version"
|
||||
|
||||
# 清理下载文件
|
||||
rm -f "$download_path"
|
||||
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
}
|
||||
|
||||
# 查看状态
|
||||
check_status() {
|
||||
clear
|
||||
echo "=================================================="
|
||||
echo -e "${BLUE}ddns-go 状态检查${NC}"
|
||||
echo "=================================================="
|
||||
|
||||
# 检查是否安装
|
||||
if [ ! -d "$DDNS_PATH" ] || [ ! -f "$DDNS_PATH/ddns-go" ]; then
|
||||
echo -e "${RED}ddns-go 未安装${NC}"
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 检查版本
|
||||
local version=$($DDNS_PATH/ddns-go -v 2>&1 | grep -o 'v[0-9.]*' | head -n 1)
|
||||
if [[ -z "$version" ]]; then
|
||||
version="未知"
|
||||
fi
|
||||
echo -e "ddns-go 版本: ${GREEN}$version${NC}"
|
||||
|
||||
# 检查服务状态
|
||||
echo -n "服务状态: "
|
||||
if systemctl is-active ddns-go &>/dev/null; then
|
||||
echo -e "${GREEN}运行中${NC}"
|
||||
else
|
||||
echo -e "${RED}未运行${NC}"
|
||||
fi
|
||||
|
||||
echo -n "自启动状态: "
|
||||
if systemctl is-enabled ddns-go &>/dev/null; then
|
||||
echo -e "${GREEN}已启用${NC}"
|
||||
else
|
||||
echo -e "${RED}未启用${NC}"
|
||||
fi
|
||||
|
||||
# 检查配置文件
|
||||
echo -n "配置文件: "
|
||||
if [ -f "$DDNS_PATH/config.yaml" ]; then
|
||||
echo -e "${GREEN}存在${NC}"
|
||||
else
|
||||
echo -e "${RED}不存在${NC}"
|
||||
fi
|
||||
|
||||
# 获取内存和 CPU 使用情况
|
||||
echo "资源使用情况:"
|
||||
ps -aux | grep ddns-go | grep -v grep | awk '{print "内存使用: " $4 "%, CPU使用: " $3 "%"}'
|
||||
|
||||
# 获取端口信息
|
||||
echo -n "端口状态: "
|
||||
local port=$(grep -o 'listen: 0.0.0.0:[0-9]*' "$DDNS_PATH/config.yaml" 2>/dev/null | grep -o '[0-9]*$' | head -n 1)
|
||||
if [[ -z "$port" ]]; then
|
||||
port=$(systemctl status ddns-go 2>/dev/null | grep -o '\-l 0.0.0.0:[0-9]*' | grep -o '[0-9]*$' | head -n 1)
|
||||
fi
|
||||
|
||||
if [[ -n "$port" ]]; then
|
||||
if command -v ss &>/dev/null; then
|
||||
if ss -tuln | grep -q ":$port "; then
|
||||
echo -e "${GREEN}端口 $port 已开放${NC}"
|
||||
else
|
||||
echo -e "${RED}端口 $port 未开放${NC}"
|
||||
fi
|
||||
elif command -v netstat &>/dev/null; then
|
||||
if netstat -tuln | grep -q ":$port "; then
|
||||
echo -e "${GREEN}端口 $port 已开放${NC}"
|
||||
else
|
||||
echo -e "${RED}端口 $port 未开放${NC}"
|
||||
fi
|
||||
else
|
||||
echo -e "${YELLOW}无法检查端口状态${NC}"
|
||||
fi
|
||||
else
|
||||
echo -e "${YELLOW}未找到端口信息${NC}"
|
||||
fi
|
||||
|
||||
# 检查DNS解析记录
|
||||
echo -e "\n上次DNS更新信息:"
|
||||
if [ -f "$DDNS_PATH/config.yaml" ]; then
|
||||
grep -A 10 'ipv4' "$DDNS_PATH/config.yaml" | head -n 10
|
||||
else
|
||||
echo "未找到配置文件,无法获取DNS更新信息"
|
||||
fi
|
||||
|
||||
# 显示日志
|
||||
echo -e "\n最近日志:"
|
||||
if command -v journalctl &>/dev/null; then
|
||||
journalctl -u ddns-go --no-pager -n 10
|
||||
else
|
||||
echo "找不到日志信息"
|
||||
fi
|
||||
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
}
|
||||
|
||||
# 重启服务
|
||||
restart_service() {
|
||||
clear
|
||||
echo "=================================================="
|
||||
echo -e "${GREEN}重启 ddns-go 服务${NC}"
|
||||
echo "=================================================="
|
||||
|
||||
# 检查是否已安装
|
||||
if [ ! -d "$DDNS_PATH" ] || [ ! -f "$DDNS_PATH/ddns-go" ]; then
|
||||
log_error "ddns-go 未安装,请先安装"
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
return 0
|
||||
fi
|
||||
|
||||
log_info "正在重启 ddns-go 服务..."
|
||||
|
||||
# 尝试使用systemctl重启
|
||||
if systemctl restart ddns-go; then
|
||||
log_info "服务已重启"
|
||||
else
|
||||
log_warn "systemctl重启失败,尝试手动重启..."
|
||||
cd $DDNS_PATH
|
||||
./ddns-go -s uninstall
|
||||
sleep 1
|
||||
|
||||
# 获取当前配置的端口
|
||||
local web_port="9876"
|
||||
if [ -f "$DDNS_PATH/config.yaml" ]; then
|
||||
local config_port=$(grep -o 'listen: 0.0.0.0:[0-9]*' "$DDNS_PATH/config.yaml" 2>/dev/null | grep -o '[0-9]*$' | head -n 1)
|
||||
if [[ -n "$config_port" ]]; then
|
||||
web_port="$config_port"
|
||||
fi
|
||||
fi
|
||||
|
||||
./ddns-go -s install -l 0.0.0.0:$web_port
|
||||
log_info "服务已手动重启"
|
||||
fi
|
||||
|
||||
# 获取IP信息
|
||||
local ip_info=$(get_ip_info)
|
||||
local ipv4=$(echo "$ip_info" | cut -d'|' -f1)
|
||||
|
||||
log_info "服务已重启,Web管理界面: http://$ipv4:$web_port"
|
||||
|
||||
read -rp "按回车键返回主菜单..." temp
|
||||
show_menu
|
||||
}
|
||||
|
||||
# 显示帮助
|
||||
show_help() {
|
||||
echo "ddns-go 管理脚本 v${SCRIPT_VERSION}"
|
||||
echo "用法: $0 [选项]"
|
||||
echo ""
|
||||
echo "选项:"
|
||||
echo " install 直接安装 ddns-go"
|
||||
echo " uninstall 直接卸载 ddns-go"
|
||||
echo " restart 重启 ddns-go 服务"
|
||||
echo " status 查看 ddns-go 状态"
|
||||
echo " update 更新 ddns-go"
|
||||
echo " ip 显示当前公网IP地址"
|
||||
echo " help 显示此帮助信息"
|
||||
echo ""
|
||||
echo "无参数运行脚本将显示交互式菜单"
|
||||
}
|
||||
|
||||
# 菜单函数
|
||||
show_menu() {
|
||||
clear
|
||||
echo "=================================================="
|
||||
echo -e "${CYAN}ddns-go 管理脚本 v${SCRIPT_VERSION}${NC}"
|
||||
echo "=================================================="
|
||||
echo -e "1) ${GREEN}安装 ddns-go${NC}"
|
||||
echo -e "2) ${RED}卸载 ddns-go${NC}"
|
||||
echo -e "3) ${YELLOW}更新 ddns-go${NC}"
|
||||
echo -e "4) ${BLUE}查看 ddns-go 状态${NC}"
|
||||
echo -e "5) ${GREEN}重启 ddns-go 服务${NC}"
|
||||
echo -e "0) ${RED}退出${NC}"
|
||||
echo "=================================================="
|
||||
echo ""
|
||||
read -rp "请输入选项 [0-5]: " choice
|
||||
|
||||
case $choice in
|
||||
1) install_ddns_go ;;
|
||||
2) uninstall_ddns_go ;;
|
||||
3) update_ddns_go ;;
|
||||
4) check_status ;;
|
||||
5) restart_service ;;
|
||||
0) exit 0 ;;
|
||||
*) log_error "无效选项" && sleep 2 && show_menu ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
# 处理命令行参数
|
||||
if [[ $# -gt 0 ]]; then
|
||||
case "$1" in
|
||||
-h|--help|help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
install)
|
||||
install_ddns_go
|
||||
exit 0
|
||||
;;
|
||||
uninstall)
|
||||
uninstall_ddns_go
|
||||
exit 0
|
||||
;;
|
||||
restart)
|
||||
restart_service
|
||||
exit 0
|
||||
;;
|
||||
status)
|
||||
check_status
|
||||
exit 0
|
||||
;;
|
||||
update)
|
||||
update_ddns_go
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
log_error "未知参数: $1"
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# 无参数则显示菜单
|
||||
show_menu
|
||||
}
|
||||
|
||||
# 执行主函数
|
||||
main "$@"
|
||||
675
init/vps_init.sh
Normal file
675
init/vps_init.sh
Normal file
@@ -0,0 +1,675 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# VPS初始化一键脚本
|
||||
# 整合了系统更新、登录安全设置、系统清理、Docker安装、防火墙设置、时区设置、
|
||||
# 内存优化、Fail2ban安装和BBR加速
|
||||
# 使用方法: chmod +x vps_init.sh && ./vps_init.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/init/vps_init.sh && chmod +x vps_init.sh && ./vps_init.sh
|
||||
|
||||
# ===========================================
|
||||
# 用户设置区域 - 根据需要修改
|
||||
# ===========================================
|
||||
NEW_PASSWORD="d!Fssw97SoALHa" # root用户新密码
|
||||
NEW_SSH_PORT="4399" # SSH新端口号
|
||||
TIMEZONE="Asia/Shanghai" # 时区设置
|
||||
SWAP_SIZE=1024 # 交换分区大小(MB)
|
||||
# ===========================================
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[0;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # 恢复默认颜色
|
||||
|
||||
# 确保脚本以root权限运行
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
echo -e "${RED}错误: 必须以root用户运行此脚本!${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 显示欢迎信息
|
||||
echo -e "${GREEN}=============================================${NC}"
|
||||
echo -e "${BLUE} VPS初始化一键脚本开始执行 ${NC}"
|
||||
echo -e "${GREEN}=============================================${NC}"
|
||||
echo ""
|
||||
|
||||
# ===========================================
|
||||
# 交互式设置选项
|
||||
# ===========================================
|
||||
echo -e "${BLUE}进行交互式设置...${NC}"
|
||||
|
||||
# 询问是否修改SSH端口
|
||||
echo -e "${YELLOW}1. 是否修改SSH端口? 当前设置为: ${NEW_SSH_PORT}${NC}"
|
||||
while true; do
|
||||
read -p "修改SSH端口? (y/n, 默认n): " CHANGE_SSH_PORT
|
||||
# 设置默认值为否,用户按Enter就不修改
|
||||
CHANGE_SSH_PORT=${CHANGE_SSH_PORT:-n}
|
||||
if [[ "$CHANGE_SSH_PORT" =~ ^[Yy]$ ]] || [[ "$CHANGE_SSH_PORT" =~ ^[Nn]$ ]]; then
|
||||
break
|
||||
else
|
||||
echo -e "${RED}无效的输入,请输入 y 或 n${NC}"
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "$CHANGE_SSH_PORT" =~ ^[Yy]$ ]]; then
|
||||
echo -e "${GREEN}SSH端口将被修改为: ${NEW_SSH_PORT}${NC}"
|
||||
else
|
||||
echo -e "${GREEN}保持SSH端口不变: $NEW_SSH_PORT${NC}"
|
||||
fi
|
||||
|
||||
# 询问是否修改密码
|
||||
echo -e "${YELLOW}2. 是否修改root密码?${NC}"
|
||||
while true; do
|
||||
read -p "修改root密码? (y/n, 默认n): " CHANGE_PASSWORD
|
||||
# 设置默认值为否,用户按Enter就不修改
|
||||
CHANGE_PASSWORD=${CHANGE_PASSWORD:-n}
|
||||
if [[ "$CHANGE_PASSWORD" =~ ^[Yy]$ ]] || [[ "$CHANGE_PASSWORD" =~ ^[Nn]$ ]]; then
|
||||
break
|
||||
else
|
||||
echo -e "${RED}无效的输入,请输入 y 或 n${NC}"
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "$CHANGE_PASSWORD" =~ ^[Yy]$ ]]; then
|
||||
echo -e "${GREEN}root密码将被修改为系统预设值${NC}"
|
||||
else
|
||||
echo -e "${GREEN}保持root密码不变${NC}"
|
||||
fi
|
||||
|
||||
# 询问是否修改主机名
|
||||
echo -e "${YELLOW}3. 是否修改主机名?${NC}"
|
||||
while true; do
|
||||
read -p "修改主机名? (y/n, 默认n): " CHANGE_HOSTNAME
|
||||
# 设置默认值为否,用户按Enter就不修改
|
||||
CHANGE_HOSTNAME=${CHANGE_HOSTNAME:-n}
|
||||
if [[ "$CHANGE_HOSTNAME" =~ ^[Yy]$ ]] || [[ "$CHANGE_HOSTNAME" =~ ^[Nn]$ ]]; then
|
||||
break
|
||||
else
|
||||
echo -e "${RED}无效的输入,请输入 y 或 n${NC}"
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "$CHANGE_HOSTNAME" =~ ^[Yy]$ ]]; then
|
||||
# 显示当前主机名
|
||||
CURRENT_HOSTNAME=$(hostname)
|
||||
echo -e "${YELLOW}当前主机名: ${CURRENT_HOSTNAME}${NC}"
|
||||
|
||||
# 让用户输入新主机名
|
||||
read -p "请输入新的主机名: " NEW_HOSTNAME
|
||||
if [ -n "$NEW_HOSTNAME" ]; then
|
||||
CHANGE_HOSTNAME_FLAG=true
|
||||
echo -e "${GREEN}主机名将被修改为: ${NEW_HOSTNAME}${NC}"
|
||||
else
|
||||
CHANGE_HOSTNAME_FLAG=false
|
||||
echo -e "${RED}主机名不能为空,将保持不变${NC}"
|
||||
fi
|
||||
else
|
||||
CHANGE_HOSTNAME_FLAG=false
|
||||
echo -e "${GREEN}保持主机名不变${NC}"
|
||||
fi
|
||||
|
||||
echo -e "${BLUE}交互式设置完成${NC}"
|
||||
echo ""
|
||||
|
||||
# 记录开始时间
|
||||
START_TIME=$(date +%s)
|
||||
|
||||
# 检查系统类型
|
||||
if [ -f /etc/debian_version ]; then
|
||||
OS_TYPE="debian"
|
||||
echo -e "${GREEN}检测到Debian/Ubuntu系统${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}警告: 此脚本主要为Debian/Ubuntu系统设计${NC}"
|
||||
echo -e "${YELLOW}部分功能可能在其他系统上不正常工作${NC}"
|
||||
OS_TYPE="other"
|
||||
fi
|
||||
|
||||
# 创建日志文件
|
||||
LOG_FILE="/var/log/vps_init_$(date +%Y%m%d_%H%M%S).log"
|
||||
touch $LOG_FILE
|
||||
echo "VPS初始化脚本开始执行: $(date)" > $LOG_FILE
|
||||
|
||||
# 定义日志函数
|
||||
log() {
|
||||
echo -e "$1" | tee -a $LOG_FILE
|
||||
}
|
||||
|
||||
# 定义错误处理函数
|
||||
handle_error() {
|
||||
local exit_code=$?
|
||||
local line_no=$1
|
||||
if [ $exit_code -ne 0 ]; then
|
||||
log "${RED}错误: 在第 $line_no 行发生错误,退出代码: $exit_code${NC}"
|
||||
log "${RED}请检查日志文件: $LOG_FILE${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
# 设置错误跟踪
|
||||
trap 'handle_error $LINENO' ERR
|
||||
|
||||
# ===========================================
|
||||
# 1. 系统更新
|
||||
# ===========================================
|
||||
log "${BLUE}[1/10] 系统更新开始...${NC}"
|
||||
|
||||
# 保存当前的sources.list作为备份
|
||||
if [ -f "/etc/apt/sources.list" ]; then
|
||||
cp /etc/apt/sources.list /etc/apt/sources.list.bak
|
||||
log "${GREEN}备份了软件源配置文件${NC}"
|
||||
fi
|
||||
|
||||
# 更新系统包
|
||||
if [ "$OS_TYPE" = "debian" ]; then
|
||||
apt update -y || log "${RED}更新软件源失败${NC}"
|
||||
DEBIAN_FRONTEND=noninteractive apt full-upgrade -y || log "${RED}系统升级失败${NC}"
|
||||
apt install -y wget curl sudo vim git ufw net-tools htop iftop || log "${RED}安装基础软件包失败${NC}"
|
||||
log "${GREEN}系统更新完成,安装了常用工具${NC}"
|
||||
else
|
||||
log "${YELLOW}非Debian系统,跳过标准更新流程${NC}"
|
||||
fi
|
||||
|
||||
# ===========================================
|
||||
# 2. 主机名设置(如果用户选择了修改)
|
||||
# ===========================================
|
||||
if [ "$CHANGE_HOSTNAME_FLAG" = true ]; then
|
||||
log "${BLUE}[2/10] 设置主机名...${NC}"
|
||||
|
||||
# 备份当前主机名配置
|
||||
cp /etc/hostname /etc/hostname.bak
|
||||
cp /etc/hosts /etc/hosts.bak
|
||||
|
||||
# 修改主机名
|
||||
echo "$NEW_HOSTNAME" > /etc/hostname
|
||||
hostname "$NEW_HOSTNAME"
|
||||
|
||||
# 更新hosts文件
|
||||
sed -i "s/127.0.1.1.*/127.0.1.1\t$NEW_HOSTNAME/g" /etc/hosts
|
||||
|
||||
# 检查是否修改成功
|
||||
CURRENT_HOSTNAME=$(hostname)
|
||||
if [ "$CURRENT_HOSTNAME" = "$NEW_HOSTNAME" ]; then
|
||||
log "${GREEN}主机名已成功修改为: $NEW_HOSTNAME${NC}"
|
||||
else
|
||||
log "${RED}主机名修改失败,当前名称: $CURRENT_HOSTNAME${NC}"
|
||||
fi
|
||||
|
||||
log "${GREEN}主机名设置完成${NC}"
|
||||
else
|
||||
log "${YELLOW}[2/10] 跳过主机名设置...${NC}"
|
||||
fi
|
||||
|
||||
# ===========================================
|
||||
# 3. 登录安全设置
|
||||
# ===========================================
|
||||
log "${BLUE}[3/10] 设置登录安全...${NC}"
|
||||
|
||||
# 根据用户选择修改root密码
|
||||
if [[ "$CHANGE_PASSWORD" =~ ^[Yy]$ ]]; then
|
||||
echo "root:$NEW_PASSWORD" | chpasswd
|
||||
if [ $? -eq 0 ]; then
|
||||
log "${GREEN}Root密码修改成功${NC}"
|
||||
else
|
||||
log "${RED}Root密码修改失败${NC}"
|
||||
fi
|
||||
else
|
||||
log "${YELLOW}根据用户选择,保持root密码不变${NC}"
|
||||
fi
|
||||
|
||||
# 根据用户选择修改SSH端口
|
||||
if [[ "$CHANGE_SSH_PORT" =~ ^[Yy]$ ]]; then
|
||||
# 备份SSH配置文件
|
||||
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
|
||||
log "${GREEN}SSH配置已备份${NC}"
|
||||
|
||||
# 修改SSH配置
|
||||
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config
|
||||
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config
|
||||
sed -i 's/#Port/Port/' /etc/ssh/sshd_config
|
||||
sed -i "s/Port [0-9]\+/Port $NEW_SSH_PORT/g" /etc/ssh/sshd_config
|
||||
|
||||
# 读取修改后的SSH端口以确认更改
|
||||
NEW_PORT_CONFIGURED=$(grep -P "^Port\s+\d+" /etc/ssh/sshd_config | awk '{print $2}')
|
||||
if [ "$NEW_PORT_CONFIGURED" = "$NEW_SSH_PORT" ]; then
|
||||
log "${GREEN}SSH端口已修改为: $NEW_SSH_PORT${NC}"
|
||||
else
|
||||
log "${RED}SSH端口修改失败,当前设置: $NEW_PORT_CONFIGURED${NC}"
|
||||
# 尝试使用另一种方法修改
|
||||
echo "Port $NEW_SSH_PORT" >> /etc/ssh/sshd_config
|
||||
log "${YELLOW}尝试使用备选方法添加端口设置${NC}"
|
||||
fi
|
||||
|
||||
# 重启SSH服务
|
||||
systemctl restart sshd
|
||||
if [ $? -eq 0 ]; then
|
||||
log "${GREEN}SSH服务重启成功${NC}"
|
||||
else
|
||||
log "${RED}SSH服务重启失败${NC}"
|
||||
# 尝试使用service命令
|
||||
service sshd restart || service ssh restart
|
||||
fi
|
||||
|
||||
# 检查SSH服务状态
|
||||
systemctl status sshd --no-pager || service sshd status || service ssh status
|
||||
log "${GREEN}SSH配置更改完成${NC}"
|
||||
log "${YELLOW}注意:新的SSH连接端口为 $NEW_SSH_PORT${NC}"
|
||||
else
|
||||
log "${YELLOW}根据用户选择,保持SSH端口不变${NC}"
|
||||
|
||||
# 即使不修改端口,仍然应该确保其他SSH安全设置
|
||||
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config
|
||||
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config
|
||||
|
||||
log "${GREEN}SSH基本安全设置完成${NC}"
|
||||
fi
|
||||
|
||||
# ===========================================
|
||||
# 4. 系统清理
|
||||
# ===========================================
|
||||
log "${BLUE}[4/10] 系统清理开始...${NC}"
|
||||
|
||||
# 清理不需要的软件包
|
||||
if [ "$OS_TYPE" = "debian" ]; then
|
||||
apt autoremove --purge -y
|
||||
apt clean -y
|
||||
apt autoclean -y
|
||||
apt remove --purge $(dpkg -l | awk '/^rc/ {print $2}') -y 2>/dev/null || log "${YELLOW}没有需要清理的软件包配置${NC}"
|
||||
|
||||
# 清理日志
|
||||
journalctl --rotate
|
||||
journalctl --vacuum-time=1d
|
||||
journalctl --vacuum-size=50M
|
||||
log "${GREEN}系统日志已清理${NC}"
|
||||
|
||||
# 清理旧内核(保留当前运行的内核)
|
||||
apt remove --purge $(dpkg -l | awk '/^ii linux-(image|headers)-[^ ]+/{print $2}' | grep -v $(uname -r | sed 's/-.*//') | xargs) -y 2>/dev/null || log "${YELLOW}没有可清理的旧内核${NC}"
|
||||
|
||||
log "${GREEN}系统清理完成${NC}"
|
||||
else
|
||||
log "${YELLOW}非Debian系统,跳过系统清理流程${NC}"
|
||||
fi
|
||||
|
||||
# ===========================================
|
||||
# 5. Docker安装
|
||||
# ===========================================
|
||||
log "${BLUE}[5/10] Docker安装开始...${NC}"
|
||||
|
||||
# 检查Docker是否已安装
|
||||
if command -v docker &> /dev/null; then
|
||||
log "${GREEN}Docker已经安装,版本信息:${NC}"
|
||||
docker --version
|
||||
else
|
||||
# 安装Docker
|
||||
if [ "$OS_TYPE" = "debian" ]; then
|
||||
# 使用官方安装脚本
|
||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||
sh get-docker.sh
|
||||
rm get-docker.sh
|
||||
systemctl enable docker
|
||||
|
||||
# 安装Docker Compose
|
||||
if ! command -v docker-compose &> /dev/null; then
|
||||
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||
chmod +x /usr/local/bin/docker-compose
|
||||
log "${GREEN}Docker Compose 安装完成${NC}"
|
||||
fi
|
||||
|
||||
log "${GREEN}Docker安装完成,版本信息:${NC}"
|
||||
docker --version
|
||||
docker-compose --version
|
||||
else
|
||||
log "${YELLOW}非Debian系统,请手动安装Docker${NC}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ===========================================
|
||||
# 6. 防火墙设置
|
||||
# ===========================================
|
||||
log "${BLUE}[6/10] 防火墙设置开始...${NC}"
|
||||
|
||||
# 安装UFW
|
||||
if [ "$OS_TYPE" = "debian" ]; then
|
||||
apt update -y && apt install -y ufw net-tools lsof
|
||||
|
||||
# 确保防火墙默认策略
|
||||
ufw default deny incoming
|
||||
ufw default allow outgoing
|
||||
|
||||
# 获取当前SSH端口(如果有多个SSH端口,获取所有)
|
||||
CURRENT_SSH_PORT=$(grep -P "^Port\s+\d+" /etc/ssh/sshd_config | awk '{print $2}')
|
||||
if [ -z "$CURRENT_SSH_PORT" ]; then
|
||||
# 如果没找到,使用默认端口22
|
||||
CURRENT_SSH_PORT="22"
|
||||
fi
|
||||
|
||||
# 总是添加新配置的SSH端口(防止被锁在系统之外)
|
||||
log "${GREEN}允许SSH端口 $NEW_SSH_PORT${NC}"
|
||||
ufw allow $NEW_SSH_PORT/tcp comment 'New SSH Port'
|
||||
|
||||
# 如果当前SSH端口与新端口不同,添加当前SSH端口作为备份
|
||||
if [ "$CURRENT_SSH_PORT" != "$NEW_SSH_PORT" ]; then
|
||||
log "${GREEN}允许当前SSH端口 $CURRENT_SSH_PORT (备份)${NC}"
|
||||
ufw allow $CURRENT_SSH_PORT/tcp comment 'Current SSH Port (Backup)'
|
||||
fi
|
||||
|
||||
# 添加基本Web服务端口
|
||||
log "${GREEN}允许HTTP/HTTPS端口${NC}"
|
||||
ufw allow 80/tcp comment 'HTTP'
|
||||
ufw allow 443/tcp comment 'HTTPS'
|
||||
|
||||
# 检测活跃的网络连接和正在监听的端口
|
||||
log "${YELLOW}检测当前活跃的服务端口...${NC}"
|
||||
|
||||
# 使用netstat查找监听的TCP端口
|
||||
LISTENING_PORTS=$(netstat -tlnp 2>/dev/null | grep "LISTEN" | awk '{print $4}' | awk -F: '{print $NF}' | sort -n | uniq)
|
||||
|
||||
# 使用lsof作为备选方法
|
||||
if [ -z "$LISTENING_PORTS" ]; then
|
||||
LISTENING_PORTS=$(lsof -i -P -n | grep LISTEN | awk '{print $9}' | awk -F: '{print $NF}' | sort -n | uniq)
|
||||
fi
|
||||
|
||||
# 如果仍然为空,提示手动检查
|
||||
if [ -z "$LISTENING_PORTS" ]; then
|
||||
log "${YELLOW}未检测到活跃端口,只开放SSH、HTTP和HTTPS端口${NC}"
|
||||
else
|
||||
log "${GREEN}检测到以下活跃端口:${NC}"
|
||||
for PORT in $LISTENING_PORTS; do
|
||||
# 跳过SSH端口(已经添加过),以及常见的本地服务端口
|
||||
if [[ "$PORT" != "$NEW_SSH_PORT" && "$PORT" != "$CURRENT_SSH_PORT" &&
|
||||
"$PORT" != "80" && "$PORT" != "443" &&
|
||||
"$PORT" -lt "65535" && "$PORT" -gt "1024" ]]; then
|
||||
|
||||
# 尝试找出服务名称
|
||||
SERVICE=$(lsof -i:$PORT -sTCP:LISTEN | grep -v "COMMAND" | awk '{print $1}' | head -1)
|
||||
if [ -z "$SERVICE" ]; then
|
||||
SERVICE=$(netstat -tlnp 2>/dev/null | grep ":$PORT" | awk '{print $7}' | cut -d"/" -f2 | head -1)
|
||||
fi
|
||||
|
||||
if [ -n "$SERVICE" ]; then
|
||||
COMMENT="Service: $SERVICE"
|
||||
else
|
||||
COMMENT="Unknown Service"
|
||||
fi
|
||||
|
||||
log "${GREEN}允许端口 $PORT/tcp ($COMMENT)${NC}"
|
||||
ufw allow $PORT/tcp comment "$COMMENT"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# 删除询问用户是否手动开放端口的部分
|
||||
log "${GREEN}已自动开放SSH、HTTP、HTTPS端口和检测到的活跃服务端口${NC}"
|
||||
|
||||
# 启用防火墙
|
||||
if ! ufw status | grep -q "Status: active"; then
|
||||
log "${YELLOW}启用UFW防火墙...${NC}"
|
||||
echo "y" | ufw enable || log "${RED}UFW启用失败${NC}"
|
||||
else
|
||||
log "${GREEN}UFW防火墙已启用${NC}"
|
||||
fi
|
||||
|
||||
# 显示防火墙状态
|
||||
ufw status numbered | tee -a $LOG_FILE
|
||||
log "${GREEN}防火墙设置完成,已使用最小化原则开放端口${NC}"
|
||||
else
|
||||
log "${YELLOW}非Debian系统,请手动配置防火墙${NC}"
|
||||
fi
|
||||
|
||||
# ===========================================
|
||||
# 7. 时区设置
|
||||
# ===========================================
|
||||
log "${BLUE}[7/10] 时区设置开始...${NC}"
|
||||
|
||||
# 设置时区
|
||||
timedatectl set-timezone $TIMEZONE
|
||||
if [ $? -eq 0 ]; then
|
||||
CURRENT_TZ=$(timedatectl show --property=Timezone --value)
|
||||
log "${GREEN}时区设置为: $CURRENT_TZ${NC}"
|
||||
else
|
||||
log "${RED}时区设置失败${NC}"
|
||||
fi
|
||||
|
||||
# ===========================================
|
||||
# 8. 内存优化 - 添加交换空间
|
||||
# ===========================================
|
||||
log "${BLUE}[8/10] 内存优化开始...${NC}"
|
||||
|
||||
# 获取当前所有交换空间信息
|
||||
CURRENT_SWAP_TOTAL=$(free -m | grep "Swap:" | awk '{print $2}')
|
||||
log "${YELLOW}当前系统交换空间总大小: ${CURRENT_SWAP_TOTAL}MB${NC}"
|
||||
|
||||
# 检查是否存在交换空间且大小与设定值相同
|
||||
if [ "$CURRENT_SWAP_TOTAL" -eq "$SWAP_SIZE" ]; then
|
||||
log "${GREEN}当前交换空间大小(${CURRENT_SWAP_TOTAL}MB)与设定值一致,无需修改${NC}"
|
||||
# 显示交换空间信息
|
||||
free -h | tee -a $LOG_FILE
|
||||
else
|
||||
# 如果不存在交换空间或大小不同,则进行处理
|
||||
if [ "$CURRENT_SWAP_TOTAL" -gt "0" ]; then
|
||||
log "${YELLOW}系统已有交换空间但大小不符(${CURRENT_SWAP_TOTAL}MB),准备清理现有交换空间...${NC}"
|
||||
|
||||
# 获取所有交换设备
|
||||
SWAP_DEVICES=$(swapon --show=NAME --noheadings)
|
||||
|
||||
# 清理所有活跃的交换空间
|
||||
for DEVICE in $SWAP_DEVICES; do
|
||||
log "${YELLOW}关闭交换空间: $DEVICE${NC}"
|
||||
swapoff "$DEVICE"
|
||||
done
|
||||
|
||||
# 从fstab中移除所有交换空间条目(保留备份)
|
||||
cp /etc/fstab /etc/fstab.bak
|
||||
log "${GREEN}备份了/etc/fstab文件${NC}"
|
||||
sed -i '/swap/d' /etc/fstab
|
||||
|
||||
# 删除交换文件
|
||||
if [ -f /swapfile ]; then
|
||||
log "${YELLOW}删除现有交换文件...${NC}"
|
||||
rm -f /swapfile
|
||||
fi
|
||||
|
||||
log "${GREEN}所有现有交换空间已清理${NC}"
|
||||
else
|
||||
log "${YELLOW}系统未配置交换空间,准备创建...${NC}"
|
||||
fi
|
||||
|
||||
# 创建新的交换文件
|
||||
log "${GREEN}创建${SWAP_SIZE}MB大小的交换文件...${NC}"
|
||||
dd if=/dev/zero of=/swapfile bs=1M count=$SWAP_SIZE status=progress
|
||||
chmod 600 /swapfile
|
||||
mkswap /swapfile
|
||||
swapon /swapfile
|
||||
|
||||
# 设置开机自动挂载
|
||||
if ! grep -q "/swapfile" /etc/fstab; then
|
||||
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
|
||||
log "${GREEN}已添加到fstab,开机将自动挂载${NC}"
|
||||
fi
|
||||
|
||||
# 调整swappiness参数(控制系统对交换空间的使用倾向)
|
||||
echo "vm.swappiness=10" > /etc/sysctl.d/99-swappiness.conf
|
||||
sysctl -p /etc/sysctl.d/99-swappiness.conf
|
||||
|
||||
# 显示交换空间信息
|
||||
log "${GREEN}交换分区配置完成,当前内存和交换空间状态:${NC}"
|
||||
free -h | tee -a $LOG_FILE
|
||||
fi
|
||||
|
||||
# ===========================================
|
||||
# 9. Fail2ban安装和配置
|
||||
# ===========================================
|
||||
log "${BLUE}[9/10] Fail2ban安装开始...${NC}"
|
||||
|
||||
if [ "$OS_TYPE" = "debian" ]; then
|
||||
# 安装Fail2ban
|
||||
apt update -y && apt install -y fail2ban
|
||||
systemctl start fail2ban
|
||||
systemctl enable fail2ban
|
||||
|
||||
# 配置Fail2ban
|
||||
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
|
||||
|
||||
# 清理任何现有配置
|
||||
rm -rf /etc/fail2ban/jail.d/* 2>/dev/null || true
|
||||
|
||||
# 创建SSH防护配置
|
||||
cat <<EOF > /etc/fail2ban/jail.d/sshd.local
|
||||
[sshd]
|
||||
enabled = true
|
||||
mode = normal
|
||||
port = $NEW_SSH_PORT
|
||||
logpath = %(sshd_log)s
|
||||
backend = systemd
|
||||
maxretry = 5
|
||||
bantime = 1h
|
||||
findtime = 10m
|
||||
EOF
|
||||
|
||||
# 重启Fail2ban
|
||||
log "${YELLOW}重启Fail2ban服务...${NC}"
|
||||
systemctl restart fail2ban
|
||||
|
||||
# 等待服务启动完成
|
||||
log "${YELLOW}等待Fail2ban服务完全启动...${NC}"
|
||||
sleep 5
|
||||
|
||||
# 检查服务状态
|
||||
if systemctl is-active --quiet fail2ban; then
|
||||
log "${GREEN}Fail2ban服务已成功启动${NC}"
|
||||
|
||||
# 显示Fail2ban状态(使用错误处理避免脚本终止)
|
||||
log "${YELLOW}获取Fail2ban状态信息...${NC}"
|
||||
|
||||
# 尝试获取fail2ban状态,忽略可能的错误
|
||||
fail2ban-client status >/dev/null 2>&1 || log "${YELLOW}无法获取fail2ban综合状态,但这不影响功能${NC}"
|
||||
|
||||
# 尝试获取sshd监狱状态
|
||||
if fail2ban-client status sshd >/dev/null 2>&1; then
|
||||
log "${GREEN}SSH防护已成功配置${NC}"
|
||||
# 只有在前面成功的情况下才显示详细信息
|
||||
fail2ban-client status sshd
|
||||
else
|
||||
log "${YELLOW}无法获取SSH监狱状态,这可能是因为服务刚刚启动或配置需要更多时间生效${NC}"
|
||||
log "${YELLOW}如果在重启后仍有问题,请检查 /var/log/fail2ban.log${NC}"
|
||||
fi
|
||||
|
||||
# 显示服务状态
|
||||
systemctl status fail2ban --no-pager || true
|
||||
else
|
||||
log "${RED}Fail2ban服务启动失败,请检查错误日志${NC}"
|
||||
log "${YELLOW}尝试查看Fail2ban日志获取错误详情:${NC}"
|
||||
tail -n 20 /var/log/fail2ban.log 2>/dev/null || log "${RED}无法读取Fail2ban日志${NC}"
|
||||
fi
|
||||
|
||||
log "${GREEN}Fail2ban安装和配置完成${NC}"
|
||||
log "${YELLOW}如果出现临时错误,服务器重启后通常会正常工作${NC}"
|
||||
else
|
||||
log "${YELLOW}非Debian系统,请手动安装Fail2ban${NC}"
|
||||
fi
|
||||
|
||||
# ===========================================
|
||||
# 10. BBR加速配置
|
||||
# ===========================================
|
||||
log "${BLUE}[10/10] BBR配置开始...${NC}"
|
||||
|
||||
# 检查BBR是否已启用
|
||||
if sysctl net.ipv4.tcp_congestion_control | grep -q "bbr"; then
|
||||
log "${GREEN}BBR已经启用${NC}"
|
||||
else
|
||||
log "${YELLOW}配置BBR...${NC}"
|
||||
# 添加BBR配置
|
||||
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
|
||||
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
|
||||
|
||||
# 应用设置
|
||||
sysctl -p
|
||||
|
||||
# 验证设置
|
||||
if sysctl net.ipv4.tcp_congestion_control | grep -q "bbr"; then
|
||||
log "${GREEN}BBR启用成功${NC}"
|
||||
else
|
||||
log "${RED}BBR启用失败${NC}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 显示可用的拥塞控制算法
|
||||
log "${GREEN}当前系统支持的TCP拥塞控制算法:${NC}"
|
||||
sysctl net.ipv4.tcp_available_congestion_control
|
||||
|
||||
# 验证模块是否加载
|
||||
lsmod | grep bbr
|
||||
|
||||
# ===========================================
|
||||
# 完成处理
|
||||
# ===========================================
|
||||
END_TIME=$(date +%s)
|
||||
DURATION=$((END_TIME - START_TIME))
|
||||
MINUTES=$((DURATION / 60))
|
||||
SECONDS=$((DURATION % 60))
|
||||
|
||||
log "${GREEN}=======================================================${NC}"
|
||||
log "${GREEN}VPS初始化完成!用时: ${MINUTES}分${SECONDS}秒${NC}"
|
||||
log "${GREEN}=======================================================${NC}"
|
||||
log "${YELLOW}重要提示:${NC}"
|
||||
|
||||
# 根据用户选择显示相应的提示信息
|
||||
TIP_COUNT=1
|
||||
|
||||
# 如果用户选择了修改SSH端口,显示端口信息
|
||||
if [[ "$CHANGE_SSH_PORT" =~ ^[Yy]$ ]]; then
|
||||
log "${YELLOW}$TIP_COUNT. SSH端口已更改为: ${NEW_SSH_PORT}${NC}"
|
||||
TIP_COUNT=$((TIP_COUNT + 1))
|
||||
fi
|
||||
|
||||
# 如果用户选择了修改root密码,显示密码信息
|
||||
if [[ "$CHANGE_PASSWORD" =~ ^[Yy]$ ]]; then
|
||||
log "${YELLOW}$TIP_COUNT. root密码已更改为: ${NEW_PASSWORD}${NC}"
|
||||
TIP_COUNT=$((TIP_COUNT + 1))
|
||||
fi
|
||||
|
||||
# 如果用户选择了修改主机名,显示主机名信息
|
||||
if [ "$CHANGE_HOSTNAME_FLAG" = true ]; then
|
||||
log "${YELLOW}$TIP_COUNT. 主机名已更改为: ${NEW_HOSTNAME}${NC}"
|
||||
TIP_COUNT=$((TIP_COUNT + 1))
|
||||
fi
|
||||
|
||||
# 始终显示防火墙和日志文件信息
|
||||
log "${YELLOW}$TIP_COUNT. 防火墙已启用,只开放了必要端口${NC}"
|
||||
TIP_COUNT=$((TIP_COUNT + 1))
|
||||
log "${YELLOW}$TIP_COUNT. 日志文件保存在: ${LOG_FILE}${NC}"
|
||||
|
||||
# 如果已启用BBR,显示BBR信息
|
||||
if sysctl net.ipv4.tcp_congestion_control 2>/dev/null | grep -q "bbr"; then
|
||||
TIP_COUNT=$((TIP_COUNT + 1))
|
||||
log "${YELLOW}$TIP_COUNT. BBR加速已成功启用${NC}"
|
||||
fi
|
||||
|
||||
# 如果配置了交换空间,显示交换空间信息
|
||||
if [ "$CURRENT_SWAP_TOTAL" -gt "0" ]; then
|
||||
TIP_COUNT=$((TIP_COUNT + 1))
|
||||
log "${YELLOW}$TIP_COUNT. 交换空间大小: $(free -m | grep "Swap:" | awk '{print $2}')MB${NC}"
|
||||
fi
|
||||
|
||||
log "${GREEN}=======================================================${NC}"
|
||||
log "${BLUE}建议您现在重启服务器以应用所有更改${NC}"
|
||||
log "${GREEN}=======================================================${NC}"
|
||||
|
||||
# 提示用户是否立即重启
|
||||
while true; do
|
||||
read -p "是否立即重启服务器?(y/n, 默认n): " REBOOT_NOW
|
||||
# 设置默认值为否
|
||||
REBOOT_NOW=${REBOOT_NOW:-n}
|
||||
if [[ "$REBOOT_NOW" =~ ^[Yy]$ ]] || [[ "$REBOOT_NOW" =~ ^[Nn]$ ]]; then
|
||||
break
|
||||
else
|
||||
echo -e "${RED}无效的输入,请输入 y 或 n${NC}"
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "$REBOOT_NOW" =~ ^[Yy]$ ]]; then
|
||||
log "${GREEN}服务器将在5秒后重启...${NC}"
|
||||
sleep 5
|
||||
reboot
|
||||
else
|
||||
log "${YELLOW}请稍后手动重启服务器以应用所有更改${NC}"
|
||||
fi
|
||||
1935
init/xray-manager.sh
Normal file
1935
init/xray-manager.sh
Normal file
File diff suppressed because it is too large
Load Diff
50
install/01-Nginx.sh
Normal file
50
install/01-Nginx.sh
Normal file
@@ -0,0 +1,50 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 01-Nginx.sh && ./01-Nginx.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/01-Nginx.sh && chmod +x 01-Nginx.sh && ./01-Nginx.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=80
|
||||
port443=443
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y # 更新一下包
|
||||
|
||||
|
||||
# 2、创建 Nginx 安装目录
|
||||
mkdir -p /root/data/docker_data/Nginx
|
||||
cd /root/data/docker_data/Nginx
|
||||
|
||||
# 3、配置X-UI的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: '3.8'
|
||||
services:
|
||||
nginx:
|
||||
image: nginx
|
||||
container_name: nginx
|
||||
restart: always
|
||||
ports:
|
||||
- $port80:80
|
||||
- $port443:443
|
||||
volumes:
|
||||
- ./conf.d:/etc/nginx/conf.d
|
||||
- ./certs:/etc/nginx/certs
|
||||
- ./html:/var/www/html
|
||||
- ./log/nginx:/var/log/nginx
|
||||
EOF
|
||||
|
||||
# 4、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 5、打开防火墙的端口
|
||||
ufw allow $port80
|
||||
ufw allow $port443
|
||||
ufw status
|
||||
|
||||
# 打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "http://$ipv4_address:$port443"
|
||||
echo "------------------------"
|
||||
|
||||
51
install/02-NginxProxy.sh
Normal file
51
install/02-NginxProxy.sh
Normal file
@@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 02-NginxProxy.sh && ./02-NginxProxy.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/02-NginxProxy.sh && chmod +x 02-NginxProxy.sh && ./02-NginxProxy.sh
|
||||
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port=8020
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y # 更新一下包
|
||||
|
||||
|
||||
# 2、创建 Nginx Proxy 安装目录
|
||||
mkdir -p /root/data/docker_data/NginxProxy
|
||||
cd /root/data/docker_data/NginxProxy
|
||||
|
||||
|
||||
# 3、配置Nginx Proxy的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: '3.8'
|
||||
services:
|
||||
app:
|
||||
image: 'jc21/nginx-proxy-manager:latest'
|
||||
container_name: nginxproxy
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- '80:80'
|
||||
- '443:443'
|
||||
- '$port:81'
|
||||
volumes:
|
||||
- ./data:/data
|
||||
- ./letsencrypt:/etc/letsencrypt
|
||||
EOF
|
||||
|
||||
# 4、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 5、打开防火墙的端口
|
||||
ufw allow 80
|
||||
ufw allow 443
|
||||
ufw allow $port
|
||||
ufw status
|
||||
|
||||
# 打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port"
|
||||
echo "Email: admin@example.com"
|
||||
echo "Password: changeme"
|
||||
echo "------------------------"
|
||||
50
install/03-X-UI.sh
Normal file
50
install/03-X-UI.sh
Normal file
@@ -0,0 +1,50 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 03-X-UI.sh && ./03-X-UI.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/03-X-UI.sh && chmod +x 03-X-UI.sh && ./03-X-UI.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=54321
|
||||
port443=8030
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y # 更新一下包
|
||||
|
||||
|
||||
# 2、创建X-UI安装目录
|
||||
mkdir -p /root/data/docker_data/X-UI
|
||||
cd /root/data/docker_data/X-UI
|
||||
|
||||
# 3、配置X-UI的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: "3"
|
||||
services:
|
||||
x-ui:
|
||||
image: enwaiax/x-ui:alpha-zh
|
||||
container_name: x-ui
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./db/:/etc/x-ui/
|
||||
- ./cert/:/root/cert/
|
||||
network_mode: host
|
||||
stdin_open: true
|
||||
tty: true
|
||||
EOF
|
||||
|
||||
# 4、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 5、打开防火墙的端口
|
||||
ufw allow $port80
|
||||
ufw allow $port443
|
||||
ufw status
|
||||
|
||||
# 打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "Email: admin"
|
||||
echo "Password: admin"
|
||||
echo "注意面板URL根路径: /nSAsXv/"
|
||||
echo "------------------------"
|
||||
|
||||
75
install/04-FRP.sh
Normal file
75
install/04-FRP.sh
Normal file
@@ -0,0 +1,75 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 04-FRP.sh && ./04-FRP.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/04-FRP.sh && chmod +x 04-FRP.sh && ./04-FRP.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=8040
|
||||
port443=8041
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y # 更新一下包
|
||||
|
||||
|
||||
# 2、创建Frps安装目录
|
||||
mkdir -p /root/data/docker_data/Frps
|
||||
cd /root/data/docker_data/Frps
|
||||
|
||||
|
||||
# 3、配置Frps的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: '3.3'
|
||||
services:
|
||||
frps:
|
||||
image: snowdreamtech/frps
|
||||
container_name: frps
|
||||
restart: always
|
||||
network_mode: host
|
||||
volumes:
|
||||
- './frps.toml:/etc/frp/frps.toml'
|
||||
EOF
|
||||
|
||||
|
||||
# 4、创建frps.toml文件并设置配置
|
||||
cd /root/data/docker_data/Frps
|
||||
touch frps.toml
|
||||
|
||||
|
||||
# 5、配置 frps.toml
|
||||
cat <<EOF > frps.toml
|
||||
[common]
|
||||
|
||||
# frp 监听端口,与客户端绑定端口
|
||||
bind_port=$port443
|
||||
kcp_bind_port=$port443
|
||||
|
||||
# dashboard用户名
|
||||
dashboard_user=admin@gmail.com
|
||||
|
||||
# dashboard密码
|
||||
dashboard_pwd=gmail.com
|
||||
|
||||
# dashboard端口,启动成功后可通过浏览器访问如http://ip:9527
|
||||
dashboard_port=$port80
|
||||
|
||||
# 设置客户端token,对应客户端有页需要配置一定要记住,如果客户端不填写你连不上服务端
|
||||
token=PAioH8syP!82T%
|
||||
EOF
|
||||
|
||||
|
||||
# 6、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 7、打开防火墙的端口
|
||||
ufw allow $port80
|
||||
ufw allow $port443
|
||||
ufw status
|
||||
|
||||
|
||||
# 打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "Email: admin@gmail.com"
|
||||
echo "Password: gmail.com"
|
||||
echo "------------------------"
|
||||
69
install/05-ZeroTier.sh
Normal file
69
install/05-ZeroTier.sh
Normal file
@@ -0,0 +1,69 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 05-Zerotier.sh && ./05-Zerotier.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/05-Zerotier.sh && chmod +x 05-Zerotier.sh && ./05-Zerotier.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=8050
|
||||
port443=8051
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y # 更新一下包
|
||||
|
||||
|
||||
# 2、创建Zerotier安装目录
|
||||
mkdir -p /root/data/docker_data/Zerotier
|
||||
cd /root/data/docker_data/Zerotier
|
||||
|
||||
|
||||
# 3、配置Zerotier的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: '3.3'
|
||||
services:
|
||||
ztncui:
|
||||
image: keynetworks/ztncui
|
||||
container_name: ztncui
|
||||
restart: always
|
||||
ports:
|
||||
- $port80:4000
|
||||
environment:
|
||||
- HTTP_PORT=4000
|
||||
- HTTP_ALL_INTERFACES=yes
|
||||
- ZTNCUI_PASSWD=mrdoc.fun
|
||||
|
||||
zerotier-moon:
|
||||
image: jonnyan404/zerotier-moon
|
||||
container_name: zerotier-moon
|
||||
restart: always
|
||||
ports:
|
||||
- $port443:9993
|
||||
- $port443:9993/udp
|
||||
command: -4 192.168.1.1 # 改成服务器的IP
|
||||
volumes:
|
||||
- ./etc/ztconf/:/var/lib/zerotier-one
|
||||
EOF
|
||||
|
||||
|
||||
# 6、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 7、打开防火墙的端口
|
||||
ufw allow $port80
|
||||
ufw allow $port443
|
||||
ufw status
|
||||
|
||||
|
||||
# 打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "user: admin"
|
||||
echo "Password: mrdoc.fun"
|
||||
echo "------------------------"
|
||||
echo "查看moon ID:"
|
||||
echo "docker logs zerotier-moon"
|
||||
echo "------------------------"
|
||||
echo "Windows 客户端加入moon服务器:"
|
||||
echo "cd C:\ProgramData\ZeroTier\One:"
|
||||
echo "zerotier-cli orbit [moon_id] [moon_id]:"
|
||||
echo "------------------------"
|
||||
76
install/06-Rustdesk.sh
Normal file
76
install/06-Rustdesk.sh
Normal file
@@ -0,0 +1,76 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 06-Rustdesk.sh && ./06-Rustdesk.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/06-Rustdesk.sh && chmod +x 06-Rustdesk.sh && ./06-Rustdesk.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=8061
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y # 更新一下包
|
||||
|
||||
|
||||
# 2、创建 `Rustdesk` 安装目录
|
||||
mkdir -p /root/data/docker_data/Rustdesk
|
||||
cd /root/data/docker_data/Rustdesk
|
||||
|
||||
|
||||
# 3、配置Duplicati的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: '3'
|
||||
|
||||
networks:
|
||||
rustdesk-net:
|
||||
external: false
|
||||
|
||||
services:
|
||||
hbbs:
|
||||
container_name: hbbs
|
||||
ports:
|
||||
- 8060:21115
|
||||
- $port80:21116
|
||||
- $port80:21116/udp
|
||||
- 8063:21118
|
||||
image: rustdesk/rustdesk-server:latest
|
||||
command: hbbs -r rustdesk2.ghuang.top:8062 # hbbs.example.com改成
|
||||
volumes:
|
||||
- ./hbbs:/root
|
||||
networks:
|
||||
- rustdesk-net
|
||||
depends_on:
|
||||
- hbbr
|
||||
restart: unless-stopped
|
||||
|
||||
hbbr:
|
||||
container_name: hbbr
|
||||
ports:
|
||||
- 8062:21117
|
||||
- 8064:21119
|
||||
image: rustdesk/rustdesk-server:latest
|
||||
command: hbbr
|
||||
volumes:
|
||||
- ./hbbr:/root
|
||||
networks:
|
||||
- rustdesk-net
|
||||
restart: unless-stopped
|
||||
EOF
|
||||
|
||||
|
||||
# 6、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 7、打开防火墙的端口
|
||||
ufw allow 8060
|
||||
ufw allow 8061
|
||||
ufw allow 8062
|
||||
ufw allow 8063
|
||||
ufw allow 8064
|
||||
ufw allow 8061/udp
|
||||
ufw status
|
||||
|
||||
|
||||
# 打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "------------------------"
|
||||
51
install/07-Alist.sh
Normal file
51
install/07-Alist.sh
Normal file
@@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 07-Alist.sh && ./07-Alist.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/07-Alist.sh && chmod +x 07-Alist.sh && ./07-Alist.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=8070
|
||||
port443=8071
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y # 更新一下包
|
||||
|
||||
|
||||
# 2、创建Zerotier安装目录
|
||||
mkdir -p /root/data/docker_data/AList
|
||||
cd /root/data/docker_data/AList
|
||||
|
||||
|
||||
# 3、配置Duplicati的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: '3.3'
|
||||
services:
|
||||
alist:
|
||||
restart: always
|
||||
volumes:
|
||||
- ./data:/opt/alist/data
|
||||
ports:
|
||||
- $port80:5244
|
||||
environment:
|
||||
- PUID=0
|
||||
- PGID=0
|
||||
- UMASK=022
|
||||
container_name: alist
|
||||
image: xhofe/alist:latest
|
||||
EOF
|
||||
|
||||
|
||||
# 4、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 5、打开防火墙的端口
|
||||
ufw allow $port80
|
||||
ufw allow $port443
|
||||
ufw status
|
||||
|
||||
|
||||
# 6、打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "------------------------"
|
||||
53
install/08-Duplicati.sh
Normal file
53
install/08-Duplicati.sh
Normal file
@@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 08-Duplicati.sh && ./08-Duplicati.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/08-Duplicati.sh && chmod +x 08-Duplicati.sh && ./08-Duplicati.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=8080
|
||||
port443=8081
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y # 更新一下包
|
||||
|
||||
|
||||
# 2、创建Zerotier安装目录
|
||||
mkdir -p /root/data/docker_data/Duplicati
|
||||
cd /root/data/docker_data/Duplicati
|
||||
|
||||
|
||||
# 3、配置Duplicati的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: "2.1"
|
||||
services:
|
||||
duplicati:
|
||||
image: lscr.io/linuxserver/duplicati
|
||||
container_name: duplicati
|
||||
environment:
|
||||
- PUID=0
|
||||
- PGID=0
|
||||
- TZ=Asia/Shanghai
|
||||
volumes:
|
||||
- /root/data/docker_data/Duplicati/config:/config
|
||||
- /root/data/docker_data/Duplicati/backups:/backups
|
||||
- /root/data:/source
|
||||
ports:
|
||||
- $port80:8200
|
||||
restart: unless-stopped
|
||||
EOF
|
||||
|
||||
|
||||
# 4、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 5、打开防火墙的端口
|
||||
ufw allow $port80
|
||||
ufw allow $port443
|
||||
ufw status
|
||||
|
||||
|
||||
# 6、打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "------------------------"
|
||||
57
install/09-Syncthing.sh
Normal file
57
install/09-Syncthing.sh
Normal file
@@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 09-Syncthing.sh && ./09-Syncthing.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/09-Syncthing.sh && chmod +x 09-Syncthing.sh && ./09-Syncthing.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=8090
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y # 更新一下包
|
||||
|
||||
|
||||
# 2、创建Zerotier安装目录
|
||||
mkdir -p /root/data/docker_data/Syncthing
|
||||
cd /root/data/docker_data/Syncthing
|
||||
|
||||
|
||||
# 3、配置Duplicati的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: "3.5"
|
||||
services:
|
||||
syncthing:
|
||||
image: lscr.io/linuxserver/syncthing
|
||||
container_name: syncthing
|
||||
hostname: syncthing #optional
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=Asia/Shanghai
|
||||
volumes:
|
||||
- ./config:/config
|
||||
- ./Documents:/Documents
|
||||
- ./Media:/Media
|
||||
- ./Nextcloud:/Nextcloud
|
||||
ports:
|
||||
- 8090:8384
|
||||
- 8091:22000/tcp
|
||||
- 8091:22000/udp
|
||||
- 8092:21027/udp
|
||||
restart: unless-stopped
|
||||
EOF
|
||||
|
||||
|
||||
# 4、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 5、打开防火墙的端口
|
||||
ufw allow 8090
|
||||
ufw allow 8091
|
||||
ufw allow 8092
|
||||
ufw status
|
||||
|
||||
|
||||
# 6、打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "------------------------"
|
||||
59
install/10-Vaultwarden.sh
Normal file
59
install/10-Vaultwarden.sh
Normal file
@@ -0,0 +1,59 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 10-Vaultwarden.sh && ./10-Vaultwarden.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/10-Vaultwarden.sh && chmod +x 10-Vaultwarden.sh && ./10-Vaultwarden.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=8100
|
||||
port443=8101
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y
|
||||
|
||||
# 2、创建Vaultwarden安装目录
|
||||
mkdir -p /root/data/docker_data/Vaultwarden
|
||||
cd /root/data/docker_data/Vaultwarden
|
||||
|
||||
# 3、配置Vaultwarden的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: '3'
|
||||
services:
|
||||
vaultwarden:
|
||||
image: vaultwarden/server:latest
|
||||
container_name: vaultwarden
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./data/:/data/
|
||||
ports:
|
||||
- $port80:80
|
||||
environment:
|
||||
- DOMAIN=https://vaultwarden.ghuang.top # 这是您希望与您的Vaultwarden实例关联的域名。
|
||||
- LOGIN_RATELIMIT_MAX_BURST=10 # 允许在一阵登录/两步验证尝试中的最大请求次数。
|
||||
- LOGIN_RATELIMIT_SECONDS=60 # 这是来自同一IP的登录请求之间的平均秒数,在Vaultwarden限制登录次数之前。
|
||||
- ADMIN_RATELIMIT_MAX_BURST=10 # 这与LOGIN_RATELIMIT_MAX_BURST相同,只争对admin面板。
|
||||
- ADMIN_RATELIMIT_SECONDS=60 # 这与LOGIN_RATELIMIT_SECONDS相同
|
||||
- ADMIN_SESSION_LIFETIME=20 # 会话持续时间
|
||||
- ADMIN_TOKEN=FX6wU1n3i1huwVE9zo9zb6hGiX5fS5URTPhSWGK0pBu1weww0Kr0qcv6GbULX7az # 此值是Vaultwarden管理员面板的令牌(一种密码)。为了安全起见,这应该是一个长的随机字符串。如果未设置此值,则管理员面板将被禁用。建议openssl rand -base64 48 生成ADMIN_TOKEN确保安全
|
||||
- SENDS_ALLOWED=true # 此设置决定是否允许用户创建Bitwarden发送 - 一种凭证共享形式。
|
||||
- EMERGENCY_ACCESS_ALLOWED=true # 此设置控制用户是否可以启用紧急访问其账户的权限。例如,这样做可以在用户去世后,配偶可以访问密码库以获取账户凭证。可能的值:true / false。
|
||||
- WEB_VAULT_ENABLED=true # 此设置决定了网络保险库是否可访问。一旦您配置了您的账户和客户端,停止您的容器,然后将此值切换为false并重启Vaultwarden,可以用来防止未授权访问。可能的值:true/false。
|
||||
- SIGNUPS_ALLOWED=true # 此设置控制新用户是否可以在没有邀请的情况下注册账户。可能的值:true / false。
|
||||
EOF
|
||||
|
||||
|
||||
# 4、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 5、打开防火墙的端口
|
||||
ufw allow $port80
|
||||
ufw allow $port443
|
||||
ufw status
|
||||
|
||||
# 打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "注意事项:"
|
||||
echo "1、需要先创建账号才能使用"
|
||||
echo "2、需要将 IP:prot 反向代理成域名才能创建账户"
|
||||
echo "------------------------"
|
||||
52
install/11-EasyImage.sh
Normal file
52
install/11-EasyImage.sh
Normal file
@@ -0,0 +1,52 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 11-EasyImage.sh && ./11-EasyImage.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/11-EasyImage.sh && chmod +x 11-EasyImage.sh && ./11-EasyImage.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=8110
|
||||
port443=8111
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y
|
||||
|
||||
# 2、创建EasyImage安装目录
|
||||
mkdir -p /root/data/docker_data/EasyImage
|
||||
cd /root/data/docker_data/EasyImage
|
||||
|
||||
|
||||
# 3、配置EasyImage的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: '3.3'
|
||||
services:
|
||||
easyimage:
|
||||
image: ddsderek/easyimage:latest
|
||||
container_name: easyimage
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- $port80:80
|
||||
environment:
|
||||
- TZ=Asia/Shanghai
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
volumes:
|
||||
- './config:/app/web/config'
|
||||
- './i:/app/web/i'
|
||||
EOF
|
||||
|
||||
|
||||
# 4、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 5、打开防火墙的端口
|
||||
ufw allow $port80
|
||||
ufw allow $port433
|
||||
ufw status
|
||||
|
||||
# 打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "账号: admin"
|
||||
echo "密码: admin@123"
|
||||
echo "------------------------"
|
||||
85
install/12-Wordpress.sh
Normal file
85
install/12-Wordpress.sh
Normal file
@@ -0,0 +1,85 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 12-Wordpress.sh && ./12-Wordpress.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/12-Wordpress.sh && chmod +x 12-Wordpress.sh && ./12-Wordpress.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=8120
|
||||
port443=8121
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y #更新一下包
|
||||
|
||||
# 2、创建Wordpress安装目录
|
||||
mkdir -p /root/data/docker_data/Wordpress
|
||||
cd /root/data/docker_data/Wordpress
|
||||
|
||||
# 3、配置Wordpress的docker-compose
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: '3.0'
|
||||
services:
|
||||
db:
|
||||
image: mysql:5.7 # arm架构的机器请将mysql:5.7改为mysql:oracle
|
||||
container_name: wordpress-db
|
||||
restart: unless-stopped
|
||||
# command: --max-binlog-size=200M --expire-logs-days=2 # 使用mysql 8.0的小伙伴建议使用
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: password # 按需修改
|
||||
MYSQL_DATABASE: wordpress
|
||||
MYSQL_USER: wordpress
|
||||
MYSQL_PASSWORD: password # 按需修改
|
||||
volumes:
|
||||
- './db:/var/lib/mysql'
|
||||
networks:
|
||||
- default
|
||||
|
||||
app:
|
||||
image: wordpress:latest
|
||||
container_name: wordpress-app
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- $port80:80 # 按需修改。与防火墙开放端口一致。
|
||||
environment:
|
||||
WORDPRESS_DB_HOST: db
|
||||
WORDPRESS_DB_NAME: wordpress
|
||||
WORDPRESS_DB_USER: wordpress
|
||||
WORDPRESS_DB_PASSWORD: password # 按需修改
|
||||
WORDPRESS_LANG: zh_CN # 指定中文语言
|
||||
volumes:
|
||||
- './app:/var/www/html'
|
||||
links:
|
||||
- db:db
|
||||
depends_on:
|
||||
- redis
|
||||
- db
|
||||
networks:
|
||||
- default
|
||||
|
||||
redis:
|
||||
image: redis:alpine
|
||||
container_name: wordpress-redis
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./redis-data:/data
|
||||
networks:
|
||||
- default
|
||||
|
||||
#networks:
|
||||
# default:
|
||||
# name: wordpress
|
||||
EOF
|
||||
|
||||
# 4、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 5、打开防火墙的端口
|
||||
ufw allow $port80
|
||||
ufw allow $port433
|
||||
ufw status
|
||||
|
||||
# 打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "Email: admin@gmail.com"
|
||||
echo "------------------------"
|
||||
68
install/13-Nextcloud.sh
Normal file
68
install/13-Nextcloud.sh
Normal file
@@ -0,0 +1,68 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 13-Nextcloud.sh && ./13-Nextcloud.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/13-Nextcloud.sh && chmod +x 13-Nextcloud.sh && ./13-Nextcloud.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=8130
|
||||
port443=8131
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y #更新一下包
|
||||
|
||||
# 创建安装目录
|
||||
mkdir -p /root/data/docker_data/Nextcloud
|
||||
cd /root/data/docker_data/Nextcloud
|
||||
|
||||
# 3、填写docker-compose配置
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
nextcloud:
|
||||
container_name: nextcloud-app
|
||||
image: nextcloud:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- $port80:80
|
||||
environment:
|
||||
- MYSQL_HOST=mysql
|
||||
- MYSQL_DATABASE=nextcloud
|
||||
- MYSQL_USER=nextcloud
|
||||
- MYSQL_PASSWORD=nextcloud
|
||||
volumes:
|
||||
- ./data:/var/www/html
|
||||
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
container_name: nextcloud-db
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- MYSQL_DATABASE=nextcloud
|
||||
- MYSQL_USER=nextcloud
|
||||
- MYSQL_PASSWORD=nextcloud
|
||||
- MYSQL_ROOT_PASSWORD=nextcloud
|
||||
volumes:
|
||||
- ./db:/var/lib/mysql
|
||||
|
||||
#volumes:
|
||||
# mysql:
|
||||
# nextcloud:
|
||||
|
||||
EOF
|
||||
|
||||
# 4、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 5、打开防火墙的端口
|
||||
ufw allow $port80
|
||||
ufw allow $port433
|
||||
ufw status
|
||||
|
||||
# 打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "http://$ipv4_address:$port80"
|
||||
echo "Email: admin@gmail.com"
|
||||
echo "Password: gmail.com"
|
||||
echo "------------------------"
|
||||
67
install/14-Joplin.sh
Normal file
67
install/14-Joplin.sh
Normal file
@@ -0,0 +1,67 @@
|
||||
#!/bin/bash
|
||||
# chmod +x 14-Joplin.sh && ./14-Joplin.sh
|
||||
# curl -sS -O https://raw.githubusercontent.com/ghuang-top/vps/main/install/14-Joplin.sh && chmod +x 14-Joplin.sh && ./14-Joplin.sh
|
||||
|
||||
ipv4_address=$(curl -s ipv4.ip.sb)
|
||||
port80=8140
|
||||
port443=8141
|
||||
|
||||
|
||||
# 1、更新包
|
||||
apt update -y && apt upgrade -y #更新一下包
|
||||
|
||||
# 2、创建安装目录
|
||||
mkdir -p /root/data/docker_data/Joplin
|
||||
cd /root/data/docker_data/Joplin
|
||||
|
||||
# 3、填写docker-compose配置
|
||||
cat <<EOF > docker-compose.yml
|
||||
version: '3'
|
||||
services:
|
||||
db:
|
||||
image: postgres:13
|
||||
container_name: joplin-db
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "$port433:5432" # 左边的端口可以更换,右边不要动!
|
||||
volumes:
|
||||
- ./data/postgres:/var/lib/postgresql/data
|
||||
environment:
|
||||
- POSTGRES_PASSWORD=changeme # 改成你自己的密码
|
||||
- POSTGRES_USER=username # 改成你自己的用户名
|
||||
- POSTGRES_DB=joplin
|
||||
|
||||
app:
|
||||
image: joplin/server:latest
|
||||
container_name: joplin-app
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "$port80:22300" # 左边的端口可以更换,右边不要动!
|
||||
depends_on:
|
||||
- db
|
||||
environment:
|
||||
- APP_PORT=22300
|
||||
- APP_BASE_URL=https://joplin.ghuang.top # 改成反代的域名
|
||||
- DB_CLIENT=pg
|
||||
- POSTGRES_PASSWORD=changeme # 与上面的密码对应!
|
||||
- POSTGRES_USER=username # 与上面的用户名对应!
|
||||
- POSTGRES_DATABASE=joplin
|
||||
- POSTGRES_PORT=5432 # 与上面右边的对应!
|
||||
- POSTGRES_HOST=db
|
||||
EOF
|
||||
|
||||
# 4、安装
|
||||
docker-compose up -d
|
||||
|
||||
# 5、打开防火墙的端口
|
||||
ufw allow $port80
|
||||
ufw allow $port433
|
||||
ufw status
|
||||
|
||||
# 打印访问链接
|
||||
echo "------------------------"
|
||||
echo "访问链接:"
|
||||
echo "https://joplin.ghuang.top"
|
||||
echo "User: admin@localhost"
|
||||
echo "Password: admin"
|
||||
echo "------------------------"
|
||||
Reference in New Issue
Block a user