feat: initial commit
This commit is contained in:
Executable
+90
@@ -0,0 +1,90 @@
|
||||
# IPCLOAKAPI 宝塔一键部署说明
|
||||
|
||||
## 适用场景
|
||||
|
||||
在一台宝塔服务器上**安装一次**,之后新建的 PHP 网站可通过钩子自动接入 Cloak 流量判定(需在后台绑定域名与配置)。
|
||||
|
||||
## 三步安装(客户向)
|
||||
|
||||
### 第 1 步:上传并执行安装脚本
|
||||
|
||||
1. 将整个项目上传到服务器(或通过 Git 拉取)。
|
||||
2. SSH 登录服务器,执行:
|
||||
|
||||
```bash
|
||||
cd /path/to/cloaka
|
||||
sudo bash deploy/baota/install_bt.sh
|
||||
```
|
||||
|
||||
3. 按提示输入**管理后台域名**(例如 `cloak-admin.你的域名.com`)。脚本会把程序安装到 `/www/cloaka`(可改 `--root`)。
|
||||
|
||||
### 第 2 步:完成 Web 安装向导
|
||||
|
||||
浏览器打开:
|
||||
|
||||
```text
|
||||
https://cloak-admin.你的域名.com/install.php
|
||||
```
|
||||
|
||||
填写 MySQL、后台密码、API 秘钥(CHECK_KEY),点击安装。
|
||||
|
||||
### 第 3 步:为每个业务站配置
|
||||
|
||||
对每个投流域名:
|
||||
|
||||
1. **先在宝塔**:网站 → 添加站点 → 填写域名 → 申请 **SSL**(必须)。
|
||||
2. **再在后台**:`dashboard.php` → **站点域名** → 添加相同域名。
|
||||
3. **新建或编辑配置** → **关联域名** 选择该域名 → 填写仿品/正品链接 → 保存。
|
||||
|
||||
> 未添加域名时,广告链接默认使用**当前访问后台的域名**。
|
||||
|
||||
## 新建宝塔网站时会发生什么
|
||||
|
||||
安装脚本会在 `/www/server/panel/hook/` 注册 `cloaka_post_site.sh`:
|
||||
|
||||
- 为新站点 Nginx 配置追加 Cloak 路由片段(请求走 `/www/cloaka/ip_check.php`)。
|
||||
- 尝试在数据库 `cloak_site_domains` 登记该域名(需已完成 install.php)。
|
||||
|
||||
## 手动绑定已有站点
|
||||
|
||||
编辑站点 Nginx 配置,在 `server { }` 内追加(注意修改 PHP 版本路径):
|
||||
|
||||
```nginx
|
||||
# BEGIN IPCLOAKAPI
|
||||
# 内容见 /www/cloaka/deploy/baota/nginx/cloaka-site.conf.installed
|
||||
# END IPCLOAKAPI
|
||||
```
|
||||
|
||||
或重新运行:
|
||||
|
||||
```bash
|
||||
sudo CLOAK_ROOT=/www/cloaka bash /www/cloaka/deploy/baota/hook/post_site.sh 站点域名 /www/wwwroot/站点域名
|
||||
```
|
||||
|
||||
## 升级
|
||||
|
||||
```bash
|
||||
sudo bash deploy/baota/install_bt.sh --upgrade --source /path/to/new/cloaka
|
||||
```
|
||||
|
||||
不会覆盖 `cong.php`、`.install.lock` 及 `check_config/*_config.php`。
|
||||
|
||||
## 目录说明
|
||||
|
||||
| 路径 | 说明 |
|
||||
|------|------|
|
||||
| `/www/cloaka` | 程序主目录(默认) |
|
||||
| `deploy/baota/nginx/cloaka-site.conf` | 业务站 Nginx 模板 |
|
||||
| `deploy/baota/nginx/cloaka-admin.conf` | 管理站 Nginx 补充 |
|
||||
| `deploy/baota/hook/post_site.sh` | 建站后钩子 |
|
||||
|
||||
## 常见问题
|
||||
|
||||
**Q:访问业务站 502?**
|
||||
检查 `cloaka-site.conf.installed` 中 PHP include 路径是否与站点 PHP 版本一致(安装脚本会按 82/83/81 检测)。
|
||||
|
||||
**Q:配置不生效?**
|
||||
确认后台已为该域名**关联配置**,且 `check_config/配置名_config.php` 存在。
|
||||
|
||||
**Q:广告链接域名不对?**
|
||||
在编辑配置中选择正确的「关联域名」;未选择时使用后台当前访问域名。
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
# 宝塔建站完成后钩子:为站点启用 Cloak 路由
|
||||
# 用法:post_site.sh <域名> <网站根目录>
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [[ -f /etc/cloaka.env ]]; then
|
||||
# shellcheck disable=SC1091
|
||||
source /etc/cloaka.env
|
||||
fi
|
||||
CLOAK_ROOT="${CLOAK_ROOT:-/www/cloaka}"
|
||||
|
||||
SITE_DOMAIN="${1:-}"
|
||||
SITE_PATH="${2:-}"
|
||||
MARK_BEGIN="# BEGIN IPCLOAKAPI"
|
||||
MARK_END="# END IPCLOAKAPI"
|
||||
|
||||
[[ -z "$SITE_DOMAIN" ]] && exit 0
|
||||
|
||||
VHOST="/www/server/panel/vhost/nginx/${SITE_DOMAIN}.conf"
|
||||
SNIPPET_INST="${CLOAK_ROOT}/deploy/baota/nginx/cloaka-site.conf.installed"
|
||||
|
||||
if [[ ! -f "$VHOST" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ ! -f "$SNIPPET_INST" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if ! grep -qF "$MARK_BEGIN" "$VHOST" 2>/dev/null; then
|
||||
{
|
||||
echo ""
|
||||
echo "$MARK_BEGIN"
|
||||
cat "$SNIPPET_INST"
|
||||
echo "$MARK_END"
|
||||
} >> "$VHOST"
|
||||
fi
|
||||
|
||||
if [[ -f "${CLOAK_ROOT}/cong.php" ]]; then
|
||||
php -r "
|
||||
require '${CLOAK_ROOT}/cong.php';
|
||||
require '${CLOAK_ROOT}/lib/Cloak/DomainRepository.php';
|
||||
try {
|
||||
\$pdo = DomainRepository::pdo();
|
||||
DomainRepository::ensureTable(\$pdo);
|
||||
\$host = DomainRepository::normalizeHostname('${SITE_DOMAIN}');
|
||||
if (!DomainRepository::findByHostname(\$pdo, \$host)) {
|
||||
DomainRepository::add(\$pdo, \$host);
|
||||
}
|
||||
} catch (Throwable \$e) {}
|
||||
" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
nginx -t 2>/dev/null && nginx -s reload 2>/dev/null || true
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
# 宝塔删站钩子(可选):不删除 check_config,仅清理 vhost 标记由面板完成
|
||||
|
||||
set -euo pipefail
|
||||
exit 0
|
||||
Executable
+131
@@ -0,0 +1,131 @@
|
||||
#!/bin/bash
|
||||
# IPCLOAKAPI 宝塔一键安装脚本
|
||||
# 用法:sudo bash install_bt.sh [--upgrade] [--source /path/to/cloaka]
|
||||
set -euo pipefail
|
||||
|
||||
UPGRADE=0
|
||||
SOURCE_DIR=""
|
||||
CLOAK_ROOT="/www/cloaka"
|
||||
ADMIN_DOMAIN=""
|
||||
PHP_VER="82"
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--upgrade) UPGRADE=1; shift ;;
|
||||
--source) SOURCE_DIR="${2:-}"; shift 2 ;;
|
||||
--root) CLOAK_ROOT="${2:-}"; shift 2 ;;
|
||||
*) echo "未知参数: $1"; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "$(id -u)" -ne 0 ]]; then
|
||||
echo "请使用 root 运行:sudo bash install_bt.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -d /www/server/panel ]]; then
|
||||
echo "未检测到宝塔面板目录 /www/server/panel"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
if [[ -z "$SOURCE_DIR" ]]; then
|
||||
SOURCE_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
fi
|
||||
|
||||
detect_php() {
|
||||
for v in 82 83 81 80 74; do
|
||||
if [[ -f "/www/server/php/${v}/etc/php.ini" ]]; then
|
||||
PHP_VER="$v"
|
||||
return
|
||||
fi
|
||||
done
|
||||
PHP_VER="82"
|
||||
}
|
||||
|
||||
detect_php
|
||||
PHP_INCLUDE="/www/server/nginx/conf/enable-php-${PHP_VER}.conf"
|
||||
if [[ ! -f "$PHP_INCLUDE" ]]; then
|
||||
PHP_INCLUDE="enable-php.conf"
|
||||
fi
|
||||
|
||||
echo "=== IPCLOAKAPI 宝塔安装 ==="
|
||||
echo "源码目录: $SOURCE_DIR"
|
||||
echo "安装目录: $CLOAK_ROOT"
|
||||
echo "PHP 版本: ${PHP_VER}"
|
||||
|
||||
if [[ "$UPGRADE" -eq 0 ]]; then
|
||||
read -r -p "管理后台域名(如 cloak-admin.example.com,可留空稍后手动建站): " ADMIN_DOMAIN
|
||||
fi
|
||||
|
||||
mkdir -p "$CLOAK_ROOT"
|
||||
if command -v rsync >/dev/null 2>&1; then
|
||||
rsync -a --delete \
|
||||
--exclude '.git' --exclude 'node_modules' --exclude '.cursor' \
|
||||
--exclude 'cong.php' --exclude '.install.lock' --exclude 'check_config/*_config.php' \
|
||||
"$SOURCE_DIR/" "$CLOAK_ROOT/"
|
||||
else
|
||||
cp -a "$SOURCE_DIR/." "$CLOAK_ROOT/"
|
||||
fi
|
||||
|
||||
chown -R www:www "$CLOAK_ROOT"
|
||||
chmod -R u=rwX,g=rX,o=rX "$CLOAK_ROOT"
|
||||
chmod -R u=rwX,g=rwX,o= "$CLOAK_ROOT/check_config" 2>/dev/null || mkdir -p "$CLOAK_ROOT/check_config" && chown www:www "$CLOAK_ROOT/check_config"
|
||||
touch "$CLOAK_ROOT/jump.txt" "$CLOAK_ROOT/nt.txt" "$CLOAK_ROOT/err.txt" 2>/dev/null || true
|
||||
chown www:www "$CLOAK_ROOT"/*.txt 2>/dev/null || true
|
||||
|
||||
# 注册建站钩子
|
||||
HOOK_DIR="/www/server/panel/hook"
|
||||
mkdir -p "$HOOK_DIR"
|
||||
install -m 755 "$SCRIPT_DIR/hook/post_site.sh" "$HOOK_DIR/cloaka_post_site.sh"
|
||||
install -m 755 "$SCRIPT_DIR/hook/post_site_del.sh" "$HOOK_DIR/cloaka_post_site_del.sh"
|
||||
|
||||
# 环境变量供钩子使用
|
||||
ENV_FILE="/etc/cloaka.env"
|
||||
echo "CLOAK_ROOT=${CLOAK_ROOT}" > "$ENV_FILE"
|
||||
chmod 644 "$ENV_FILE"
|
||||
|
||||
# 预处理 Nginx 片段
|
||||
SNIPPET_INST="${CLOAK_ROOT}/deploy/baota/nginx/cloaka-site.conf.installed"
|
||||
sed -e "s|__CLOAK_ROOT__|${CLOAK_ROOT}|g" -e "s|__PHP_INCLUDE__|${PHP_INCLUDE}|g" \
|
||||
"$SCRIPT_DIR/nginx/cloaka-site.conf" > "$SNIPPET_INST"
|
||||
|
||||
if [[ -n "$ADMIN_DOMAIN" && "$UPGRADE" -eq 0 ]]; then
|
||||
if command -v bt >/dev/null 2>&1; then
|
||||
echo "正在创建管理站点: $ADMIN_DOMAIN"
|
||||
bt site add "$ADMIN_DOMAIN" "$CLOAK_ROOT" 2>/dev/null || true
|
||||
fi
|
||||
ADMIN_VHOST="/www/server/panel/vhost/nginx/${ADMIN_DOMAIN}.conf"
|
||||
if [[ -f "$ADMIN_VHOST" ]] && ! grep -q 'cloaka-admin' "$ADMIN_VHOST" 2>/dev/null; then
|
||||
cat "$SCRIPT_DIR/nginx/cloaka-admin.conf" >> "$ADMIN_VHOST"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 确保域名表(已安装 cong 时)
|
||||
if [[ -f "$CLOAK_ROOT/cong.php" ]]; then
|
||||
php -r "
|
||||
require '${CLOAK_ROOT}/cong.php';
|
||||
require '${CLOAK_ROOT}/lib/Cloak/DomainRepository.php';
|
||||
\$pdo = DomainRepository::pdo();
|
||||
DomainRepository::ensureTable(\$pdo);
|
||||
echo 'cloak_site_domains OK\n';
|
||||
" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
nginx -t && nginx -s reload || true
|
||||
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo "安装文件已就绪。"
|
||||
if [[ ! -f "$CLOAK_ROOT/.install.lock" ]]; then
|
||||
if [[ -n "$ADMIN_DOMAIN" ]]; then
|
||||
echo "请浏览器访问: https://${ADMIN_DOMAIN}/install.php"
|
||||
else
|
||||
echo "请在宝塔新建站点,根目录指向: ${CLOAK_ROOT}"
|
||||
echo "然后访问: https://你的管理域名/install.php"
|
||||
fi
|
||||
else
|
||||
echo "已检测到安装锁,进入后台: ${ADMIN_DOMAIN:-你的管理域名}/dashboard.php"
|
||||
fi
|
||||
echo "新建业务站点后,请在后台「站点域名」添加域名并关联配置。"
|
||||
echo "============================================"
|
||||
Executable
+10
@@ -0,0 +1,10 @@
|
||||
# IPCLOAKAPI — 管理站点:不经过 ip_check 流量判定,直接走 PHP
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
try_files $uri =404;
|
||||
include enable-php.conf;
|
||||
}
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
# IPCLOAKAPI — 业务站点(占位符由 install_bt.sh / post_site.sh 替换)
|
||||
# __CLOAK_ROOT__ __PHP_INCLUDE__
|
||||
|
||||
location @cloaka_entry {
|
||||
include __PHP_INCLUDE__;
|
||||
fastcgi_param SCRIPT_FILENAME __CLOAK_ROOT__/ip_check.php;
|
||||
fastcgi_param SCRIPT_NAME /ip_check.php;
|
||||
fastcgi_param REQUEST_URI $request_uri;
|
||||
fastcgi_param QUERY_STRING $query_string;
|
||||
}
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ @cloaka_entry;
|
||||
}
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
/**
|
||||
* 可选:未使用 Nginx 集中路由时,将本站根目录 index.php 替换为本文件
|
||||
*/
|
||||
require '/www/cloaka/ip_check.php';
|
||||
Reference in New Issue
Block a user