安装和部署
本指南涵盖了自托管 Onetime Secret 实例的部署选项。
Docker 部署
Section titled “Docker 部署”Docker 提供最可靠和便携的部署方法。
使用 Docker Compose
Section titled “使用 Docker Compose”对于完整的基础设施管理,请使用专用的 Docker Compose 仓库:
仓库:https://github.com/onetimesecret/docker-compose/
快速设置:
git clone https://github.com/onetimesecret/docker-compose.gitcd docker-composedocker-compose up -d手动 Docker Compose 设置:
version: '3.8'
services: onetime: image: onetimesecret/onetimesecret:latest ports: - "3000:3000" environment: - REDIS_URL=redis://redis:6379/0 - SECRET=${SECRET} - HOST=${HOST:-localhost:3000} - SSL=${SSL:-false} - RACK_ENV=production depends_on: - redis volumes: - ./etc:/app/etc - ./logs:/app/logs
redis: image: redis:bookworm volumes: - redis_data:/data command: redis-server --requirepass ${REDIS_PASSWORD}
volumes: redis_data:环境变量文件(.env):
SECRET=your-secure-32-character-hex-keyREDIS_PASSWORD=your-redis-passwordHOST=your-domain.comSSL=true适用于需要自定义配置或现有基础设施的环境。
Ubuntu 22.04 LTS:
# 更新系统sudo apt update && sudo apt upgrade -y
# 安装 Ruby 和构建工具sudo apt install -y ruby ruby-dev build-essential gitsudo gem install bundler
# 安装 Redissudo apt install -y redis-serversudo systemctl enable redis-serversudo systemctl start redis-server
# 安装 Node.js(用于开发和构建前端资源)curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -sudo apt install -y nodejssudo npm install -g pnpm@latestCentOS/RHEL 8:
# 启用 PowerTools/CodeReady 仓库sudo dnf install -y dnf-plugins-coresudo dnf config-manager --set-enabled powertools
# 安装 Ruby 和开发工具sudo dnf groupinstall -y "Development Tools"sudo dnf install -y ruby ruby-devel gitsudo gem install bundler
# 安装 Redissudo dnf install -y redissudo systemctl enable redissudo systemctl start redis应用程序设置
Section titled “应用程序设置”# 创建应用程序用户sudo useradd -r -m -s /bin/bash onetime
# 切换到应用程序用户sudo su - onetime
# 克隆仓库git clone https://github.com/onetimesecret/onetimesecret.gitcd onetimesecret
# 安装依赖项bundle install --deployment --without development test
# 复制并配置环境cp .env.example .envcp ./etc/config.example.yaml ./etc/config.yaml
# 创建提交哈希以进行版本跟踪git rev-parse --short HEAD > .commit_hash.txt反向代理配置
Section titled “反向代理配置”这些配置示例可以帮助您入门,但您应该根据您的特定需求进行调整。
基本配置:
server { listen 80; server_name your-domain.com; return 301 https://$server_name$request_uri;}
server { listen 443 ssl http2; server_name your-domain.com;
# SSL 配置 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
# 安全标头 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options DENY always; add_header X-Content-Type-Options nosniff always;
# 来自构建的前端的静态文件 location /dist/ { root /app/public; expires 1y; add_header Cache-Control "public, immutable"; try_files $uri $uri/ =404; }
# API 请求到后端 location /api/ { proxy_pass http://127.0.0.1:3000; 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; }
# 所有其他请求到后端 location / { proxy_pass http://127.0.0.1:3000; 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;
# WebSocket 支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }}启用站点:
sudo ln -s /etc/nginx/sites-available/onetime /etc/nginx/sites-enabled/sudo nginx -tsudo systemctl reload nginxCaddy 提供自动 HTTPS 和更简单的配置:
your-domain.com { # 处理来自构建的前端的静态文件 handle /dist/* { root * /app/public file_server }
# API 请求到后端 handle /api/* { reverse_proxy 127.0.0.1:3000 }
# 所有其他请求到后端(用于服务器渲染的页面) handle { reverse_proxy 127.0.0.1:3000 }}Apache
Section titled “Apache”<VirtualHost *:80> ServerName your-domain.com Redirect permanent / https://your-domain.com/</VirtualHost>
<VirtualHost *:443> ServerName your-domain.com
# SSL 配置 SSLEngine on SSLCertificateFile /path/to/your/cert.pem SSLCertificateKeyFile /path/to/your/key.pem
# 安全标头 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff
# 来自构建的前端的静态文件 Alias /dist /app/public/dist <Directory /app/public/dist> Require all granted ExpiresActive On ExpiresDefault "access plus 1 year" </Directory>
# API 和应用程序请求到后端 ProxyPreserveHost On ProxyPass /dist ! ProxyPass / http://127.0.0.1:3000/ ProxyPassReverse / http://127.0.0.1:3000/</VirtualHost>SSL/TLS 配置
Section titled “SSL/TLS 配置”Let’s Encrypt (Certbot)
Section titled “Let’s Encrypt (Certbot)”安装 Certbot:
# Ubuntu/Debiansudo apt install certbot python3-certbot-nginx
# CentOS/RHELsudo dnf install certbot python3-certbot-nginx生成证书:
# 用于 Nginxsudo certbot --nginx -d your-domain.com
# 用于 Apachesudo certbot --apache -d your-domain.com
# 手动证书(如果使用自定义代理配置)sudo certbot certonly --webroot -w /var/www/html -d your-domain.com自动续期:
# 添加到 crontabecho "0 12 * * * /usr/bin/certbot renew --quiet" | sudo tee -a /etc/crontab自定义 SSL 证书
Section titled “自定义 SSL 证书”放置您的证书并在代理配置中更新路径:
# 证书文件/etc/ssl/certs/your-domain.com.crt/etc/ssl/private/your-domain.com.key
# 设置适当的权限sudo chmod 600 /etc/ssl/private/your-domain.com.keysudo chmod 644 /etc/ssl/certs/your-domain.com.crtRedis 配置
Section titled “Redis 配置”选项 1:仅内存(永不保存到磁盘以实现最大安全性):
# 内存优化maxmemory 1gbmaxmemory-policy allkeys-lru
# 安全性 - 机密内容永不写入磁盘save "" # 禁用所有自动保存appendonly no # 禁用 AOF 日志
# 安全性requirepass your_redis_passwordbind 127.0.0.1
# 性能tcp-keepalive 60timeout 300选项 2:磁盘持久化(启用备份但将机密内容写入磁盘):
# 内存优化maxmemory 1gbmaxmemory-policy allkeys-lru
# RDB 快照 - 创建 dump.rdb 文件save 900 1 # 如果在 900 秒内至少有 1 个键更改则保存save 300 10 # 如果在 300 秒内至少有 10 个键更改则保存save 60 10000 # 如果在 60 秒内至少有 10000 个键更改则保存
# AOF 日志 - 创建 appendonly.aof 文件以进行时间点恢复appendonly yesappendfsync everysec # 每秒同步到磁盘
# 安全性requirepass your_redis_passwordbind 127.0.0.1
# 性能tcp-keepalive 60timeout 300重要提示:启用磁盘持久化后,机密内容将写入:
dump.rdb文件(间隔快照)appendonly.aof文件(连续追加日志)
根据您的安全性与备份需求进行选择。
重启 Redis:
sudo systemctl restart redisRedis 备份
Section titled “Redis 备份”Redis:
#!/bin/bash# Redis 备份脚本BACKUP_DIR="/var/backups/onetime"DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 创建备份redis-cli -a "$REDIS_PASSWORD" --rdb $BACKUP_DIR/redis_$DATE.rdb
# 清理旧备份find $BACKUP_DIR -name "redis_*.rdb" -mtime +7 -delete成功部署后:
- 配置您的实例 使用自定义设置
- 设置监控和警报 用于生产运营
- 查看安全设置 并启用额外保护
- 配置备份自动化 并测试恢复程序
- 为您的组织设置自定义域名
您的 Onetime Secret 实例现在已准备好用于生产!