Reactive Resume 自托管简历构建器部署教程开源 Resume.io 替代方案在求职过程中一份精美的简历往往能带来关键优势。Reactive Resume 是一款完全开源、支持自托管的在线简历构建工具功能对标 Resume.io 和 Canva 等商业产品但完全免费且数据由你自己掌控。它提供多种精心设计的简历模板支持实时预览编辑、多语言界面、PDF 高保真导出以及通过公开链接分享简历。项目采用 MIT 协议开源代码托管在 GitHub 上拥有活跃的社区维护。与 Resume.io 等 SaaS 工具相比自托管 Reactive Resume 的核心优势在于隐私保护——你的简历数据存储在自己的服务器上不会被第三方服务商扫描或泄露。此外自托管版本没有功能限制无需订阅付费所有高级模板均可免费使用。对于需要统一管理团队成员简历的 HR 部门或希望为学生提供简历工具的教育机构私有化部署也有明显优势。本教程将使用 Docker Compose 部署 Reactive Resume v4并配置 Caddy 作为反向代理实现自动 HTTPS整个部署过程约需 15-20 分钟。服务器配置Reactive Resume 采用前后端分离架构后端依赖 PostgreSQL 数据库和 Minio 对象存储需要一定的基础资源。推荐使用雨云服务器 rainyun-com注册填优惠码2026off领 5 折优惠券。1 核 2GB 机型可满足个人或小团队使用在空载状态下内存占用约为 800MB包含 PostgreSQL、Minio、后端 API 和前端服务。操作系统推荐 Ubuntu 22.04 LTS并提前准备好一个解析到服务器 IP 的域名Caddy 自动 HTTPS 需要。安装准备工作安装 Docker 和 Docker Compose# 更新系统sudoaptupdatesudoaptupgrade-y# 安装 Dockercurl-fsSLhttps://get.docker.com|shsudousermod-aGdocker$USERnewgrpdocker# 验证安装docker--versiondockercompose version安装 Caddysudoaptinstall-ydebian-keyring debian-archive-keyring apt-transport-httpscurlcurl-1sLfhttps://dl.cloudsmith.io/public/caddy/stable/gpg.key\|sudogpg--dearmor-o/usr/share/keyrings/caddy-stable-archive-keyring.gpgcurl-1sLfhttps://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt\|sudotee/etc/apt/sources.list.d/caddy-stable.listsudoaptupdatesudoaptinstall-ycaddy准备项目目录mkdir-p~/reactive-resumecd~/reactive-resume详细配置创建 Docker Compose 文件nano~/reactive-resume/docker-compose.ymlversion:3.8services:# PostgreSQL 数据库postgres:image:postgres:16-alpinerestart:unless-stoppedvolumes:-postgres_data:/var/lib/postgresql/dataenvironment:POSTGRES_DB:reactive_resumePOSTGRES_USER:rxresumePOSTGRES_PASSWORD:${POSTGRES_PASSWORD}healthcheck:test:[CMD-SHELL,pg_isready -U rxresume -d reactive_resume]interval:10stimeout:5sretries:5# Minio 对象存储用于存储上传的图片等文件minio:image:minio/minio:latestrestart:unless-stoppedcommand:server /data--console-address :9001volumes:-minio_data:/dataenvironment:MINIO_ROOT_USER:${MINIO_ROOT_USER}MINIO_ROOT_PASSWORD:${MINIO_ROOT_PASSWORD}healthcheck:test:[CMD,mc,ready,local]interval:10stimeout:5sretries:5# Minio 初始化创建 bucketminio-init:image:minio/mc:latestdepends_on:minio:condition:service_healthyentrypoint:/bin/sh -c mc alias set local http://minio:9000 ${MINIO_ROOT_USER} ${MINIO_ROOT_PASSWORD}; mc mb --ignore-existing local/reactive-resume; mc anonymous set download local/reactive-resume; exit 0; # Chrome用于生成 PDFchrome:image:browserless/chrome:latestrestart:unless-stoppedenvironment:TIMEOUT:30000CONCURRENT:5TOKEN:${CHROME_TOKEN}# Reactive Resume 后端 APIbackend:image:amruthpillai/reactive-resume:server-latestrestart:unless-stoppeddepends_on:postgres:condition:service_healthyminio:condition:service_healthyenvironment:# 应用配置PORT:3000NODE_ENV:productionPUBLIC_URL:https://${DOMAIN}STORAGE_URL:https://${DOMAIN}/storage# 数据库DATABASE_URL:postgresql://rxresume:${POSTGRES_PASSWORD}postgres:5432/reactive_resume# JWT 认证ACCESS_TOKEN_SECRET:${ACCESS_TOKEN_SECRET}REFRESH_TOKEN_SECRET:${REFRESH_TOKEN_SECRET}# Minio 存储STORAGE_ENDPOINT:minioSTORAGE_PORT:9000STORAGE_SSL:falseSTORAGE_ACCESS_KEY:${MINIO_ROOT_USER}STORAGE_SECRET_KEY:${MINIO_ROOT_PASSWORD}STORAGE_BUCKET:reactive-resume# Chrome PDF 生成CHROME_URL:http://chrome:3000?token${CHROME_TOKEN}# 邮件可选用于找回密码MAIL_FROM:noreply${DOMAIN}# SMTP_URL: smtp://user:passsmtp.example.com:587# Reactive Resume 前端frontend:image:amruthpillai/reactive-resume:client-latestrestart:unless-stoppeddepends_on:-backendenvironment:PUBLIC_SERVER_URL:https://${DOMAIN}/apiVITE_SERVER_URL:https://${DOMAIN}/apivolumes:postgres_data:minio_data:创建环境变量文件nano~/reactive-resume/.env# 域名DOMAINresume.yourdomain.com# 数据库密码使用强密码POSTGRES_PASSWORDyour_strong_db_password_here# Minio 凭据MINIO_ROOT_USERminioadminMINIO_ROOT_PASSWORDyour_minio_password_here# JWT 密钥使用随机字符串ACCESS_TOKEN_SECRET$(openssl rand-hex32)REFRESH_TOKEN_SECRET$(openssl rand-hex32)# Chrome 访问 tokenCHROME_TOKEN$(openssl rand-hex16)生成真实的随机密钥echoACCESS_TOKEN_SECRET$(openssl rand-hex32)echoREFRESH_TOKEN_SECRET$(openssl rand-hex32)echoCHROME_TOKEN$(openssl rand-hex16)将生成的值填入.env文件。配置 Caddy 反向代理sudonano/etc/caddy/Caddyfileresume.yourdomain.com { # 前端 handle / { reverse_proxy localhost:3001 } # 后端 API handle /api/* { uri strip_prefix /api reverse_proxy localhost:3000 } # Minio 对象存储公开读取 handle /storage/* { uri strip_prefix /storage reverse_proxy localhost:9000 } # 安全头 header { X-Content-Type-Options nosniff X-Frame-Options DENY X-XSS-Protection 1; modeblock } # 日志 log { output file /var/log/caddy/resume.log } }启动服务cd~/reactive-resume# 启动所有容器dockercompose up-d# 查看启动日志dockercompose logs-f# 重载 Caddy 配置sudosystemctl reload caddy等待约 1-2 分钟所有容器初始化完成后访问https://resume.yourdomain.com即可看到注册界面。核心功能注册首个管理员账户首次访问时点击注册填写邮箱和密码完成注册。默认情况下任何人都可以注册账户。如需禁用公开注册仅限管理员邀请# 在 docker-compose.yml 的 backend 环境变量中添加DISABLE_SIGNUPS:true创建和编辑简历登录后点击新建简历选择模板提供 12 种设计模板在左侧面板填写个人信息、工作经历、教育背景、技能等右侧实时预览最终效果调整字体、颜色、间距等排版参数导出 PDF# PDF 导出依赖 Chrome 容器确保其正常运行dockercomposepschrome# 在简历编辑页面右上角点击下载 PDF# PDF 由无头 Chrome 渲染保持与网页预览完全一致的排版公开分享链接在简历设置中开启公开访问即可获得一个永久分享链接格式为https://resume.yourdomain.com/r/your-unique-slug实战示例备份数据库# 备份 PostgreSQLdockercomposeexecpostgres pg_dump-Urxresume reactive_resume\~/backups/rxresume_$(date%Y%m%d).sql# 备份 Minio 数据dockerrun--rm-vreactive-resume_minio_data:/data\-v~/backups:/backup alpine\tarczf /backup/minio_$(date%Y%m%d).tar.gz /data更新到最新版本cd~/reactive-resumedockercompose pulldockercompose up-ddockerimage prune-f常见问题QPDF 导出失败或超时A检查 Chrome 容器是否正常运行docker compose ps chrome。内存不足时 Chrome 可能崩溃建议服务器内存至少 2GB并确认CHROME_TOKEN环境变量与配置一致。Q上传头像或附件失败A检查 Minio 容器状态确认reactive-resumebucket 已被minio-init服务创建并设置了匿名读取权限。可手动执行初始化docker compose run --rm minio-init。Q注册邮箱收不到验证邮件A默认不需要邮件验证即可登录。若配置了 SMTP 但邮件未收到检查SMTP_URL格式是否正确以及邮件服务商是否需要应用专用密码。QCaddy 无法获取 SSL 证书A确认域名已正确解析到服务器 IP服务器 80 和 443 端口已开放sudo ufw allow 80 sudo ufw allow 443。查看 Caddy 日志journalctl -u caddy -f。Q如何重置管理员密码Adockercomposeexecpostgres psql-Urxresume reactive_resume-c\UPDATE users SET password\$argon2id\$... WHERE emailadminexample.com;# 或通过忘记密码功能发送重置邮件需配置 SMTPReactive Resume 是目前功能最完善的开源简历构建工具借助 Docker Compose 部署方式即使没有深厚的运维经验也可以在半小时内搭建完成。如果你正在寻找一台性价比高的服务器来托管个人工具集推荐选用雨云服务器 rainyun-com的1 核 2GB 机型注册时填入优惠码2026off即可领取 5 折优惠券以极低的月费运行属于自己的私有简历系统告别数据隐患。