jmalcloud/jc.sh
chenpei c26105b684 初始提交:JmalCloud公共空间版改造完成
- 改造为公共空间模式,所有用户共享文件
- 移除用户文件隔离机制
- 保持前端API兼容性
- 更新配置文件和文档
- 创建完整启动脚本工具链
2025-08-24 11:16:01 +08:00

336 lines
8.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#fonts color
Green="\033[32m"
Red="\033[31m"
Font="\033[0m"
#notification information
OK="${Green}[OK]${Font}"
Error="${Red}[错误]${Font}"
cur_path="$(pwd)"
cur_arg=$@
COMPOSE="docker-compose"
check_docker() {
docker --version &>/dev/null
if [ $? -ne 0 ]; then
echo -e "${Error} ${Red}未安装 Docker!${Font}"
exit 1
fi
if ! docker ps > /dev/null 2>&1; then
echo -e "${Error} ${Red}请确保您有操作docker的权限。${Font}"
exit 1
fi
docker-compose version &>/dev/null
if [ $? -ne 0 ]; then
docker compose version &>/dev/null
if [ $? -ne 0 ]; then
echo -e "${Error} ${Red}未安装 Docker-compose!${Font}"
exit 1
fi
COMPOSE="docker compose"
fi
if [[ -n $($COMPOSE version | grep -E "\sv*1") ]]; then
$COMPOSE version
echo -e "${Error} ${Red}Docker-compose 的版本太低了,请升级到 v2+!${Font}"
exit 1
fi
if [ ! -f docker-compose.yml ]; then
cp docker-compose.example.yml docker-compose.yml
fi
}
run_exec() {
local container=$1
local cmd=$2
local name="$(env_get CONTAINER_NAME_PREFIX)_$container"
if [ -z "$name" ]; then
echo -e "${Error} ${Red}没有找到 $container 容器!${Font}"
exit 1
fi
docker exec -it "$name" /bin/sh -c "$cmd"
}
judge() {
if [[ 0 -eq $? ]]; then
echo -e "${OK} ${Green}$1 完成${Font}"
sleep 1
else
echo -e "${Error} ${Red}$1 失败${Font}"
exit 1
fi
}
rand() {
local min=$1
local max=$(($2 - $min + 1))
local num=$(($RANDOM + 1000000000))
echo $(($num % $max + $min))
}
local_ipv4() {
local ip="127.0.0.1"
if [[ $(uname) == 'Linux' ]]; then
ip=$(ip a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | tr -d "addr:" | head -n 1)
fi
if [[ $(uname) == 'Darwin' ]]; then
ip=$(ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | tr -d "addr:" | head -n 1)
fi
echo "${ip%/*}"
}
env_get() {
local key=$1
local value=$(cat ${cur_path}/.env | grep "^$key=" | awk -F '=' '{print $2}')
echo "$value"
}
env_set() {
local key=$1
local val=$2
local exist=$(cat ${cur_path}/.env | grep "^$key=")
if [ -z "$exist" ]; then
echo "$key=$val" >>$cur_path/.env
else
if [[ $(uname) == 'Linux' ]]; then
sed -i "/^${key}=/c\\${key}=${val}" ${cur_path}/.env
fi
if [ $? -ne 0 ]; then
echo -e "${Error} ${Red}设置env参数失败!${Font}"
exit 1
fi
fi
}
arg_get() {
local find="n"
local value=""
for var in $cur_arg; do
if [[ "$find" == "y" ]]; then
if [[ ! $var =~ "--" ]]; then
value=$var
fi
break
fi
if [[ "--$1" == "$var" ]] || [[ "-$1" == "$var" ]]; then
find="y"
value="yes"
fi
done
echo $value
}
run_mongo() {
if [ "$1" = "dump" ]; then
# 备份数据库
mkdir -p ${cur_path}/docker/mongodb/backup
run_exec mongodb "mongodump -d jmalcloud -o /dump --gzip --quiet"
judge "备份数据库"
elif [ "$1" = "restore" ]; then
# 恢复数据库
run_exec mongodb "mongorestore --gzip --nsInclude=jmalcloud.* --dir /dump/jmalcloud --quiet"
judge "恢复数据库"
fi
}
help() {
echo "
Usage: install.sh COMMAND [OPTIONS]
Options:
--port 网盘端口,默认7070
--blog_port 博客端口,默认7071
--server_port 服务端口,默认7072(API地址: http://127.0.0.1:7072/public/api)
--prefix 容器名称前缀,默认为jmalcloud
Management Commands:
init,install 安装
uninstall 卸载
pull 拉取最新的的程序和镜像
update 更新
start 启动
stop 停止
restart 重启
mongo 执行容器 mongodb 容器内的命令 example: ./jc.sh mongo mongostat
nginx 执行容器 nginx 容器内的命令 example: ./jc.sh nginx nginx -v
dump 备份数据库
restore 恢复数据库
reinstall 卸载后再安装
reset-password 重置初始管理员的密码
"
}
env_init() {
env_set OFFICE_IMAGE_VERSION "8.0.1"
env_set APP_PORT 7070
env_set BLOG_PORT 7071
env_set SERVER_PORT 7072
env_set FTP_SERVER_PORT 7073
env_set CONTAINER_NAME_PREFIX "jmalcloud"
local file_ptah=$(cat ${cur_path}/.env | grep "^RESOURCE_DB_PATH=")
if [ -z "$file_ptah" ]; then
env_set RESOURCE_DB_PATH "$cur_path/docker/jmalcloud/mongodb"
fi
local db_ptah=$(cat ${cur_path}/.env | grep "^RESOURCE_FILE_PATH=")
if [ -z "$db_ptah" ]; then
env_set RESOURCE_FILE_PATH "$cur_path/docker/jmalcloud/files"
fi
}
before_start() {
[[ "$(arg_get port)" -gt 0 ]] && env_set APP_PORT "$(arg_get port)"
[[ "$(arg_get blog_port)" -gt 0 ]] && env_set BLOG_PORT "$(arg_get blog_port)"
[[ "$(arg_get server_port)" -gt 0 ]] && env_set SERVER_PORT "$(arg_get server_port)"
[[ "$(arg_get ftp_server_port)" -gt 0 ]] && env_set FTP_SERVER_PORT "$(arg_get ftp_server_port)"
[[ "$(arg_get prefix)" -gt 0 ]] && env_set CONTAINER_NAME_PREFIX "$(arg_get prefix)"
}
install() {
# 启动容器
before_start
$COMPOSE up -d
# 检测服务是否启动
check_run "安装"
}
uninstall() {
read -rp "确定要卸载(含:删除容器、所有文件、数据库、日志)吗?(y/n): " uninstall
[[ -z ${uninstall} ]] && uninstall="N"
case $uninstall in
[yY][eE][sS] | [yY])
echo -e "${Red} 开始卸载... ${Font}"
;;
*)
echo -e "${OK} ${Green} 终止卸载 ${Font}"
exit 2
;;
esac
$COMPOSE down
rm -rf "./docker"
echo -e "${OK} ${Green} 卸载完成 ${Font}"
}
check_run() {
spin=('\' '|' '/' '-')
server_url="http://$(local_ipv4):$(env_get BLOG_PORT)"
for ((i = 0; i <= 350; i++)); do
url_status=$(curl -s -m 5 -IL "$server_url" | grep 200)
if [ "$url_status" != "" ]; then
echo -ne " \r"
echo -e "${OK} ${Green}$1完成${Font}"
echo "网盘地址: http://$(local_ipv4):$(env_get APP_PORT)"
echo "博客地址: $server_url"
echo "API 地址: http://$(local_ipv4):$(env_get SERVER_PORT)/public/api"
break
else
echo -n "正在启动服务, 请稍等... ${spin[$((i % 4))]}"
echo -n -e \\r
sleep 0.2
fi
done
url_status=$(curl -s -m 5 -IL $server_url | grep 200)
if [ "$url_status" == "" ]; then
echo -e "${Error} ${Red}$1失败,反馈给开发者: https://github.com/jamebal/jmal-cloud-view/issues${Font}"
fi
}
pull() {
git fetch --all
git reset --hard origin/$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
git pull origin master
$COMPOSE pull
}
backup_and_install() {
local container_mongodb="$(env_get CONTAINER_NAME_PREFIX)_mongodb"
if docker ps --format '{{.Names}}' | grep -q "$container_mongodb"; then
run_mongo "dump"
run_exec nginx "nginx -s reload"
install
else
install
fi
}
reset_password() {
local container_server="$(env_get CONTAINER_NAME_PREFIX)_server"
echo -e "正在重置密码..."
docker restart "$container_server" > /dev/null 2>&1
run_exec mongodb "mongo jmalcloud --eval \"db.getCollection('user').update({ 'creator': true }, {\\\$set: { 'password': '1000:c5b705ea13a1221f5e59110947ed806f8a978e955fbd2ed6:22508de12228c34a235454a0caf3bcaa5552858543258e56' }}, { 'multi': false, 'upsert': false })\" > /dev/null 2>&1"
check_run "重置"
echo -e "${OK} ${Green}重置后的密码为:jmalcloud${Font}"
}
########################################################################################################
check_docker
env_init
if [ $# -gt 0 ]; then
if [[ "$1" == "init" ]] || [[ "$1" == "install" ]]; then
shift 1
install
elif [[ "$1" == "pull" ]]; then
shift 1
pull
elif [[ "$1" == "update" ]]; then
shift 1
backup_and_install
elif [[ "$1" == "uninstall" ]]; then
shift 1
uninstall
elif [[ "$1" == "reinstall" ]]; then
shift 1
uninstall
sleep 3
install
elif [[ "$1" == "reset-password" ]]; then
shift 1
reset_password
elif [[ "$1" == "port" ]]; then
shift 1
env_set APP_PORT "$1"
before_start
$COMPOSE up -d
check_run "修改"
elif [[ "$1" == "nginx" ]]; then
shift 1
e="$@" && run_exec nginx "$e"
elif [[ "$1" == "mongo" ]]; then
shift 1
e="$@" && run_exec mongodb "$e"
elif [[ "$1" == "dump" ]]; then
shift 1
run_mongo "dump"
elif [[ "$1" == "restore" ]]; then
shift 1
run_mongo "restore"
elif [[ "$1" == "start" ]]; then
shift 1
# 启动容器
before_start
$COMPOSE start "$@"
elif [[ "$1" == "stop" ]]; then
shift 1
$COMPOSE stop "$@"
elif [[ "$1" == "restart" ]]; then
shift 1
$COMPOSE stop "$@"
# 启动容器
before_start
$COMPOSE start "$@"
# 检测服务是否启动
check_run "启动"
else
if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]] || [[ "$1" == "man" ]]; then
help
else
echo "$1 is not a support parameter."
fi
fi
else
help
fi