From 663143a30a197bbc90db6fd8311cef9d6e94dee3 Mon Sep 17 00:00:00 2001 From: admin <572701190@qq.com> Date: Mon, 18 May 2026 23:47:24 +0800 Subject: [PATCH] publish reactive resume install packages --- README.md | 8 ++ dist/SHA256SUMS | 6 + ...ctive-resume-clean-install-20260518.tar.gz | Bin 0 -> 3496 bytes ...reactive-resume-clean-install-20260518.zip | Bin 0 -> 5491 bytes ...ctive-resume-isiseg-direct-20260518.tar.gz | Bin 0 -> 2180 bytes ...reactive-resume-isiseg-direct-20260518.zip | Bin 0 -> 3094 bytes ...ive-resume-qnap-nas-isiseg-20260518.tar.gz | Bin 0 -> 2199 bytes ...active-resume-qnap-nas-isiseg-20260518.zip | Bin 0 -> 2770 bytes .../.env.example | 59 +++++++++ .../reactive-resume-clean-install/README.md | 38 ++++++ .../compose-Nas.yml | 97 ++++++++++++++ .../reactive-resume-clean-install/compose.yml | 72 +++++++++++ .../reactive-resume-clean-install/frpc.yaml | 22 ++++ packages/reactive-resume-isiseg-direct/.env | 50 ++++++++ .../reactive-resume-isiseg-direct/README.md | 35 ++++++ .../reactive-resume-isiseg-direct/compose.yml | 66 ++++++++++ .../reactive-resume-isiseg-direct/frpc.yaml | 17 +++ .../reactive-resume-qnap-nas-isiseg/README.md | 31 +++++ .../compose-Nas.yml | 119 ++++++++++++++++++ 19 files changed, 620 insertions(+) create mode 100644 dist/SHA256SUMS create mode 100644 dist/reactive-resume-clean-install-20260518.tar.gz create mode 100644 dist/reactive-resume-clean-install-20260518.zip create mode 100644 dist/reactive-resume-isiseg-direct-20260518.tar.gz create mode 100644 dist/reactive-resume-isiseg-direct-20260518.zip create mode 100644 dist/reactive-resume-qnap-nas-isiseg-20260518.tar.gz create mode 100644 dist/reactive-resume-qnap-nas-isiseg-20260518.zip create mode 100644 packages/reactive-resume-clean-install/.env.example create mode 100644 packages/reactive-resume-clean-install/README.md create mode 100644 packages/reactive-resume-clean-install/compose-Nas.yml create mode 100644 packages/reactive-resume-clean-install/compose.yml create mode 100644 packages/reactive-resume-clean-install/frpc.yaml create mode 100644 packages/reactive-resume-isiseg-direct/.env create mode 100644 packages/reactive-resume-isiseg-direct/README.md create mode 100644 packages/reactive-resume-isiseg-direct/compose.yml create mode 100644 packages/reactive-resume-isiseg-direct/frpc.yaml create mode 100644 packages/reactive-resume-qnap-nas-isiseg/README.md create mode 100644 packages/reactive-resume-qnap-nas-isiseg/compose-Nas.yml diff --git a/README.md b/README.md index 2a48541..8560225 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,14 @@ - `生成简历/backups/`: 每次线上 `resume` 被替换前导出的历史版本备份。 - `生成简历/visual-assets/`: 图文并茂版简历使用的轻量展示图。 - `reactive_resume_data`: Reactive Resume 本地上传文件持久化 Docker 命名卷。 +- `packages/`: 三套可读可改的安装包目录。 +- `dist/`: 三套安装包的 `.tar.gz` / `.zip` 发布归档和 `SHA256SUMS`。 + +## 安装包 + +- `reactive-resume-clean-install-20260518`: 纯净迁移模板,域名、端口、FRP、密钥均为待填写占位。 +- `reactive-resume-isiseg-direct-20260518`: 服务器直接运行版,预置 `https://isiseg.huijutec.cn` 和 FRP `remotePort = 10004`。 +- `reactive-resume-qnap-nas-isiseg-20260518`: 威联通 QNAP NAS 直接部署版,预置 `/share/Container/Reactive_Resume_Isiseg`、本地端口 `3004` 和 FRP `10004`。 ## 启动 diff --git a/dist/SHA256SUMS b/dist/SHA256SUMS new file mode 100644 index 0000000..e51b931 --- /dev/null +++ b/dist/SHA256SUMS @@ -0,0 +1,6 @@ +f9daa11eeb735e1920d822094a7caf3f7eebcccf8467755bb6f904c68a53bdbf reactive-resume-clean-install-20260518.tar.gz +54bf5114e8ca9f29ae1feb0510f738396f354174f691bf96e863b41058742a58 reactive-resume-clean-install-20260518.zip +86bef4916fe9df7db170f65ddf421030cd23d351bc5ba6ec7132aa3e4abe28da reactive-resume-isiseg-direct-20260518.tar.gz +c31229536989cd168bf812f75454adcd2d17ab63b46a6d9a958be0af2a1450ea reactive-resume-isiseg-direct-20260518.zip +58ae9ef624aeec71ef27127540eaa42326169492cf19429cc2d1035d14844783 reactive-resume-qnap-nas-isiseg-20260518.tar.gz +1c870641e2e79d68bc59152eecb60bc5836cd27f62b0b0046ee36ee7861c3b8d reactive-resume-qnap-nas-isiseg-20260518.zip diff --git a/dist/reactive-resume-clean-install-20260518.tar.gz b/dist/reactive-resume-clean-install-20260518.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..16632fdf2fa0e2987426130c44647df04f27fe1b GIT binary patch literal 3496 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 W@W2BPJn-Nd!v6rWo{G@`PyhhE($!D^ literal 0 HcmV?d00001 diff --git a/dist/reactive-resume-clean-install-20260518.zip b/dist/reactive-resume-clean-install-20260518.zip new file mode 100644 index 0000000000000000000000000000000000000000..ce53a3b10993738f9b77832b9d4aaf2992788281 GIT binary patch literal 5491 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 BdW`@8 literal 0 HcmV?d00001 diff --git a/dist/reactive-resume-isiseg-direct-20260518.tar.gz b/dist/reactive-resume-isiseg-direct-20260518.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..843adaadec54164728f1ac67afd88386aa011754 GIT binary patch literal 2180 zcmV-~2z&P*iwFP!000001MOJDL&!po_F#k-9j>S))*h};B2>L(Izb5u@4jqmHiZZdWqDt7zQ3wGL ztR=%8Bc%4kC78I+q*GzB+gCO0NPz=UwQ^{nb+KuNO-t|hvFymOwxSxk*29|RE`?C7 z$~PA3EH9Mia_F`9e2)MNjm8zllqUBlKz-B|WbcH<_1z+rW;*tI%R2TRMIjs+pfp?5;X#Zs6* z%a+TbH&Cd*B&a3?UtUGw=9E_`EKfuu^z-p*s%AlI#BL7JG1If4_OLzxBT0{AV9QX! zM^K_DG@0cu6Zg!fD@8* zO;#-xRM5B*1UIv*M`n3{{yY04gh=8;Z}=ISF5@64Jn^hxOX{3@y<=JZTr^5E=|~Lz zXeTt_t{QcB@cQY9)xp}SQ^skOKZE*)4kc?w@FmqcWkmF4^fMGg0D{w}Ba%o~JT+NRbIjr<#Q$2sC;!DCj5X4xodGbg7P<7U zHHct&5RpJaS%#>Yr2o6v)w@M~pjmFKfKo85HWsah*HgkYML}b_q`FuSBlmz3Ivl6& z`@vf66BSG9yU$%+61!Y&dX`V@Iz<}kxZm`23%g93K=L`u=SNRR*MFTYlor`YPktdA z$J9TaW)hS254>6ZzY02u>SF}JfFJ<52#9nB>bnCAOHjmUc<1lCH}8#}ZjA1(*<05~ zUtY71X!6Phe<&_qXBpt=+Zjs71~yCLC6#S7{;pw`*v=UPG;eYD0Oq+*)Yw zPgjRew!VM7X5V_SvwhFryl+4Goqc_McXQpoao7Ir{?0#c`1kRzD<4qQ$&<+5cwpbS zPf@K_t1X%xO4g-iY@qSY6@?Y#yTqbF9}d+-m!jN>_QuWcAAe3!VYIvX&FJj)N&)`dVOo%-uP%|`^(|RuSQ?Lzxyo&V?v+A>+`FqvZQL4Pz_q@ zDq0jZICmK+8klcC`grf!x)XdS5GB1Qsv4?5<28v-hx@|AxwnTspB?XXXqku~^!u*ZetZRzMQrkA61cVN!AXcZ!g|sj{E)-PbVk(e=147 z|IPaUf1es}=L@DPM){7YEp|hTXg1CYJX@@@jeHg>aKedU z9H&!C7XC2_x-CnYgp!mMQHFJsj6%n=?L;P%i9uMh2?pa7EobOh1gyX zIX1u`7!$b4eAUk^U4VUXMbBUzHeP3o4dEkB{ez8$=B;%oj@?<9MJ~v(Dxfv1?+Aj|+ujk>z=kL?=qXabx2X zINUnB0CC6<%rF*B3$9*hP78O>-$Gn&ziW;CN2&1goikp2y>ZEdvx GC;$MKB0ls0 literal 0 HcmV?d00001 diff --git a/dist/reactive-resume-isiseg-direct-20260518.zip b/dist/reactive-resume-isiseg-direct-20260518.zip new file mode 100644 index 0000000000000000000000000000000000000000..10c9e2a879e43e7e5f13240d63a66aeb99ee924c GIT binary patch literal 3094 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 +SMTP_SECURE=false +S3_ACCESS_KEY_ID= +S3_SECRET_ACCESS_KEY= +S3_REGION=us-east-1 +S3_ENDPOINT= +S3_BUCKET= +S3_FORCE_PATH_STYLE=false +REDIS_URL= +CLOUDFLARE_ACCOUNT_ID= +CLOUDFLARE_API_TOKEN= +FLAG_DISABLE_SIGNUPS=false +FLAG_DISABLE_EMAIL_AUTH=false +FLAG_DISABLE_IMAGE_PROCESSING=false +FLAG_ALLOW_UNSAFE_AI_BASE_URL=false diff --git a/packages/reactive-resume-clean-install/README.md b/packages/reactive-resume-clean-install/README.md new file mode 100644 index 0000000..7cf2a1c --- /dev/null +++ b/packages/reactive-resume-clean-install/README.md @@ -0,0 +1,38 @@ +# Reactive Resume 纯净迁移安装包 + +这是一套不绑定具体域名、端口、FRP 服务器或密码的纯净安装包,适合迁移到新服务器或新 NAS 前作为模板使用。 + +## 文件说明 + +- `compose.yml`:通用 Linux / Docker Compose 部署版 +- `compose-Nas.yml`:威联通 QNAP QTS / Container Station 部署模板 +- `frpc.yaml`:通用服务器版 frpc 配置模板 +- `.env.example`:通用服务器版环境变量模板 + +## 通用服务器部署 + +1. 复制环境变量文件: + + ```bash + cp .env.example .env + ``` + +2. 编辑 `.env` 和 `frpc.yaml`,把所有 `CHANGE_ME` / `YOUR_*` 改成真实值。 + +3. 启动: + + ```bash + docker compose -f compose.yml up -d + ``` + +## QNAP NAS 部署 + +1. 编辑 `compose-Nas.yml` 顶部注释中的路径、域名、端口、FRP 服务器等待填写项。 +2. 在 QTS Container Station 中导入 `compose-Nas.yml`。 +3. 启动后,确认 app 和 frpc 都为 healthy / running。 + +## 注意 + +- `AUTH_SECRET` 和 `ENCRYPTION_SECRET` 必须使用长期固定值,迁移后不要随意更换。 +- `APP_URL` 必须与反向代理对外访问域名一致,例如 `https://resume.example.com`。 +- FRP 的 `remotePort` 需要与公网服务器 Nginx Proxy Manager / 反向代理转发端口一致。 diff --git a/packages/reactive-resume-clean-install/compose-Nas.yml b/packages/reactive-resume-clean-install/compose-Nas.yml new file mode 100644 index 0000000..df51d02 --- /dev/null +++ b/packages/reactive-resume-clean-install/compose-Nas.yml @@ -0,0 +1,97 @@ +# Reactive Resume / QNAP QTS 纯净模板。 +# 使用前请填写: +# - NAS 数据目录,例如 /share/Container/Reactive_Resume +# - APP_URL,例如 https://resume.example.com +# - 本地访问端口,例如 3004 +# - PostgreSQL 密码、AUTH_SECRET、ENCRYPTION_SECRET +# - FRP serverAddr/serverPort/token/proxy name/remotePort + +name: reactive-resume-nas + +services: + reactive_resume_permissions: + image: alpine:3.20 + restart: "no" + command: ["sh", "-c", "mkdir -p /app/data && chown -R 1000:1000 /app/data"] + volumes: + # 待填写:改成你的 NAS 数据目录。 + - /share/Container/CHANGE_ME_REACTIVE_RESUME/data/uploads:/app/data + + reactive_resume_db: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_DB: reactive_resume + POSTGRES_USER: reactive_resume + POSTGRES_PASSWORD: CHANGE_ME_POSTGRES_PASSWORD + volumes: + # 待填写:改成你的 NAS 数据目录。 + - /share/Container/CHANGE_ME_REACTIVE_RESUME/data/postgres:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U reactive_resume -d reactive_resume"] + interval: 10s + timeout: 5s + retries: 10 + + reactive_resume_app: + image: amruthpillai/reactive-resume:latest + restart: unless-stopped + depends_on: + reactive_resume_permissions: + condition: service_completed_successfully + reactive_resume_db: + condition: service_healthy + ports: + # 待填写:NAS 本地访问端口。 + - "CHANGE_ME_LOCAL_APP_PORT:3000" + volumes: + # 待填写:改成你的 NAS 数据目录。 + - /share/Container/CHANGE_ME_REACTIVE_RESUME/data/uploads:/app/data + environment: + TZ: Asia/Shanghai + APP_URL: https://YOUR_DOMAIN.example.com + DATABASE_URL: postgresql://reactive_resume:CHANGE_ME_POSTGRES_PASSWORD@reactive_resume_db:5432/reactive_resume + AUTH_SECRET: CHANGE_ME_64_HEX_AUTH_SECRET + ENCRYPTION_SECRET: CHANGE_ME_64_HEX_ENCRYPTION_SECRET + SMTP_FROM: Reactive Resume + SMTP_PORT: "587" + SMTP_SECURE: "false" + FLAG_DISABLE_SIGNUPS: "false" + FLAG_DISABLE_EMAIL_AUTH: "false" + FLAG_DISABLE_IMAGE_PROCESSING: "false" + FLAG_ALLOW_UNSAFE_AI_BASE_URL: "false" + healthcheck: + test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:3000/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""] + interval: 30s + timeout: 10s + retries: 8 + start_period: 30s + + reactive_resume_frpc: + image: snowdreamtech/frpc:latest + restart: unless-stopped + entrypoint: ["/bin/sh"] + command: + - -c + - | + cat > /tmp/frpc.toml <<'EOF' + serverAddr = "YOUR_FRP_SERVER_IP_OR_DOMAIN" + serverPort = CHANGE_ME_FRP_SERVER_PORT + + auth.method = "token" + auth.token = "CHANGE_ME_FRP_TOKEN" + + transport.poolCount = 5 + transport.heartbeatTimeout = -1 + + [[proxies]] + name = "CHANGE_ME_PROXY_NAME" + type = "tcp" + localIP = "reactive_resume_app" + localPort = 3000 + remotePort = CHANGE_ME_REMOTE_PORT + EOF + exec frpc -c /tmp/frpc.toml + depends_on: + reactive_resume_app: + condition: service_healthy diff --git a/packages/reactive-resume-clean-install/compose.yml b/packages/reactive-resume-clean-install/compose.yml new file mode 100644 index 0000000..f0025df --- /dev/null +++ b/packages/reactive-resume-clean-install/compose.yml @@ -0,0 +1,72 @@ +# Reactive Resume 通用服务器纯净模板。 +# 使用前请先复制 .env.example 为 .env,并填写域名、端口、数据库密码和密钥。 + +name: reactive-resume + +services: + postgres: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - postgres_data:/var/lib/postgresql/data + networks: + - resume_net + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 10s + timeout: 5s + retries: 10 + + reactive-resume: + image: amruthpillai/reactive-resume:latest + restart: unless-stopped + env_file: + - .env + ports: + # 待填写:LOCAL_BIND_IP / LOCAL_APP_PORT 在 .env 中配置。 + # 例:127.0.0.1:3004:3000,仅允许本机反代或 frpc 访问。 + - "${LOCAL_BIND_IP}:${LOCAL_APP_PORT}:3000" + volumes: + - reactive_resume_data:/app/data + networks: + - resume_net + depends_on: + postgres: + condition: service_healthy + healthcheck: + test: + [ + "CMD", + "node", + "-e", + "fetch('http://127.0.0.1:3000/api/health').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1));", + ] + interval: 30s + timeout: 10s + retries: 5 + start_period: 30s + + frpc: + image: fatedier/frpc:v0.68.0 + restart: unless-stopped + command: ["-c", "/etc/frp/frpc.yaml"] + volumes: + # 待填写:frpc.yaml 中配置 FRP 服务器、token、remotePort。 + - ./frpc.yaml:/etc/frp/frpc.yaml:ro + networks: + - resume_net + depends_on: + reactive-resume: + condition: service_healthy + +networks: + resume_net: + driver: bridge + +volumes: + postgres_data: + reactive_resume_data: diff --git a/packages/reactive-resume-clean-install/frpc.yaml b/packages/reactive-resume-clean-install/frpc.yaml new file mode 100644 index 0000000..452adf0 --- /dev/null +++ b/packages/reactive-resume-clean-install/frpc.yaml @@ -0,0 +1,22 @@ +# Reactive Resume frpc 纯净模板。 +# 使用前把所有 CHANGE_ME / YOUR_* 改成真实值。 + +serverAddr: "YOUR_FRP_SERVER_IP_OR_DOMAIN" +serverPort: CHANGE_ME_FRP_SERVER_PORT + +auth: + method: "token" + token: "CHANGE_ME_FRP_TOKEN" + +transport: + poolCount: 5 + heartbeatTimeout: -1 + +proxies: + - name: "CHANGE_ME_PROXY_NAME" + type: "tcp" + # Docker Compose 内部服务名,通常不用改。 + localIP: "reactive-resume" + localPort: 3000 + # 待填写:公网 FRP 远程端口,需与反向代理 forward port 一致。 + remotePort: CHANGE_ME_REMOTE_PORT diff --git a/packages/reactive-resume-isiseg-direct/.env b/packages/reactive-resume-isiseg-direct/.env new file mode 100644 index 0000000..bad91c0 --- /dev/null +++ b/packages/reactive-resume-isiseg-direct/.env @@ -0,0 +1,50 @@ +TZ=Asia/Shanghai +APP_URL=https://isiseg.huijutec.cn + +# Local debug access only: http://127.0.0.1:3004 +LOCAL_BIND_IP=127.0.0.1 +LOCAL_APP_PORT=3004 + +POSTGRES_DB=reactive_resume +POSTGRES_USER=reactive_resume +POSTGRES_PASSWORD=2ed1869944c609f070699bdf8c92194f +DATABASE_URL=postgresql://reactive_resume:2ed1869944c609f070699bdf8c92194f@postgres:5432/reactive_resume + +AUTH_SECRET=9ef1720ee316f9316241bdc84f5dfad99b52f139b48880300942ee61d81b7cda +ENCRYPTION_SECRET=20851888c2a96b11f1f6fc21b4eeb70f1e8258f2d0d414be8bace65eaff289ae + +BETTER_AUTH_API_KEY= +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= +GITHUB_CLIENT_ID= +GITHUB_CLIENT_SECRET= +LINKEDIN_CLIENT_ID= +LINKEDIN_CLIENT_SECRET= +OAUTH_PROVIDER_NAME= +OAUTH_CLIENT_ID= +OAUTH_CLIENT_SECRET= +OAUTH_DISCOVERY_URL= +OAUTH_AUTHORIZATION_URL= +OAUTH_TOKEN_URL= +OAUTH_USER_INFO_URL= +OAUTH_DYNAMIC_CLIENT_REDIRECT_HOSTS= +OAUTH_SCOPES= +SMTP_HOST= +SMTP_PORT=587 +SMTP_USER= +SMTP_PASS= +SMTP_FROM=Reactive Resume +SMTP_SECURE=false +S3_ACCESS_KEY_ID= +S3_SECRET_ACCESS_KEY= +S3_REGION=us-east-1 +S3_ENDPOINT= +S3_BUCKET= +S3_FORCE_PATH_STYLE=false +REDIS_URL= +CLOUDFLARE_ACCOUNT_ID= +CLOUDFLARE_API_TOKEN= +FLAG_DISABLE_SIGNUPS=false +FLAG_DISABLE_EMAIL_AUTH=false +FLAG_DISABLE_IMAGE_PROCESSING=false +FLAG_ALLOW_UNSAFE_AI_BASE_URL=false diff --git a/packages/reactive-resume-isiseg-direct/README.md b/packages/reactive-resume-isiseg-direct/README.md new file mode 100644 index 0000000..caa1d8f --- /dev/null +++ b/packages/reactive-resume-isiseg-direct/README.md @@ -0,0 +1,35 @@ +# Reactive Resume isiseg.huijutec.cn 直接运行安装包 + +这套包已经按 `https://isiseg.huijutec.cn` 和 FRP `remotePort = 10004` 预置,可以在当前服务器上直接运行。 + +## 启动 + +```bash +docker compose -f compose.yml up -d +``` + +启动后: + +- 本机调试地址:`http://127.0.0.1:3004` +- 公网访问地址:`https://isiseg.huijutec.cn` +- FRP 映射:本地 `reactive-resume:3000` -> 公网服务器 `10004` + +## 反向代理要求 + +公网服务器上的 Nginx Proxy Manager / 反向代理应配置: + +- Domain Names:`isiseg.huijutec.cn` +- Scheme:`http` +- Forward Hostname / IP:`82.157.255.195` +- Forward Port:`10004` +- Websockets Support:开启 +- SSL:按现有 huijutec.cn 域名策略配置 + +## 数据 + +Compose 会创建独立项目名 `reactive-resume-isiseg`,默认使用 Docker named volumes: + +- `reactive-resume-isiseg_postgres_data` +- `reactive-resume-isiseg_reactive_resume_data` + +如需迁移数据,请备份这些 volumes。 diff --git a/packages/reactive-resume-isiseg-direct/compose.yml b/packages/reactive-resume-isiseg-direct/compose.yml new file mode 100644 index 0000000..227ab8c --- /dev/null +++ b/packages/reactive-resume-isiseg-direct/compose.yml @@ -0,0 +1,66 @@ +name: reactive-resume-isiseg + +services: + postgres: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - postgres_data:/var/lib/postgresql/data + networks: + - resume_net + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 10s + timeout: 5s + retries: 10 + + reactive-resume: + image: amruthpillai/reactive-resume:latest + restart: unless-stopped + env_file: + - .env + ports: + - "${LOCAL_BIND_IP}:${LOCAL_APP_PORT}:3000" + volumes: + - reactive_resume_data:/app/data + networks: + - resume_net + depends_on: + postgres: + condition: service_healthy + healthcheck: + test: + [ + "CMD", + "node", + "-e", + "fetch('http://127.0.0.1:3000/api/health').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1));", + ] + interval: 30s + timeout: 10s + retries: 5 + start_period: 30s + + frpc: + image: fatedier/frpc:v0.68.0 + restart: unless-stopped + command: ["-c", "/etc/frp/frpc.yaml"] + volumes: + - ./frpc.yaml:/etc/frp/frpc.yaml:ro + networks: + - resume_net + depends_on: + reactive-resume: + condition: service_healthy + +networks: + resume_net: + driver: bridge + +volumes: + postgres_data: + reactive_resume_data: diff --git a/packages/reactive-resume-isiseg-direct/frpc.yaml b/packages/reactive-resume-isiseg-direct/frpc.yaml new file mode 100644 index 0000000..099c198 --- /dev/null +++ b/packages/reactive-resume-isiseg-direct/frpc.yaml @@ -0,0 +1,17 @@ +serverAddr: "82.157.255.195" +serverPort: 7000 + +auth: + method: "token" + token: "en.xjtu.edu.cn" + +transport: + poolCount: 5 + heartbeatTimeout: -1 + +proxies: + - name: "reactive-resume-isiseg" + type: "tcp" + localIP: "reactive-resume" + localPort: 3000 + remotePort: 10004 diff --git a/packages/reactive-resume-qnap-nas-isiseg/README.md b/packages/reactive-resume-qnap-nas-isiseg/README.md new file mode 100644 index 0000000..72b5b6a --- /dev/null +++ b/packages/reactive-resume-qnap-nas-isiseg/README.md @@ -0,0 +1,31 @@ +# Reactive Resume isiseg.huijutec.cn / QNAP NAS 安装包 + +这套包面向威联通 QNAP QTS / Container Station,已按以下参数预置: + +- NAS 数据目录:`/share/Container/Reactive_Resume_Isiseg` +- 本地端口:`3004:3000` +- 公网域名:`https://isiseg.huijutec.cn` +- FRP 服务器:`82.157.255.195:7000` +- FRP remotePort:`10004` + +## 部署 + +1. 在 QTS 中确认目录可创建:`/share/Container/Reactive_Resume_Isiseg` +2. 打开 Container Station,导入 `compose-Nas.yml` +3. 启动项目 +4. 访问 `https://isiseg.huijutec.cn` + +## 反向代理要求 + +公网服务器上的 Nginx Proxy Manager / 反向代理应配置: + +- Domain Names:`isiseg.huijutec.cn` +- Scheme:`http` +- Forward Hostname / IP:`82.157.255.195` +- Forward Port:`10004` +- Websockets Support:开启 + +## 数据目录 + +- PostgreSQL:`/share/Container/Reactive_Resume_Isiseg/data/postgres` +- 上传与本地存储:`/share/Container/Reactive_Resume_Isiseg/data/uploads` diff --git a/packages/reactive-resume-qnap-nas-isiseg/compose-Nas.yml b/packages/reactive-resume-qnap-nas-isiseg/compose-Nas.yml new file mode 100644 index 0000000..9f31c3a --- /dev/null +++ b/packages/reactive-resume-qnap-nas-isiseg/compose-Nas.yml @@ -0,0 +1,119 @@ +# Reactive Resume isiseg.huijutec.cn / QNAP QTS 直接部署版。 +# 本文件已按 /share/Container/Reactive_Resume_Isiseg、 +# https://isiseg.huijutec.cn、192.168.31.5:3004 本地访问、 +# frpc 公网映射 82.157.255.195:10004 预置。 + +name: reactive-resume-isiseg-nas + +services: + reactive_resume_permissions: + image: alpine:3.20 + restart: "no" + command: ["sh", "-c", "mkdir -p /app/data && chown -R 1000:1000 /app/data"] + volumes: + - /share/Container/Reactive_Resume_Isiseg/data/uploads:/app/data + + reactive_resume_db: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_DB: reactive_resume + POSTGRES_USER: reactive_resume + POSTGRES_PASSWORD: 5b341c0ca29fefd6d648661150c00fa4 + volumes: + - /share/Container/Reactive_Resume_Isiseg/data/postgres:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U reactive_resume -d reactive_resume"] + interval: 10s + timeout: 5s + retries: 10 + + reactive_resume_app: + image: amruthpillai/reactive-resume:latest + restart: unless-stopped + depends_on: + reactive_resume_permissions: + condition: service_completed_successfully + reactive_resume_db: + condition: service_healthy + ports: + - "3004:3000" + volumes: + - /share/Container/Reactive_Resume_Isiseg/data/uploads:/app/data + environment: + TZ: Asia/Shanghai + APP_URL: https://isiseg.huijutec.cn + DATABASE_URL: postgresql://reactive_resume:5b341c0ca29fefd6d648661150c00fa4@reactive_resume_db:5432/reactive_resume + AUTH_SECRET: c76b0eaf79f731e9ee95918dc69d41696aec9d1deffeabc122944898037bfab1 + ENCRYPTION_SECRET: df3a460fa2f92f6e8765927a169322980e18f63a88fbcfedb090819b5afb2408 + + BETTER_AUTH_API_KEY: "" + GOOGLE_CLIENT_ID: "" + GOOGLE_CLIENT_SECRET: "" + GITHUB_CLIENT_ID: "" + GITHUB_CLIENT_SECRET: "" + LINKEDIN_CLIENT_ID: "" + LINKEDIN_CLIENT_SECRET: "" + OAUTH_PROVIDER_NAME: "" + OAUTH_CLIENT_ID: "" + OAUTH_CLIENT_SECRET: "" + OAUTH_DISCOVERY_URL: "" + OAUTH_AUTHORIZATION_URL: "" + OAUTH_TOKEN_URL: "" + OAUTH_USER_INFO_URL: "" + OAUTH_DYNAMIC_CLIENT_REDIRECT_HOSTS: "" + OAUTH_SCOPES: "" + SMTP_HOST: "" + SMTP_PORT: "587" + SMTP_USER: "" + SMTP_PASS: "" + SMTP_FROM: "Reactive Resume " + SMTP_SECURE: "false" + S3_ACCESS_KEY_ID: "" + S3_SECRET_ACCESS_KEY: "" + S3_REGION: us-east-1 + S3_ENDPOINT: "" + S3_BUCKET: "" + S3_FORCE_PATH_STYLE: "false" + REDIS_URL: "" + CLOUDFLARE_ACCOUNT_ID: "" + CLOUDFLARE_API_TOKEN: "" + FLAG_DISABLE_SIGNUPS: "false" + FLAG_DISABLE_EMAIL_AUTH: "false" + FLAG_DISABLE_IMAGE_PROCESSING: "false" + FLAG_ALLOW_UNSAFE_AI_BASE_URL: "false" + healthcheck: + test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:3000/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""] + interval: 30s + timeout: 10s + retries: 8 + start_period: 30s + + reactive_resume_frpc: + image: snowdreamtech/frpc:latest + restart: unless-stopped + entrypoint: ["/bin/sh"] + command: + - -c + - | + cat > /tmp/frpc.toml <<'EOF' + serverAddr = "82.157.255.195" + serverPort = 7000 + + auth.method = "token" + auth.token = "en.xjtu.edu.cn" + + transport.poolCount = 5 + transport.heartbeatTimeout = -1 + + [[proxies]] + name = "Reactive_Resume_Isiseg_NAS" + type = "tcp" + localIP = "reactive_resume_app" + localPort = 3000 + remotePort = 10004 + EOF + exec frpc -c /tmp/frpc.toml + depends_on: + reactive_resume_app: + condition: service_healthy