5分钟部署OTS:端到端加密的阅后即焚私密信息分享平台

📅 2026/7/5 12:34:01
5分钟部署OTS:端到端加密的阅后即焚私密信息分享平台
1. 项目概述什么是OTS以及为什么你需要它在数字信息交换日益频繁的今天我们常常需要临时分享一些敏感内容可能是一串临时的服务器密码、一份未公开的合同草稿、一个私密的分享链接或者任何你希望“阅后即焚”的信息。直接通过微信、邮件或网盘发送总让人担心信息泄露或留存。OTSOne-Time Secret就是为了解决这个痛点而生的工具。它是一个开源的一次性私密信息分享平台核心设计哲学是“端到端加密”和“阅后即焚”。简单来说你把秘密文本交给它它会生成一个唯一的链接和密码接收方通过链接并输入密码后才能看到内容并且这个秘密在第一次被查看后就会自动销毁服务器上不会存储任何可解密的明文。我最初接触OTS是因为需要给同事临时共享一个数据库的root密码。用即时通讯工具发怕被聊天记录爬虫扫到写邮件又太正式且邮件服务器有存档。OTS完美解决了这个问题我生成链接发过去他看完记下密码链接就失效了。整个过程快速、安全且不留痕迹。对于开发者、运维人员、法务或任何需要处理敏感信息的从业者来说这绝对是一个能提升安全感和效率的“瑞士军刀”。接下来我将带你从零开始在5分钟内完成OTS的部署并立即用它完成第一次加密分享。2. 环境准备与核心组件解析在动手部署之前我们先花一分钟理解一下OTS的架构这能帮你更好地理解后续的每一步操作并在出现问题时知道从哪里排查。OTS的核心运行依赖于两个部分Web应用服务和存储后端。Web应用服务就是OTS本身一个用Go语言编写的小巧程序。它负责提供用户界面那个简洁的网页并在前端用户的浏览器里使用AES-256算法对你要分享的秘密进行加密。这里有个关键点加密发生在你的浏览器里。这意味着你的明文秘密在离开你的电脑之前就已经变成了密文。服务器接收到的只是一串无法直接解读的乱码。这个设计从根本上杜绝了服务器被入侵导致数据泄露的风险。存储后端负责临时存放这些加密后的密文。OTS支持两种模式内存mem和Redis。内存模式简单所有数据放在服务器内存里重启服务数据就没了适合临时测试。但对于生产环境或想长期使用的场景Redis是必须的选择。Redis是一个高性能的键值数据库OTS用它来存储密文和对应的元数据如过期时间。我们选择Docker来部署正是因为Docker能让我们用几条命令就干净利落地把OTS应用和Redis数据库组合起来完全不用操心复杂的依赖和环境配置。你需要准备的东西很简单一台服务器/VPS配置不用高1核1GB内存就足够流畅运行。系统推荐主流的Linux发行版如Ubuntu 22.04 LTS或Debian 11。我个人的测试环境就是一台最基础的云服务器。一个域名非强制但强烈建议如果你想通过HTTPS链接带小锁图标安全访问域名是申请SSL证书的必需品。如果只是内网或临时测试直接用IP地址也行。基础的命令行操作能力会使用SSH连接服务器会执行基本的Linux命令如cd,mkdir,vim即可。注意整个部署过程将在命令行中完成。如果你对vim编辑器不熟悉可以用nano代替操作更直观。例如用nano docker-compose.yml来创建和编辑文件。3. 五分钟极速部署一步步搭建你的私密分享站理论清晰了我们开始实战。只要跟着步骤走五分钟绰绰有余。3.1 第一步登录服务器并创建项目目录首先通过SSH连接到你的服务器。然后我们创建一个专属目录来存放OTS的所有配置和数据这样管理起来清晰以后迁移或备份也方便。# 切换到root用户或使用sudo权限 sudo -i # 创建项目目录结构 mkdir -p /root/data/docker_data/ots cd /root/data/docker_data/ots这里我习惯把Docker项目都放在/root/data/docker_data下你可以根据自己习惯调整路径。进入目录后我们将在这里编写核心的配置文件。3.2 第二步编写Docker Compose配置文件这是整个部署的核心。Docker Compose允许我们用一份YAML文件定义并启动多个关联的容器这里就是OTS应用和Redis。我们使用vim或nano创建并编辑docker-compose.yml文件。vim docker-compose.yml将以下配置内容完整地粘贴进去。我会逐段解释关键参数让你明白每一行的意义。version: 3.8 services: # OTS 主应用服务 app: image: ghcr.io/luzifer/ots:latest # 使用官方最新的镜像 container_name: ots-app # 为容器起个名字方便管理 restart: always # 总是重启确保服务高可用 ports: - 3003:3000 # 将容器内部的3000端口映射到服务器的3003端口 environment: # 可选自定义样式配置文件路径高级用户可用 # CUSTOMIZE: /etc/ots/customize.yaml # 连接Redis的URL格式固定。这里连接到下面定义的redis服务使用0号数据库 REDIS_URL: redis://redis:6379/0 # 秘密的默认过期时间秒。604800秒 7天。设为0则永不过期不推荐。 SECRET_EXPIRY: 604800 # 存储类型必须设置为 redis 以使用Redis后端 STORAGE_TYPE: redis depends_on: - redis # 声明依赖确保redis服务先启动 # Redis 数据库服务 redis: image: redis:latest-alpine # 使用精简的Alpine版Redis镜像 container_name: ots-redis restart: always volumes: # 将Redis数据持久化到宿主机的 ./data 目录防止容器重启数据丢失 - ./data:/data command: redis-server --appendonly yes # 启用AOF持久化更安全关键参数解析与避坑指南端口映射 (ports: - 3003:3000): 左边3003是你服务器上对外开放的端口右边3000是OTS容器内部监听的端口。你可以把3003改成任何你服务器上未被占用的端口比如8080、8381等。务必检查端口冲突执行lsof -i:3003或netstat -tlnp | grep :3003查看端口是否被占用。REDIS_URL: 这个值redis://redis:6379/0是固定写法。redis指的是下面定义的Redis服务名Docker Compose的网络会自动将其解析为正确的容器IP。/0表示使用Redis的0号数据库。除非你有特殊需求否则不要修改。SECRET_EXPIRY: 这是全局默认的过期时间。即使分享者不自定义秘密也会在7天后自动销毁。你可以根据需求调整例如86400代表1天24小时 * 3600秒。数据持久化 (volumes: - ./data:/data): 这一行至关重要它将Redis容器内的/data目录挂载到宿主机的当前目录下的data文件夹。这样即使你删除并重建Redis容器之前创建的未过期的秘密链接仍然有效。没有这行配置所有数据将在容器重启后丢失。编辑完成后按Esc键然后输入:wq保存并退出vim。如果你用的是nano按CtrlX然后按Y确认再按回车保存。3.3 第三步一键启动OTS服务配置文件就绪后启动服务就是一行命令的事。# 在 /root/data/docker_data/ots 目录下执行 docker compose up -d这个命令会做以下几件事docker compose up: 根据docker-compose.yml创建并启动所有服务。-d: 让容器在“后台”Detached模式运行不占用当前命令行窗口。首次运行会从Docker仓库拉取ots和redis的镜像这取决于你的网络速度通常在一两分钟内完成。看到提示✔ Container ots-redis Started和✔ Container ots-app Started就表示成功了。3.4 第四步验证服务与初步访问启动完成后我们可以快速验证一下服务是否正常运行。# 查看容器状态 docker compose ps你应该能看到两个容器的状态都是Up (healthy)或Up。现在打开你的浏览器访问http://你的服务器IP地址:3003。例如http://192.168.1.100:3003。如果一切顺利你将看到OTS简洁的首页上面有一个大大的文本框让你输入秘密。恭喜至此一个功能完整的OTS私密分享平台已经在你的服务器上运行起来了。你可以立刻尝试创建一个秘密在文本框输入一些文字点击“Generate a secret link”它会生成一个链接和密码。把链接和密码通过不同渠道比如链接发微信密码打电话说发给对方他就能查看内容且查看一次后链接即失效。4. 进阶配置绑定域名与启用HTTPS虽然通过IP和端口已经能用了但这不够“体面”和安全。直接在公网用HTTP传输存在被窃听的风险尽管内容是加密的但链接本身是明文。为OTS绑定一个域名并启用HTTPS是生产环境使用的必经之路。这里我介绍两种最主流的方法。4.1 方案一使用Nginx Proxy ManagerNPM—— 图形化神器Nginx Proxy Manager是一个带Web管理界面的反向代理工具它能让你像点菜一样轻松配置域名、SSL证书。如果你讨厌编辑复杂的Nginx配置文件这是最佳选择。前提你已有一个域名例如ots.yourdomain.com并且已经将该域名的DNS解析指向了你服务器的公网IP。安装NPM如果尚未安装 你可以参考其官方文档或使用Docker Compose快速安装。这里假设你已经安装好NPM并通过http://服务器IP:81访问其管理界面默认账号adminexample.com密码changeme。在NPM中配置OTS的反向代理登录NPM后台点击 “Proxy Hosts” - “Add Proxy Host”。Details 标签页Domain Names: 填写你的域名如ots.yourdomain.com。Scheme: 保持http。Forward Hostname / IP: 这里填OTS容器的内部IP或Docker网络中的服务名。因为NPM和OTS在同一台服务器且都通过Docker运行最可靠的方式是填写Docker的内部网络地址。首先获取OTS容器的IPdocker inspect -f {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}} ots-app假设得到的IP是172.18.0.3那么就填这个IP。或者由于在同一个Docker Compose项目中你也可以直接填服务名appNPM需要和OTS在同一个Docker网络中否则需用IP。Forward Port: 填写OTS容器内部的端口3000不是我们映射的3003。SSL 标签页勾选 “Force SSL” 和 “HTTP/2 Support”。点击 “Request a new SSL Certificate”勾选同意条款点击“Save”。NPM会自动通过Let‘s Encrypt为你申请并配置免费的HTTPS证书。点击 Save。稍等片刻证书签发成功后你就可以通过https://ots.yourdomain.com安全地访问你的OTS了。实操心得在“Forward Hostname / IP”这里踩过坑。最初我填了127.0.0.1或服务器的公网IP导致NPM从宿主机网络去访问容器端口经常连接失败。最佳实践是让NPM和OTS都通过Docker Compose定义在同一个自定义网络中或者直接使用容器IP。如果NPM是单独安装的非Docker则可能需要填写host.docker.internalDocker Desktop或宿主机在Docker网桥中的IP。4.2 方案二使用宝塔面板或手动配置Nginx如果你已经在使用宝塔面板管理服务器配置起来也很方便。在宝塔中创建一个新网站域名填写ots.yourdomain.comPHP版本选择“纯静态”即可。进入该网站的“设置”找到“反向代理”功能。添加反向代理目标URL填写http://127.0.0.1:3003因为OTS运行在宿主机上映射到了3003端口。在“SSL”选项中申请Let‘s Encrypt的免费证书并强制开启HTTPS。手动配置Nginx示例 如果你习惯手动管理Nginx配置文件大概长这样放在/etc/nginx/sites-available/下server { listen 80; server_name ots.yourdomain.com; return 301 https://$server_name$request_uri; # 强制跳转HTTPS } server { listen 443 ssl http2; server_name ots.yourdomain.com; # SSL证书路径通过Certbot等工具获取 ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; location / { proxy_pass http://127.0.0.1:3003; # 指向OTS服务 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; # 如果OTS有WebSocket通信后两行可能需要 } }配置完成后执行nginx -t测试配置无误后systemctl reload nginx重载服务。无论采用哪种方案成功配置HTTPS后你的OTS站点地址栏将出现一把小锁所有通信都会被加密这才是分享秘密应有的安全姿态。5. 首次加密分享实战与功能详解平台搭好了我们来实际操练一次并深入了解OTS的各项功能细节。访问你的OTS站点无论是IP:端口还是域名你会看到一个极其简洁的界面。5.1 创建你的第一个秘密输入秘密在最大的文本框中粘贴或输入你想要分享的敏感信息。比如服务器SSH密钥ssh-ed25519 AAAAC3...或者临时数据库密码xY7#kL!9pQ。设置密码可选但强烈推荐在“Passphrase”输入框设置一个密码。这个密码不会发送到服务器它用于在浏览器端生成加密密钥。接收方必须输入完全相同的密码才能解密。这是端到端加密的关键。如果你留空系统会生成一个随机的密码但你必须通过另一个安全渠道告知接收方。自定义过期时间可选你可以覆盖全局默认的过期时间为这个秘密单独设置一个更短或更长在全局限制内的存活时间。点击生成点击 “Generate a secret link” 按钮。瞬间页面会刷新显示结果页面。这个页面包含两个至关重要的部分Secret Link (链接): 例如https://ots.yourdomain.com/s/abc123def456Passphrase (密码): 你之前设置的那个或者系统生成的。5.2 分享与查看流程现在你需要将链接和密码通过不同的、相对安全的渠道分别发送给接收方。例如将链接通过工作聊天软件发送将密码通过短信或电话告知。这是安全实践中的重要一步称为“双通道验证”能有效防止单一通信渠道被窃听导致的整体泄露。接收方在浏览器中打开链接后会看到一个输入密码的页面。输入正确的密码后原始的秘密内容才会被解密并显示在页面上。与此同时这个秘密会立即从服务器的Redis数据库中删除实现“阅后即焚”。如果接收方尝试再次访问同一个链接将会看到“Secret not found”或已过期的错误提示。5.3 高级功能与安全考量链接预览生成链接后OTS会提供一个“Preview”功能。点击后在不触发销毁的前提下你可以验证链接是否有效、秘密是否过期。这对于发送方确认配置是否正确非常有用。密码强度作为发送方你应该设置一个强密码。OTS本身不强制密码复杂度但这关乎秘密的安全性。建议使用密码管理器生成并填充。浏览器安全由于加解密过程发生在浏览器中请确保你和接收方都在可信的设备与网络环境下操作避免浏览器插件或恶意软件窃取信息。服务器日志OTS服务端日志不会记录秘密内容但会记录访问日志IP、时间、链接ID。从隐私角度这是可以接受的。6. 日常维护与故障排查指南任何服务部署后都需要简单的维护。OTS非常轻量维护工作很少。6.1 如何更新OTS到最新版本开发团队会持续改进项目。更新非常简单在你的项目目录执行以下命令cd /root/data/docker_data/ots # 拉取最新的镜像 docker compose pull # 重新创建并启动容器配置不变应用更新 docker compose up -d # 清理旧的、不再使用的镜像释放磁盘空间 docker image prune -fdocker compose up -d命令在镜像更新后会自动停止旧容器并用新镜像创建新容器实现无缝更新。docker image prune -f会强制删除所有未被任何容器使用的“悬空”镜像。6.2 如何备份与迁移OTS的所有状态数据都存储在Redis中而我们已经通过Docker卷将其持久化到了./data目录。因此备份和迁移变得极其简单。备份只需要备份整个/root/data/docker_data/ots目录即可。你可以用tar命令打包tar -czf ots-backup-$(date %Y%m%d).tar.gz /root/data/docker_data/ots迁移到新服务器在新服务器上安装Docker和Docker Compose。将备份的ots目录上传到新服务器的相同路径。在新服务器进入该目录直接运行docker compose up -d。如果域名或IP变了记得修改反向代理NPM或Nginx的配置。6.3 常见问题与解决方案这里记录了几个我在使用和帮助他人部署时遇到的高频问题。问题1访问http://IP:3003显示 “Connection refused” 或无法连接。检查容器状态运行docker compose ps确认ots-app和ots-redis两个容器的状态都是 “Up”。如果有异常查看日志docker compose logs app。检查端口占用确认服务器防火墙如ufw和云服务商的安全组规则是否放行了你映射的端口如3003。执行ufw status查看或临时关闭防火墙测试ufw disable测试后记得开启。检查Docker Compose文件确认ports映射的宿主机端口左边没有被其他程序占用。使用lsof -i:3003或ss -tlnp | grep :3003检查。问题2能打开页面但点击生成链接后报错或长时间无响应。检查Redis连接这是最常见的原因。查看OTS应用的日志docker compose logs app。如果看到 “dial tcp: lookup redis on …” 或 “cannot connect to Redis” 之类的错误说明OTS容器无法连接到Redis容器。解决确保docker-compose.yml中REDIS_URL的值是redis://redis:6379/0并且depends_on包含了redis。然后重启服务docker compose down docker compose up -d。检查服务器资源运行docker stats查看容器CPU和内存使用情况。如果Redis因内存不足被OOM Killer杀死需要增加服务器资源或调整Redis配置。问题3通过域名HTTPS访问样式丢失或功能异常。检查反向代理配置确保反向代理NPM/Nginx正确传递了Host头等信息。参考上文Nginx配置示例中的proxy_set_header部分。检查WebSocket虽然OTS主要使用HTTP但某些高级功能可能用到WebSocket。在Nginx配置中确保有proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection upgrade;这两行。问题4秘密链接提示“Secret not found”但确定没过期。检查Redis持久化确认docker-compose.yml中Redis配置了卷挂载./data:/data。如果没有Redis数据存储在容器内部容器重启后所有数据丢失。检查存储类型确认STORAGE_TYPE环境变量设置为redis而不是mem。内存模式重启即失效。7. 安全加固与最佳实践建议将OTS部署在公网除了启用HTTPS还应考虑以下安全措施让它更“坚固”。访问控制可选但推荐OTS本身没有用户系统。如果你希望限制只有特定人才能创建秘密可以在其前方再加一层基础的HTTP认证Basic Auth。在Nginx或NPM中很容易配置。这样访问OTS主页时需要先输入一个统一的用户名密码。限制创建频率为了防止滥用如被当作垃圾信息发送工具可以考虑在Nginx层面设置速率限制rate limiting限制同一个IP在单位时间内创建秘密的请求次数。定期更新订阅OTS项目的GitHub Release页面定期更新到新版本以获取安全补丁和功能改进。监控与日志使用docker compose logs -f app可以实时查看访问日志。对于生产环境建议将Docker容器的日志收集到统一的日志平台如LokiGraylog或ELK中便于审计。备份策略虽然秘密是临时性的但Redis的持久化数据文件仍应定期备份。你可以设置一个Cron定时任务每周备份一次./data目录到其他存储位置。部署并安全配置好OTS后它就成为了你数字工具箱中一个可靠且优雅的组成部分。无论是团队内部快速共享令牌还是向外部客户临时传递敏感信息它都能在保障安全的前提下极大提升沟通效率。这个五分钟搭建的工具其价值会在一次次安全、无痕的秘密传递中充分体现。