feat(cache): 引入 LRU 缓存并优化缓存清理与 TTL 处理 - 使用 github.com/hashicorp/golang-lru/v2 替代原生 sync.Map 实现 LRU 缓存 - 修复缓存读写过程中的并发安全问题,使用 RWMutex 保护共享状态 - 调整缓存键结构注释,明确支持 TTL 和 LRU 策略 - 优化负面缓存 TTL 计算逻辑,更准确识别 NODATA 场景 - 在缓存写入前统一剥离伪 RR(如 OPT、TSIG) - 增加 cache-size 命令行参数,支持配置 LRU 缓存最大条目数 - 移除旧的缓存清理协程中不必要的全量遍历逻辑 - 更新日志输出内容,包含 cache-size 配置项 ```
97 lines
2.3 KiB
Bash
97 lines
2.3 KiB
Bash
#!/usr/bin/env bash
|
|
#
|
|
# build.sh — Build & Run Helper for DNS-over-TLS Cache Proxy
|
|
# Author: niuyuling
|
|
# Email: aixiao@aixiao.me
|
|
# License: MIT
|
|
# -----------------------------------------------------------
|
|
# 用途:快速构建、运行和管理 dot 容器镜像。
|
|
# 用法:
|
|
# ./build.sh build 构建镜像
|
|
# ./build.sh run 启动容器(后台)
|
|
# ./build.sh logs 查看日志
|
|
# ./build.sh stop 停止容器
|
|
# ./build.sh clean 删除容器和镜像
|
|
# ./build.sh rebuild 重新构建镜像并启动
|
|
# -----------------------------------------------------------
|
|
|
|
set -e
|
|
|
|
IMAGE_NAME="dot"
|
|
CONTAINER_NAME="dot"
|
|
TAG="latest"
|
|
PORT="853"
|
|
CERT_FILE="jinllpay.com.cer"
|
|
KEY_FILE="jinllpay.com.key"
|
|
|
|
# ---------- 函数区 ----------
|
|
|
|
build() {
|
|
echo "🔨 Building Docker image: ${IMAGE_NAME}:${TAG} ..."
|
|
docker build -t "${IMAGE_NAME}:${TAG}" .
|
|
echo "✅ Build complete."
|
|
}
|
|
|
|
run() {
|
|
echo "🚀 Starting container ${CONTAINER_NAME}..."
|
|
|
|
# 确保旧容器不冲突
|
|
if docker ps -a --format '{{.Names}}' | grep -w "${CONTAINER_NAME}" >/dev/null 2>&1; then
|
|
echo "⚠️ Existing container found. Removing..."
|
|
docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 || true
|
|
fi
|
|
|
|
docker run -d \
|
|
--name "${CONTAINER_NAME}" \
|
|
--memory=256m \
|
|
--memory-swap=384m \
|
|
--memory-reservation=128m \
|
|
-p ${PORT}:853 \
|
|
-e CERT_FILE="/app/${CERT_FILE}" \
|
|
-e KEY_FILE="/app/${KEY_FILE}" \
|
|
-v "$(pwd)/${CERT_FILE}:/app/${CERT_FILE}:ro" \
|
|
-v "$(pwd)/${KEY_FILE}:/app/${KEY_FILE}:ro" \
|
|
"${IMAGE_NAME}:${TAG}"
|
|
|
|
echo "✅ Container started on port ${PORT}."
|
|
}
|
|
|
|
logs() {
|
|
echo "📜 Showing logs..."
|
|
docker logs -f "${CONTAINER_NAME}"
|
|
}
|
|
|
|
stop() {
|
|
echo "🛑 Stopping container..."
|
|
docker stop "${CONTAINER_NAME}" >/dev/null 2>&1 || true
|
|
docker rm "${CONTAINER_NAME}" >/dev/null 2>&1 || true
|
|
echo "✅ Container stopped and removed."
|
|
}
|
|
|
|
clean() {
|
|
stop
|
|
echo "🧹 Removing image ${IMAGE_NAME}:${TAG}..."
|
|
docker rmi "${IMAGE_NAME}:${TAG}" >/dev/null 2>&1 || true
|
|
echo "✅ Cleanup complete."
|
|
}
|
|
|
|
rebuild() {
|
|
clean
|
|
build
|
|
run
|
|
}
|
|
|
|
# ---------- 主逻辑 ----------
|
|
case "$1" in
|
|
build) build ;;
|
|
run) run ;;
|
|
logs) logs ;;
|
|
stop) stop ;;
|
|
clean) clean ;;
|
|
rebuild) rebuild ;;
|
|
*)
|
|
echo "Usage: ./build.sh [build|run|logs|stop|clean|rebuild]"
|
|
exit 1
|
|
;;
|
|
esac
|