diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..49c608e --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +# 网站对外端口(宿主机)。可用 manage.sh 菜单修改,也可手动改后重启。 +APP_PORT=8080 diff --git a/manage.sh b/manage.sh new file mode 100755 index 0000000..505fff7 --- /dev/null +++ b/manage.sh @@ -0,0 +1,224 @@ +#!/usr/bin/env bash +# 金牛集团贷款档案管理系统 - Docker 管理脚本(Ubuntu) +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$ROOT_DIR" + +ENV_FILE="$ROOT_DIR/.env" +COMPOSE=(docker compose) +CONTAINER_NAME="baota-archive" + +# ---------- 基础工具 ---------- +need_cmd() { + if ! command -v "$1" >/dev/null 2>&1; then + echo "缺少命令:$1" + echo "Ubuntu 可先安装:sudo apt update && sudo apt install -y docker.io docker-compose-v2" + exit 1 + fi +} + +ensure_env() { + if [[ ! -f "$ENV_FILE" ]]; then + cat > "$ENV_FILE" <<'EOF' +# 网站对外端口(宿主机) +APP_PORT=8080 +EOF + fi +} + +get_port() { + ensure_env + # shellcheck disable=SC1090 + source "$ENV_FILE" + echo "${APP_PORT:-8080}" +} + +set_port() { + local port="$1" + if ! [[ "$port" =~ ^[0-9]+$ ]] || (( port < 1 || port > 65535 )); then + echo "端口无效,请输入 1-65535 之间的数字。" + return 1 + fi + ensure_env + if grep -qE '^APP_PORT=' "$ENV_FILE"; then + sed -i.bak "s/^APP_PORT=.*/APP_PORT=${port}/" "$ENV_FILE" + rm -f "${ENV_FILE}.bak" + else + echo "APP_PORT=${port}" >> "$ENV_FILE" + fi + echo "已保存端口:${port}(写入 .env)" +} + +show_status() { + local port + port="$(get_port)" + echo "----------------------------------------" + echo "项目目录:$ROOT_DIR" + echo "当前端口:$port" + echo "访问地址:http://服务器IP:${port}" + echo "容器名称:$CONTAINER_NAME" + echo "----------------------------------------" + "${COMPOSE[@]}" ps || true +} + +pause() { + echo + read -r -p "按回车返回菜单..." _ +} + +# ---------- 功能 ---------- +do_start() { + local port + port="$(get_port)" + echo "正在构建并启动(端口 ${port})..." + APP_PORT="$port" "${COMPOSE[@]}" up -d --build + echo + echo "启动完成。访问:http://服务器IP:${port}" + echo "默认账号:admin / jinniu123(登录后请改密)" +} + +do_stop() { + echo "正在停止并移除容器..." + "${COMPOSE[@]}" down + echo "已停止。" +} + +do_restart() { + local port + port="$(get_port)" + echo "正在重启(端口 ${port})..." + APP_PORT="$port" "${COMPOSE[@]}" up -d --build + echo "重启完成。" +} + +do_logs() { + echo "查看日志(Ctrl+C 退出)..." + "${COMPOSE[@]}" logs -f --tail=200 +} + +do_change_port() { + local current new_port + current="$(get_port)" + echo "当前端口:${current}" + read -r -p "请输入新端口(例如 80 或 8080):" new_port + set_port "$new_port" || return 0 + echo + read -r -p "是否立即按新端口重启服务?[Y/n] " ans + ans="${ans:-Y}" + if [[ "$ans" =~ ^[Yy]$ ]]; then + do_restart + else + echo "已改端口,但未重启。下次启动会使用新端口。" + fi +} + +do_pull() { + if [[ ! -d "$ROOT_DIR/.git" ]]; then + echo "当前目录不是 git 仓库,无法 pull。" + return 0 + fi + echo "正在拉取代码更新..." + echo "提示:远程地址请用不带 .git 后缀的 URL(反代会拦截 .git)。" + git pull + echo + read -r -p "代码已更新,是否重新构建并启动?[Y/n] " ans + ans="${ans:-Y}" + if [[ "$ans" =~ ^[Yy]$ ]]; then + do_restart + fi +} + +do_help_cmds() { + local port + port="$(get_port)" + cat < .env + docker compose up -d --build + +拉代码更新: + git pull + docker compose up -d --build + +数据目录(勿删): + ${ROOT_DIR}/data # SQLite + JSON + ${ROOT_DIR}/uploads # 上传附件 + +====================================================== +EOF +} + +# ---------- 主菜单 ---------- +main() { + need_cmd docker + if ! docker compose version >/dev/null 2>&1; then + echo "未检测到 docker compose(v2)。" + echo "Ubuntu 可安装:sudo apt install -y docker-compose-v2" + exit 1 + fi + ensure_env + + while true; do + clear 2>/dev/null || true + local port + port="$(get_port)" + cat <