name: 从.env到fnox description: 当用户想要从.env文件迁移到fnox和1Password(或其他秘密提供者)时,应使用此技能。它包括安装fnox、创建1Password项目、配置fnox.toml和集成mise。当用户提到".env迁移"、“fnox设置”、"1password秘密"或想要改进他们的秘密管理工作流程时使用。
从.env迁移到fnox + 1Password
这个技能指导从明文.env文件迁移到使用1Password作为秘密提供者的fnox。fnox是提供者无关的,支持多个后端(1Password、AWS Secrets Manager、Azure Key Vault、HashiCorp Vault、age加密等)。
先决条件
在开始之前,验证:
- 1Password CLI已安装:
op --version - 用户已认证到1Password:
op vault list - mise已安装(可选但推荐):
mise --version
迁移工作流
步骤1:分析现有.env
读取现有的.env文件以了解需要迁移的秘密:
cat .env
对秘密进行分类:
- 云提供商凭证 (AWS_, ARM_, GOOGLE_*)
- API令牌 (CLOUDFLARE_, GITHUB_, etc.)
- 应用秘密 (DATABASE_URL, API_KEY, etc.)
- 配置值 (非秘密默认值如区域)
步骤2:安装fnox
通过mise安装fnox(推荐):
mise use fnox
或添加到mise.toml:
[tools]
fnox = "latest"
初始化fnox配置:
mise exec -- fnox init
mise exec -- fnox provider add op 1password
步骤3:创建1Password项目
创建一个包含所有秘密的单个1Password项目。使用API凭证类别以进行组织:
op item create \
--category="API Credential" \
--title="project-name" \
--vault="Private" \
'Field Name[text]=value' \
'Secret Field[password]=secret-value'
字段命名约定:
- 使用描述性名称:“AWS Access Key ID”而不是“aws_key”
- 使用
[text]表示非敏感值(ID、区域、电子邮件) - 使用
[password]表示敏感值(秘密、令牌、密钥)
典型项目示例:
op item create \
--category="API Credential" \
--title="myproject" \
--vault="Private" \
'AWS Access Key ID[text]=AKIA...' \
'AWS Secret Access Key[password]=...' \
'Database URL[password]=postgres://...' \
'API Token[password]=...'
步骤4:配置fnox.toml
更新fnox.toml以引用1Password项目:
[providers.op]
type = "1password"
vault = "Private"
[secrets]
# 格式:ENV_VAR = { provider = "op", value = "item-title/Field Name" }
AWS_ACCESS_KEY_ID = { provider = "op", value = "myproject/AWS Access Key ID" }
AWS_SECRET_ACCESS_KEY = { provider = "op", value = "myproject/AWS Secret Access Key" }
DATABASE_URL = { provider = "op", value = "myproject/Database URL" }
# 非秘密默认值不需要1Password
AWS_DEFAULT_REGION = { default = "us-east-1" }
步骤5:与mise集成
更新mise.toml以使用fnox而不是.env:
[tools]
fnox = "latest"
# ... 其他工具
[env]
_.source = "fnox export"
移除旧的.env引用:
- _.file = ".env"
+ _.source = "fnox export"
步骤6:验证和清理
测试配置:
# 列出配置的秘密
mise exec -- fnox list
# 验证一个秘密可以检索
mise exec -- fnox get AWS_ACCESS_KEY_ID
# 测试完整环境
mise exec -- printenv | grep AWS_
一旦验证,删除旧的.env文件:
rm .env
提交fnox.toml(它不包含秘密,只包含引用):
git add fnox.toml mise.toml
git commit -m "将秘密从.env迁移到fnox + 1Password"
fnox.toml参考
提供商配置
# 1Password
[providers.op]
type = "1password"
vault = "Private"
# account = "my.1password.com" # 可选:指定账户
# Age加密(用于git存储的加密秘密)
[providers.age]
type = "age"
recipients = ["age1..."]
# AWS Secrets Manager
[providers.aws]
type = "aws-sm"
region = "us-east-1"
prefix = "myapp/"
秘密引用格式
[secrets]
# 1Password:item-title/field-name
SECRET = { provider = "op", value = "myproject/Secret Field" }
# 1Password:完整的op:// URI
SECRET = { provider = "op", value = "op://Vault/Item/Field" }
# 默认值(不需要提供商)
REGION = { default = "us-east-1" }
# Age-encrypted value
SECRET = { provider = "age", value = "YWdlLWVu..." }
多环境配置文件
[providers.op]
type = "1password"
vault = "Development"
[secrets]
DATABASE_URL = { provider = "op", value = "dev-db/url" }
[profiles.production.providers.op]
vault = "Production"
[profiles.production.secrets]
DATABASE_URL = { provider = "op", value = "prod-db/url" }
使用配置文件:FNOX_PROFILE=production fnox export
故障排除
“找不到配置文件”
运行fnox init以创建fnox.toml,或检查是否在正确的目录中。
1Password认证错误
确保已登录:op signin或检查1Password设置>开发者中是否启用了“与其他应用集成”。
秘密未在shell中加载
如果使用mise,确保已为项目目录运行mise trust。
mise安装后找不到fnox命令
使用mise exec -- fnox或重启shell以获取新的PATH。