first commit

This commit is contained in:
root
2026-02-17 17:28:37 +08:00
commit 192078dc3b
52 changed files with 18158 additions and 0 deletions

View File

@@ -0,0 +1,182 @@
#!/usr/bin/env bash
set -euo pipefail
# openlist 一键安装脚本
# 用法示例curl -fsSL "https://pan.shumengya.top/d/scripts/openlist/install_openlist.sh" | bash
BASE_URL="https://pan.shumengya.top/d/scripts/openlist/openlist"
INSTALL_DIR="/shumengya/bin/openlist"
SERVICE_NAME="smy-openlist"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
log() { printf '[openlist-安装] %s\n' "$*" >&2; }
fail() { log "错误: $*" >&2; exit 1; }
# 进度条函数
show_progress() {
local pid=$1
local text=$2
local delay=0.1
local spin='-\|/'
printf "[openlist-安装] %s... " "$text" >&2
while ps -p "$pid" > /dev/null 2>&1; do
local temp=${spin#?}
printf "\b%c" "$spin" >&2
local spin=$temp${spin%"$temp"}
sleep $delay
done
printf "\b完成\n" >&2
}
check_port() {
# 检查端口占用并尝试清理
local port=5244
if lsof -i :$port >/dev/null 2>&1 || netstat -tunlp | grep -q ":$port "; then
log "检测到端口 $port 被占用,尝试清理..."
fuser -k -n tcp $port >/dev/null 2>&1 || true
sleep 1
if lsof -i :$port >/dev/null 2>&1; then
# 尝试查找占用进程并强制杀掉
local pid
pid=$(lsof -t -i:$port 2>/dev/null || true)
if [ -n "$pid" ]; then
kill -9 "$pid" 2>/dev/null || true
fi
fi
fi
}
require_root() {
# 必须使用 root 权限执行
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
fail "请使用 root 权限运行 (sudo bash install_openlist.sh)"
fi
}
detect_arch() {
# 自动检测 CPU 架构,选择对应二进制
local machine
machine=$(uname -m)
case "$machine" in
x86_64|amd64) echo "amd64" ;;
aarch64|arm64) echo "arm64" ;;
*) fail "不支持的架构: $machine" ;;
esac
}
download_files() {
# 下载对应架构的二进制包和 data 目录
local arch tmp_dir binary_url data_url
arch="$1"
tmp_dir=$(mktemp -d)
# 只在 tmp_dir 存在时清理
trap 'if [ -n "${tmp_dir:-}" ] && [ -d "$tmp_dir" ]; then rm -rf "$tmp_dir"; fi' EXIT
binary_url="${BASE_URL}/linux-${arch}.tar.gz"
data_url="${BASE_URL}/data.tgz"
# 后台下载并显示进度
curl -fsSL "$binary_url" -o "$tmp_dir/openlist.tar.gz" &
show_progress $! "正在下载 ${arch} 架构的二进制文件"
[ -f "$tmp_dir/openlist.tar.gz" ] || fail "下载二进制文件失败"
# 检查 data 目录是否已存在,如果存在则跳过下载
if [ -d "$INSTALL_DIR/data" ]; then
log "检测到已存在 data 目录,跳过下载以保护现有数据"
else
curl -fsSL "$data_url" -o "$tmp_dir/data.tgz" &
show_progress $! "正在下载 data 配置文件"
[ -f "$tmp_dir/data.tgz" ] || fail "下载 data 文件失败"
fi
echo "$tmp_dir"
}
install_binary_and_data() {
# 解压并安装二进制文件和 data 目录
local tmp_dir extracted_dir bin_path
tmp_dir="$1"
log "正在安装 openlist 到 $INSTALL_DIR..."
# 尝试停止服务
systemctl stop "$SERVICE_NAME" 2>/dev/null || true
# 检查并清理端口
check_port
mkdir -p "$INSTALL_DIR"
# 只在下载了 data.tgz 时才解压
if [ -f "$tmp_dir/data.tgz" ]; then
tar -xzf "$tmp_dir/data.tgz" -C "$INSTALL_DIR/" || fail "解压 data 目录失败"
else
log "保留现有 data 目录,不进行覆盖"
fi
# 解压二进制文件
extracted_dir=$(mktemp -d)
trap 'if [ -n "${tmp_dir:-}" ] && [ -d "$tmp_dir" ]; then rm -rf "$tmp_dir"; fi; if [ -n "${extracted_dir:-}" ] && [ -d "$extracted_dir" ]; then rm -rf "$extracted_dir"; fi' EXIT
tar -xzf "$tmp_dir/openlist.tar.gz" -C "$extracted_dir" || fail "解压二进制文件失败"
bin_path=$(find "$extracted_dir" -maxdepth 2 -type f -name "openlist" -perm -111 | head -n 1)
[ -n "$bin_path" ] || fail "未找到 openlist 可执行文件"
cp "$bin_path" "$INSTALL_DIR/openlist" || fail "复制可执行文件失败"
chmod +x "$INSTALL_DIR/openlist"
log "文件安装完成"
}
write_service() {
# 写入 systemd 服务文件,默认自启动并在失败时重启
log "正在配置 systemd 服务..."
cat > "$SERVICE_FILE" <<'EOF'
[Unit]
Description=openlist
After=network.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/shumengya/bin/openlist
ExecStart=/shumengya/bin/openlist/openlist server
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
}
enable_service() {
# 重新加载 systemd,设置开机自启并立即启动
log "正在启用并启动服务..."
systemctl daemon-reload
systemctl enable "$SERVICE_NAME"
systemctl restart "$SERVICE_NAME"
# 等待几秒钟以捕获立即崩溃的情况
sleep 3
}
main() {
require_root
local arch tmp_dir=""
arch=$(detect_arch)
log "检测到系统架构: $arch"
tmp_dir=$(download_files "$arch")
install_binary_and_data "$tmp_dir"
write_service
enable_service
log "=========================================="
log "安装完成! openlist 已安装到: $INSTALL_DIR"
log "服务已启动,查看状态: systemctl status $SERVICE_NAME"
# 检查服务状态
if ! systemctl is-active --quiet "$SERVICE_NAME"; then
log "警告: 服务未能正常启动"
journalctl -u "$SERVICE_NAME" --no-pager -n 20
fi
log "=========================================="
}
main "$@"

