Files
BeacherZ 2c61b727cb feat: 项目改名为 dailycheckin-plus,README 补 docker run 用法,通知标题带项目名
- 品牌字串全面更换:README / compose / Dockerfile / entrypoint / 面板页面 / CI。
  镜像名变为 ghcr.io/beacherz/dailycheckin-plus:latest;compose 里的服务名与
  container_name 保持 dailycheckin 不动 —— 改了会变成新旧两个容器同时跑,通知收两条。
- 通知标题带上项目名:NOTICE_TITLE 与 main.py 的标题都改用 PROJECT_NAME,
  实际发出来是「【dailycheckin-plus 每日签到 · 日期】」;企业微信卡片署名同步。
  这两处仍在 patches/0002 里,已重新生成并验证「重放后与工作区逐字节一致」。
- 面板:默认 PANEL_TITLE 改为 dailycheckin-plus,浏览器标签页与顶栏品牌跟着走
  (顺手把顶栏一直没被填充的面板版本/引擎状态补上);HTTP Server 头改为
  dailycheckin-plus-panel/2.1.0。
- crontab 托管标记改为 dailycheckin-plus managed,但**仍兼容老标记**并在保存时
  升级;crontab 里若存在裸的签到行,首次保存会整行注释留档后再接管,避免和新任务
  并存导致一天跑两遍、通知收两条。新增 tools/test_schedule.py(27 项断言)锁这条行为。
- README:快速开始拆成 docker compose / docker run 两种方式(含 Windows 路径写法和
  docker run 的升级步骤),更新通知样例、环境变量表、目录结构与常见问题。
- Dockerfile 增加「面板品牌自检」,装进镜像的网页必须是改名后的版本。
2026-10-15 20:54:00 -07:00

50 lines
1.8 KiB
Python

"""运行时路径与配置项。"""
from __future__ import annotations
import os
def _env(name: str, default: str) -> str:
value = os.environ.get(name, "")
return value.strip() if value and value.strip() else default
# 容器内工作目录,引擎按 `./config/config.json` 找配置,必须保持一致
# 本地直接 `python -m panel` 时(仓库根目录就是工作目录),自动回落到当前目录
_DEFAULT_HOME = "/dailycheckin"
if not os.path.isdir(_DEFAULT_HOME) and os.path.isdir(os.path.join(os.getcwd(), "panel")):
_DEFAULT_HOME = os.getcwd()
HOME = _env("DC_HOME", _DEFAULT_HOME)
CONFIG_PATH = _env("DC_CONFIG_PATH", os.path.join(HOME, "config", "config.json"))
CRON_PATH = _env("DC_CRON_PATH", os.path.join(HOME, "cron", "crontab_list.sh"))
LOG_DIR = _env("DC_LOG_DIR", os.path.join(HOME, "logs"))
DATA_DIR = _env("DC_DATA_DIR", os.path.join(HOME, "data"))
STATIC_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "static")
STATUS_PATH = os.path.join(DATA_DIR, "panel_status.json")
RUNS_PATH = os.path.join(DATA_DIR, "panel_runs.json")
AUTH_PATH = os.path.join(DATA_DIR, "panel_auth.json")
BACKUP_DIR = os.path.join(DATA_DIR, "backups")
HOST = _env("PANEL_HOST", "0.0.0.0")
PORT = int(_env("PANEL_PORT", "8080"))
# 可选:给脚本 / 自动化用的静态口令。留空就只走「账号密码登录」,这是默认。
TOKEN = _env("PANEL_TOKEN", "")
# 页面标题(浏览器标签 + 顶栏品牌名)。想换成自己的叫法就设 PANEL_TITLE。
TITLE = _env("PANEL_TITLE", "dailycheckin-plus")
TZ = _env("TZ", "Asia/Shanghai")
MAX_BACKUPS = 30
MAX_RUNS = 20
RUN_TIMEOUT = int(_env("PANEL_RUN_TIMEOUT", "1800"))
def ensure_dirs() -> None:
for path in (os.path.dirname(CONFIG_PATH), LOG_DIR, DATA_DIR, BACKUP_DIR):
if path:
os.makedirs(path, exist_ok=True)