BIN
openlist/openlist/data.tgz Normal file

Binary file not shown.

View File

@@ -0,0 +1,145 @@
{
"force": false,
"site_url": "",
"cdn": "",
"jwt_secret": "J4l3vzgvqQPWy1yH",
"token_expires_in": 48,
"database": {
"type": "sqlite3",
"host": "",
"port": 0,
"user": "",
"password": "",
"name": "",
"db_file": "data/data.db",
"table_prefix": "x_",
"ssl_mode": "",
"dsn": ""
},
"meilisearch": {
"host": "http://localhost:7700",
"api_key": "",
"index": "openlist"
},
"scheme": {
"address": "0.0.0.0",
"http_port": 5244,
"https_port": -1,
"force_https": false,
"cert_file": "",
"key_file": "",
"unix_file": "",
"unix_file_perm": "",
"enable_h2c": false,
"enable_h3": false
},
"temp_dir": "data/temp",
"bleve_dir": "data/bleve",
"dist_dir": "",
"log": {
"enable": true,
"name": "data/log/log.log",
"max_size": 50,
"max_backups": 30,
"max_age": 28,
"compress": false,
"filter": {
"enable": false,
"filters": [
{
"cidr": "",
"path": "/ping",
"method": ""
},
{
"cidr": "",
"path": "",
"method": "HEAD"
},
{
"cidr": "",
"path": "/dav/",
"method": "PROPFIND"
}
]
}
},
"delayed_start": 0,
"max_buffer_limitMB": -1,
"mmap_thresholdMB": 4,
"max_connections": 0,
"max_concurrency": 64,
"tls_insecure_skip_verify": true,
"tasks": {
"download": {
"workers": 5,
"max_retry": 1,
"task_persistant": false
},
"transfer": {
"workers": 5,
"max_retry": 2,
"task_persistant": false
},
"upload": {
"workers": 5,
"max_retry": 0,
"task_persistant": false
},
"copy": {
"workers": 5,
"max_retry": 2,
"task_persistant": false
},
"move": {
"workers": 5,
"max_retry": 2,
"task_persistant": false
},
"decompress": {
"workers": 5,
"max_retry": 2,
"task_persistant": false
},
"decompress_upload": {
"workers": 5,
"max_retry": 2,
"task_persistant": false
},
"allow_retry_canceled": false
},
"cors": {
"allow_origins": [
"*"
],
"allow_methods": [
"*"
],
"allow_headers": [
"*"
]
},
"s3": {
"enable": false,
"port": 5246,
"ssl": false
},
"ftp": {
"enable": false,
"listen": ":5221",
"find_pasv_port_attempts": 50,
"active_transfer_port_non_20": false,
"idle_timeout": 900,
"connection_timeout": 30,
"disable_active_mode": false,
"default_transfer_binary": false,
"enable_active_conn_ip_check": true,
"enable_pasv_conn_ip_check": true
},
"sftp": {
"enable": false,
"listen": ":5222"
},
"last_launched_version": "refs/heads/main",
"proxy_address": ""
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,12 @@
[Unit]
Description=openlist
After=network.target
[Service]
Type=simple
WorkingDirectory=/shumengya/bin/openlist
ExecStart=/shumengya/bin/openlist/openlist server
Restart=on-failure
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,46 @@
#!/usr/bin/env bash
set -euo pipefail
# 恢复并启动 openlist 服务
# 该脚本用于在执行 stopkill 后恢复服务的正常运行和开机自启
# 用法curl -fsSL "https://pan.shumengya.top/d/scripts/openlist/start_openlist.sh" | sudo bash
SERVICE_NAME="smy-openlist"
log() { printf '[openlist-启动] %s\n' "$*" >&2; }
fail() { log "错误: $*" >&2; exit 1; }
# 检查 root 权限
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
fail "请使用 root 权限运行"
fi
log "正在检查服务状态..."
# 检查服务文件是否存在
if [ ! -f "/etc/systemd/system/${SERVICE_NAME}.service" ]; then
fail "未找到服务文件 /etc/systemd/system/${SERVICE_NAME}.service请先运行安装脚本。"
fi
log "正在恢复服务设置..."
# 重置可能的失败状态
systemctl reset-failed "$SERVICE_NAME" 2>/dev/null || true
log "正在启用并启动服务..."
# --now 选项会同时启用(enable)并启动(start)服务
systemctl enable --now "$SERVICE_NAME"
# 等待服务启动
sleep 2
# 检查启动状态
if systemctl is-active --quiet "$SERVICE_NAME"; then
log "服务启动成功!"
log "状态: $(systemctl is-active "$SERVICE_NAME")"
log "您可以访问 http://IP:5244 使用服务"
else
log "警告: 服务启动似乎遇到了问题"
log "以下是最后 10 行日志:"
systemctl status "$SERVICE_NAME" --no-pager -n 10 || true
exit 1
fi

View File

@@ -0,0 +1,70 @@
#!/usr/bin/env bash
set -euo pipefail
# 强制停止 openlist 服务并清理进程
# 用法curl -fsSL "https://pan.shumengya.top/d/scripts/openlist/stopkill_openlist.sh" | sudo bash
SERVICE_NAME="smy-openlist"
BIN_NAME="openlist"
PORT=5244
log() { printf '[openlist-停止] %s\n' "$*" >&2; }
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
log "请使用 root 权限运行"
exit 1
fi
log "正在停止 systemd 服务..."
# systemctl stop 会将服务状态置为 inactivesystemd 不会自动重启它,除非手动 start/restart
# 即使服务被 disablesystemctl restart 仍然可以启动它
systemctl disable --now "$SERVICE_NAME" 2>/dev/null || true
systemctl stop "$SERVICE_NAME" 2>/dev/null || true
log "正在检查残留进程..."
# 排除当前脚本自身的 PID防止误杀
current_pid=$$
# 按进程名强制杀 (使用 -x 精确匹配进程名,避免匹配到脚本自身)
pids=$(pgrep -x "$BIN_NAME" || true)
# 如果 -x 没找到,尝试 -f 但过滤掉脚本自身
if [ -z "$pids" ]; then
pids=$(pgrep -f "$BIN_NAME" | grep -v "$current_pid" || true)
fi
if [ -n "$pids" ]; then
log "发现残留进程 PID: $pids,正在强制终止..."
kill -9 $pids 2>/dev/null || true
fi
# 按端口强制杀
pid_port=""
if command -v lsof >/dev/null 2>&1; then
pid_port=$(lsof -t -i:$PORT 2>/dev/null || true)
elif command -v ss >/dev/null 2>&1; then
# ss 输出格式处理,提取 pid
pid_port=$(ss -lptn "sport = :$PORT" | grep -oE 'pid=[0-9]+' | cut -d= -f2 | sort -u || true)
elif command -v netstat >/dev/null 2>&1; then
pid_port=$(netstat -nlp | grep ":$PORT " | awk '{print $7}' | cut -d/ -f1 || true)
fi
if [ -n "$pid_port" ]; then
# 再次过滤掉当前 PID (虽然不太可能占用端口,但为了安全)
pid_port=$(echo "$pid_port" | grep -v "^$current_pid$")
if [ -n "$pid_port" ]; then
log "发现端口 $PORT 占用进程 PID: $pid_port,正在强制终止..."
kill -9 $pid_port 2>/dev/null || true
fi
fi
# 重置服务失败状态,避免 systemd 认为服务处于错误状态
systemctl reset-failed "$SERVICE_NAME" 2>/dev/null || true
# 最终状态检查
log "正在验证服务状态..."
if pgrep -x "$BIN_NAME" >/dev/null; then
log "警告: 进程仍在运行!"
ps -fp $(pgrep -x "$BIN_NAME")
else
log "openlist 已完全停止 (服务已禁用,进程已清理)。"
fi

View File

@@ -0,0 +1,104 @@
#!/usr/bin/env bash
set -euo pipefail
# openlist 一键卸载脚本
# 用法sudo bash uninstall_openlist.sh
INSTALL_DIR="/shumengya/bin/openlist"
SERVICE_NAME="smy-openlist"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
log() { printf '[openlist-卸载] %s\n' "$*" >&2; }
fail() { log "错误: $*" >&2; exit 1; }
# 进度条函数
show_progress() {
local pid=$1
local text=$2
local delay=0.1
local spin='-\|/'
printf "[openlist-卸载] %s... " "$text" >&2
while ps -p "$pid" > /dev/null 2>&1; do
local temp=${spin#?}
printf "\b%c" "$spin" >&2
local spin=$temp${spin%"$temp"}
sleep $delay
done
printf "\b完成\n" >&2
}
require_root() {
# 必须使用 root 权限执行
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
fail "请使用 root 权限运行 (sudo bash uninstall_openlist.sh)"
fi
}
stop_and_disable_service() {
# 停止并禁用 systemd 服务
if systemctl is-active --quiet "$SERVICE_NAME"; then
log "正在停止服务 $SERVICE_NAME..."
systemctl stop "$SERVICE_NAME"
fi
if systemctl is-enabled --quiet "$SERVICE_NAME" 2>/dev/null; then
log "正在禁用服务 $SERVICE_NAME..."
systemctl disable "$SERVICE_NAME"
fi
}
remove_service_file() {
# 删除 systemd 服务文件
if [ -f "$SERVICE_FILE" ]; then
log "正在删除服务文件..."
rm -f "$SERVICE_FILE"
systemctl daemon-reload
fi
}
remove_install_dir() {
# 删除安装目录
if [ -d "$INSTALL_DIR" ]; then
log "正在删除安装目录 $INSTALL_DIR..."
rm -rf "$INSTALL_DIR"
fi
}
check_and_kill_port() {
local port=5244
if lsof -i :$port >/dev/null 2>&1 || netstat -tunlp | grep -q ":$port "; then
log "检测到端口 $port 仍被占用,尝试强制清理..."
fuser -k -n tcp $port >/dev/null 2>&1 || true
sleep 1
# 二次检查
local pid
pid=$(lsof -t -i:$port 2>/dev/null || true)
if [ -n "$pid" ]; then
kill -9 "$pid" 2>/dev/null || true
fi
fi
}
main() {
require_root
log "开始卸载 openlist..."
(stop_and_disable_service) &
show_progress $! "正在停止服务"
(remove_service_file) &
show_progress $! "正在删除服务文件"
check_and_kill_port
(remove_install_dir) &
show_progress $! "正在删除安装目录"
log "=========================================="
log "卸载完成! openlist 已从系统中移除"
log "=========================================="
}
main "$@"