vaulter 1.0.16 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -1543
- package/dist/cli/commands/audit.js +1 -1
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/delete.d.ts +3 -0
- package/dist/cli/commands/delete.d.ts.map +1 -1
- package/dist/cli/commands/delete.js +28 -16
- package/dist/cli/commands/delete.js.map +1 -1
- package/dist/cli/commands/export/index.d.ts +39 -0
- package/dist/cli/commands/export/index.d.ts.map +1 -0
- package/dist/cli/commands/export/index.js +312 -0
- package/dist/cli/commands/export/index.js.map +1 -0
- package/dist/cli/commands/export.d.ts +2 -0
- package/dist/cli/commands/export.d.ts.map +1 -1
- package/dist/cli/commands/export.js +7 -2
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/get.d.ts +3 -0
- package/dist/cli/commands/get.d.ts.map +1 -1
- package/dist/cli/commands/get.js +33 -7
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/list.d.ts +2 -0
- package/dist/cli/commands/list.d.ts.map +1 -1
- package/dist/cli/commands/list.js +118 -33
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/pull.d.ts +5 -2
- package/dist/cli/commands/pull.d.ts.map +1 -1
- package/dist/cli/commands/pull.js +70 -23
- package/dist/cli/commands/pull.js.map +1 -1
- package/dist/cli/commands/push.d.ts +5 -2
- package/dist/cli/commands/push.d.ts.map +1 -1
- package/dist/cli/commands/push.js +59 -21
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/cli/commands/rotation.js +22 -0
- package/dist/cli/commands/rotation.js.map +1 -1
- package/dist/cli/commands/service/index.d.ts +27 -0
- package/dist/cli/commands/service/index.d.ts.map +1 -0
- package/dist/cli/commands/service/index.js +172 -0
- package/dist/cli/commands/service/index.js.map +1 -0
- package/dist/cli/commands/set.d.ts +2 -0
- package/dist/cli/commands/set.d.ts.map +1 -1
- package/dist/cli/commands/set.js +48 -36
- package/dist/cli/commands/set.js.map +1 -1
- package/dist/cli/commands/sync/index.d.ts +31 -0
- package/dist/cli/commands/sync/index.d.ts.map +1 -0
- package/dist/cli/commands/sync/index.js +237 -0
- package/dist/cli/commands/sync/index.js.map +1 -0
- package/dist/cli/commands/var/index.d.ts +31 -0
- package/dist/cli/commands/var/index.d.ts.map +1 -0
- package/dist/cli/commands/var/index.js +98 -0
- package/dist/cli/commands/var/index.js.map +1 -0
- package/dist/cli/index.js +181 -125
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/audit-helper.js +1 -1
- package/dist/cli/lib/audit-helper.js.map +1 -1
- package/dist/cli/lib/colors.d.ts +105 -0
- package/dist/cli/lib/colors.d.ts.map +1 -0
- package/dist/cli/lib/colors.js +186 -0
- package/dist/cli/lib/colors.js.map +1 -0
- package/dist/cli/tui/audit-viewer.d.ts +13 -1
- package/dist/cli/tui/audit-viewer.d.ts.map +1 -1
- package/dist/cli/tui/audit-viewer.js +57 -18
- package/dist/cli/tui/audit-viewer.js.map +1 -1
- package/dist/cli/tui/dashboard.d.ts +13 -1
- package/dist/cli/tui/dashboard.d.ts.map +1 -1
- package/dist/cli/tui/dashboard.js +53 -38
- package/dist/cli/tui/dashboard.js.map +1 -1
- package/dist/cli/tui/key-manager.d.ts +11 -0
- package/dist/cli/tui/key-manager.d.ts.map +1 -1
- package/dist/cli/tui/key-manager.js +18 -8
- package/dist/cli/tui/key-manager.js.map +1 -1
- package/dist/cli/tui/launcher.d.ts.map +1 -1
- package/dist/cli/tui/launcher.js +24 -24
- package/dist/cli/tui/launcher.js.map +1 -1
- package/dist/cli/ui.d.ts +17 -0
- package/dist/cli/ui.d.ts.map +1 -1
- package/dist/cli/ui.js +50 -15
- package/dist/cli/ui.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +2 -1
- package/dist/client.js.map +1 -1
- package/dist/lib/audit.d.ts +1 -1
- package/dist/lib/audit.d.ts.map +1 -1
- package/dist/lib/audit.js +3 -2
- package/dist/lib/audit.js.map +1 -1
- package/dist/lib/shared.d.ts +77 -0
- package/dist/lib/shared.d.ts.map +1 -0
- package/dist/lib/shared.js +140 -0
- package/dist/lib/shared.js.map +1 -0
- package/dist/mcp/prompts.d.ts +2 -0
- package/dist/mcp/prompts.d.ts.map +1 -1
- package/dist/mcp/prompts.js +316 -0
- package/dist/mcp/prompts.js.map +1 -1
- package/dist/mcp/resources.d.ts +15 -12
- package/dist/mcp/resources.d.ts.map +1 -1
- package/dist/mcp/resources.js +285 -510
- package/dist/mcp/resources.js.map +1 -1
- package/dist/mcp/server.d.ts +5 -5
- package/dist/mcp/server.js +5 -5
- package/dist/mcp/tools.d.ts +2 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +429 -6
- package/dist/mcp/tools.js.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,1440 +1,265 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
#
|
|
3
|
+
# vaulter
|
|
4
4
|
|
|
5
5
|
### Multi-Backend Environment & Secrets Manager
|
|
6
6
|
|
|
7
|
-
**One CLI to manage all your environment variables.**
|
|
8
|
-
|
|
9
7
|
[](https://www.npmjs.com/package/vaulter)
|
|
10
8
|
[](https://www.typescriptlang.org/)
|
|
11
9
|
[](https://nodejs.org/)
|
|
12
10
|
[](https://modelcontextprotocol.io/)
|
|
13
|
-
[](https://github.com/forattini-dev/vaulter/blob/main/LICENSE)
|
|
14
|
-
|
|
15
|
-
Store secrets anywhere: AWS S3, MinIO, R2, Spaces, B2, or local filesystem.
|
|
16
|
-
<br>
|
|
17
|
-
AES-256-GCM encryption. RSA/EC hybrid encryption. Native K8s, Helm & Terraform integration.
|
|
18
|
-
|
|
19
|
-
[Quick Start](#quick-start) · [Security](#security) · [CI/CD](#cicd) · [Commands](#commands)
|
|
20
|
-
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## Installation
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
# One-liner (recommended)
|
|
29
|
-
curl -fsSL https://raw.githubusercontent.com/forattini-dev/vaulter/main/install.sh | sh
|
|
30
|
-
|
|
31
|
-
# Or via npm/pnpm
|
|
32
|
-
npm install -g vaulter
|
|
33
|
-
pnpm add -g vaulter
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Quick Start
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
# Initialize project
|
|
40
|
-
vaulter init
|
|
41
|
-
|
|
42
|
-
# Set secrets (encrypted, synced to backend)
|
|
43
|
-
vaulter set DATABASE_URL="postgres://localhost/mydb" -e dev
|
|
44
|
-
|
|
45
|
-
# Export to shell
|
|
46
|
-
eval $(vaulter export -e dev)
|
|
47
|
-
|
|
48
|
-
# Deploy to Kubernetes
|
|
49
|
-
vaulter k8s:secret -e prd | kubectl apply -f -
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
---
|
|
53
|
-
|
|
54
|
-
## Table of Contents
|
|
55
|
-
|
|
56
|
-
- [Why Vaulter?](#why-vaulter)
|
|
57
|
-
- [Security](#security)
|
|
58
|
-
- [Daily Use](#daily-use)
|
|
59
|
-
- [Audit & Compliance](#audit--compliance)
|
|
60
|
-
- [Secret Rotation](#secret-rotation)
|
|
61
|
-
- [CI/CD](#cicd)
|
|
62
|
-
- [Configuration](#configuration)
|
|
63
|
-
- [Integrations](#integrations)
|
|
64
|
-
- [Monorepo Support](#monorepo-support)
|
|
65
|
-
- [API Usage](#api-usage)
|
|
66
|
-
- [MCP Server](#mcp-server)
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## Why Vaulter?
|
|
71
|
-
|
|
72
|
-
### The Problem
|
|
73
|
-
|
|
74
|
-
Environment variables and secrets are scattered across `.env` files, CI/CD settings, cloud consoles, and team Slack messages. This creates:
|
|
75
|
-
|
|
76
|
-
- **Security gaps**: Secrets in plaintext files, git history, or shared docs
|
|
77
|
-
- **Sync issues**: "Works on my machine" because `.env` files differ
|
|
78
|
-
- **Deploy friction**: Manual copy-paste between environments
|
|
79
|
-
- **Audit blindness**: No idea who changed what, when
|
|
80
|
-
|
|
81
|
-
### The Solution
|
|
82
|
-
|
|
83
|
-
Vaulter centralizes all environment variables in encrypted storage (S3-compatible) while maintaining the simplicity of `.env` files:
|
|
84
|
-
|
|
85
|
-
| Traditional | With Vaulter |
|
|
86
|
-
|:------------|:-------------|
|
|
87
|
-
| Secrets in plaintext `.env` | Encrypted at rest (AES-256-GCM) |
|
|
88
|
-
| Manual sync between devs | `vaulter pull` / `vaulter push` |
|
|
89
|
-
| Copy-paste to CI/CD | `eval $(vaulter export -e prd)` |
|
|
90
|
-
| No audit trail | Full history via S3 versioning |
|
|
91
|
-
| Different files per machine | Single source of truth |
|
|
92
|
-
|
|
93
|
-
### Why Trust Vaulter?
|
|
94
|
-
|
|
95
|
-
1. **Open source**: All code is auditable
|
|
96
|
-
2. **No lock-in**: Your data lives in YOUR storage (S3, MinIO, R2, filesystem)
|
|
97
|
-
3. **Standard encryption**: AES-256-GCM, the same used by AWS, Google, and banks
|
|
98
|
-
4. **Zero external dependencies**: No SaaS, no API keys, no third-party services
|
|
99
|
-
5. **Offline capable**: Works with local filesystem backend
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## Security
|
|
104
|
-
|
|
105
|
-
### Encryption Model
|
|
106
|
-
|
|
107
|
-
Every secret is encrypted **before** leaving your machine using **AES-256-GCM**:
|
|
108
|
-
|
|
109
|
-
```
|
|
110
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
111
|
-
│ Your Machine │
|
|
112
|
-
│ │
|
|
113
|
-
│ .env file ──► vaulter encrypt ──► encrypted blob ──► S3 │
|
|
114
|
-
│ (AES-256-GCM) (unreadable) │
|
|
115
|
-
│ │
|
|
116
|
-
│ S3 ──► encrypted blob ──► vaulter decrypt ──► .env file │
|
|
117
|
-
│ (unreadable) (AES-256-GCM) │
|
|
118
|
-
└─────────────────────────────────────────────────────────────┘
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
**What this means:**
|
|
122
|
-
- The backend (S3, MinIO, etc.) only sees encrypted data
|
|
123
|
-
- Even with S3 access, secrets are unreadable without the key
|
|
124
|
-
- Each value is encrypted individually (field-level encryption)
|
|
125
|
-
- Authenticated encryption prevents tampering (GCM mode)
|
|
126
|
-
|
|
127
|
-
### Key Management
|
|
128
|
-
|
|
129
|
-
Vaulter stores keys in `~/.vaulter/` directory (outside project) for security:
|
|
130
|
-
|
|
131
|
-
```
|
|
132
|
-
~/.vaulter/
|
|
133
|
-
├── projects/
|
|
134
|
-
│ └── <project-name>/
|
|
135
|
-
│ └── keys/
|
|
136
|
-
│ ├── master # Private key (mode 600)
|
|
137
|
-
│ └── master.pub # Public key (mode 644)
|
|
138
|
-
└── global/
|
|
139
|
-
└── keys/ # Shared across all projects
|
|
140
|
-
├── shared
|
|
141
|
-
└── shared.pub
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
#### Key Commands
|
|
145
|
-
|
|
146
|
-
```bash
|
|
147
|
-
# Generate keys
|
|
148
|
-
vaulter key generate --name master # Symmetric key
|
|
149
|
-
vaulter key generate --name master --asymmetric # RSA-4096 key pair
|
|
150
|
-
vaulter key generate --name master --asym --alg ec-p256 # EC P-256 key pair
|
|
151
|
-
vaulter key generate --name shared --global # Global key (all projects)
|
|
152
|
-
|
|
153
|
-
# List and show keys
|
|
154
|
-
vaulter key list # List all keys (project + global)
|
|
155
|
-
vaulter key show --name master # Show key details
|
|
156
|
-
|
|
157
|
-
# Export/import for deployment
|
|
158
|
-
vaulter key export --name master -o keys.enc # Export encrypted bundle
|
|
159
|
-
vaulter key import -f keys.enc # Import on another machine
|
|
160
|
-
|
|
161
|
-
# Set VAULTER_EXPORT_PASSPHRASE to encrypt the bundle with custom passphrase
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
#### Configuration with key_name
|
|
165
|
-
|
|
166
|
-
The simplest way to use keys is via `key_name` resolution:
|
|
167
|
-
|
|
168
|
-
```yaml
|
|
169
|
-
# .vaulter/config.yaml
|
|
170
|
-
encryption:
|
|
171
|
-
mode: asymmetric
|
|
172
|
-
asymmetric:
|
|
173
|
-
algorithm: rsa-4096
|
|
174
|
-
key_name: master # → ~/.vaulter/projects/<project>/keys/master[.pub]
|
|
175
|
-
# Or for global key:
|
|
176
|
-
# key_name: global:master # → ~/.vaulter/global/keys/master[.pub]
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
#### Legacy Key Sources (still supported)
|
|
180
|
-
|
|
181
|
-
You can also specify explicit key sources:
|
|
182
|
-
|
|
183
|
-
```yaml
|
|
184
|
-
encryption:
|
|
185
|
-
key_source:
|
|
186
|
-
- env: VAULTER_KEY # 1. Environment variable (CI/CD)
|
|
187
|
-
- file: .vaulter/.key # 2. Local file (development)
|
|
188
|
-
- s3: s3://keys/vaulter.key # 3. Remote S3 (shared teams)
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
##### Option 1: Environment Variable (Recommended for CI/CD)
|
|
192
|
-
|
|
193
|
-
```bash
|
|
194
|
-
# Generate a key
|
|
195
|
-
vaulter key generate --name master
|
|
196
|
-
|
|
197
|
-
# Set in CI/CD secrets from the generated key
|
|
198
|
-
export VAULTER_KEY=$(cat ~/.vaulter/projects/myproject/keys/master)
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
**Pros**: Key never in project directory, rotates easily via CI/CD secret rotation
|
|
202
|
-
**Use case**: GitHub Actions, GitLab CI, Jenkins
|
|
203
|
-
|
|
204
|
-
##### Option 2: key_name Resolution (Recommended for Development)
|
|
205
|
-
|
|
206
|
-
```yaml
|
|
207
|
-
encryption:
|
|
208
|
-
mode: asymmetric
|
|
209
|
-
asymmetric:
|
|
210
|
-
key_name: master # Auto-resolves to ~/.vaulter/projects/<project>/keys/
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
**Pros**: Simple, keys stored securely outside project
|
|
214
|
-
**Use case**: Local development, team workflows
|
|
215
|
-
|
|
216
|
-
##### Option 3: Remote S3 (Team Shared)
|
|
217
|
-
|
|
218
|
-
```yaml
|
|
219
|
-
encryption:
|
|
220
|
-
key_source:
|
|
221
|
-
- s3: s3://company-keys/vaulter/project.key?region=us-east-1
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
**Pros**: Centralized key management, IAM-controlled access
|
|
225
|
-
**Use case**: Teams, multiple developers needing same key
|
|
226
|
-
|
|
227
|
-
### Asymmetric Key Encryption (RSA/EC)
|
|
228
|
-
|
|
229
|
-
For enhanced security with separate encrypt/decrypt permissions, Vaulter supports hybrid encryption using RSA or Elliptic Curve key pairs.
|
|
230
|
-
|
|
231
|
-
#### How It Works
|
|
232
|
-
|
|
233
|
-
```
|
|
234
|
-
┌────────────────────────────────────────────────────────────────┐
|
|
235
|
-
│ Hybrid Encryption │
|
|
236
|
-
│ │
|
|
237
|
-
│ Your secret ──► AES-256-GCM ──► Encrypted data │
|
|
238
|
-
│ │ │
|
|
239
|
-
│ │ (random AES key) │
|
|
240
|
-
│ ▼ │
|
|
241
|
-
│ Public key ──► RSA/EC encrypt ──► Encrypted AES key │
|
|
242
|
-
│ │
|
|
243
|
-
│ Stored: { encrypted_key + encrypted_data + metadata } │
|
|
244
|
-
│ │
|
|
245
|
-
│ Decryption requires: Private key + Encrypted blob │
|
|
246
|
-
└────────────────────────────────────────────────────────────────┘
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
**Benefits:**
|
|
250
|
-
- **Separation of duties**: Public key can only encrypt, private key can decrypt
|
|
251
|
-
- **CI/CD security**: Give CI/CD only the public key - it can write but not read secrets
|
|
252
|
-
- **Production isolation**: Only production has the private key for decryption
|
|
253
|
-
|
|
254
|
-
#### Generate Key Pair
|
|
255
|
-
|
|
256
|
-
```bash
|
|
257
|
-
# RSA 4096-bit (default, most compatible)
|
|
258
|
-
vaulter key generate --name master --asymmetric
|
|
259
|
-
|
|
260
|
-
# RSA 2048-bit (faster, less secure)
|
|
261
|
-
vaulter key generate --name master --asym --algorithm rsa-2048
|
|
262
|
-
|
|
263
|
-
# Elliptic Curve P-256 (modern, fast)
|
|
264
|
-
vaulter key generate --name master --asym --alg ec-p256
|
|
265
|
-
|
|
266
|
-
# Elliptic Curve P-384 (stronger EC)
|
|
267
|
-
vaulter key generate --name master --asym --alg ec-p384
|
|
268
|
-
|
|
269
|
-
# Global key (shared across all projects)
|
|
270
|
-
vaulter key generate --name shared --global --asymmetric
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
Output:
|
|
274
|
-
```
|
|
275
|
-
✓ Generated rsa-4096 key pair: master
|
|
276
|
-
Private: ~/.vaulter/projects/my-project/keys/master (mode 600 - keep secret!)
|
|
277
|
-
Public: ~/.vaulter/projects/my-project/keys/master.pub (mode 644)
|
|
278
|
-
|
|
279
|
-
To use these keys in config.yaml:
|
|
280
|
-
encryption:
|
|
281
|
-
mode: asymmetric
|
|
282
|
-
asymmetric:
|
|
283
|
-
algorithm: rsa-4096
|
|
284
|
-
key_name: master
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
#### Configuration
|
|
288
|
-
|
|
289
|
-
```yaml
|
|
290
|
-
# .vaulter/config.yaml
|
|
291
|
-
encryption:
|
|
292
|
-
mode: asymmetric # Enable asymmetric mode
|
|
293
|
-
asymmetric:
|
|
294
|
-
algorithm: rsa-4096 # or rsa-2048, ec-p256, ec-p384
|
|
295
|
-
key_name: master # Uses ~/.vaulter/projects/<project>/keys/master[.pub]
|
|
296
|
-
# Or for global keys:
|
|
297
|
-
# key_name: global:master # Uses ~/.vaulter/global/keys/master[.pub]
|
|
298
|
-
|
|
299
|
-
# Alternative: explicit key sources (for CI/CD or custom paths)
|
|
300
|
-
# encryption:
|
|
301
|
-
# mode: asymmetric
|
|
302
|
-
# asymmetric:
|
|
303
|
-
# algorithm: rsa-4096
|
|
304
|
-
# public_key:
|
|
305
|
-
# - file: /path/to/master.pub
|
|
306
|
-
# - env: VAULTER_PUBLIC_KEY
|
|
307
|
-
# private_key:
|
|
308
|
-
# - file: /path/to/master
|
|
309
|
-
# - env: VAULTER_PRIVATE_KEY
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
#### Supported Algorithms
|
|
313
|
-
|
|
314
|
-
| Algorithm | Key Size | Performance | Use Case |
|
|
315
|
-
|:----------|:---------|:------------|:---------|
|
|
316
|
-
| `rsa-4096` | 4096 bits | Slower | Maximum security, wide compatibility |
|
|
317
|
-
| `rsa-2048` | 2048 bits | Medium | Good balance, legacy systems |
|
|
318
|
-
| `ec-p256` | 256 bits | Fast | Modern systems, smaller keys |
|
|
319
|
-
| `ec-p384` | 384 bits | Medium | Higher security EC |
|
|
320
|
-
|
|
321
|
-
#### Use Case: Secure CI/CD Pipeline
|
|
322
|
-
|
|
323
|
-
```
|
|
324
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
325
|
-
│ Development │
|
|
326
|
-
│ Developers have BOTH keys → can read and write secrets │
|
|
327
|
-
│ vaulter set API_KEY="..." -e dev │
|
|
328
|
-
└──────────────────────────┬──────────────────────────────────┘
|
|
329
|
-
│
|
|
330
|
-
▼
|
|
331
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
332
|
-
│ CI/CD (GitHub Actions, Jenkins, etc.) │
|
|
333
|
-
│ Only PUBLIC key → can write NEW secrets, cannot read │
|
|
334
|
-
│ Useful for automated secret rotation scripts │
|
|
335
|
-
│ │
|
|
336
|
-
│ env: │
|
|
337
|
-
│ VAULTER_PUBLIC_KEY: ${{ secrets.VAULTER_PUBLIC_KEY }} │
|
|
338
|
-
└──────────────────────────┬──────────────────────────────────┘
|
|
339
|
-
│
|
|
340
|
-
▼
|
|
341
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
342
|
-
│ Production │
|
|
343
|
-
│ Only PRIVATE key → can read secrets at runtime │
|
|
344
|
-
│ │
|
|
345
|
-
│ env: │
|
|
346
|
-
│ VAULTER_PRIVATE_KEY: ${{ secrets.VAULTER_PRIVATE_KEY }} │
|
|
347
|
-
│ │
|
|
348
|
-
│ # Application reads secrets at startup │
|
|
349
|
-
│ eval $(vaulter export -e prd) │
|
|
350
|
-
└─────────────────────────────────────────────────────────────┘
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
#### Environment Variables
|
|
354
|
-
|
|
355
|
-
| Variable | Purpose |
|
|
356
|
-
|:---------|:--------|
|
|
357
|
-
| `VAULTER_PUBLIC_KEY` | Public key PEM content (for encryption) |
|
|
358
|
-
| `VAULTER_PRIVATE_KEY` | Private key PEM content (for decryption) |
|
|
359
|
-
|
|
360
|
-
### Advanced Security Configurations
|
|
361
|
-
|
|
362
|
-
#### AWS KMS Integration (Planned)
|
|
363
|
-
|
|
364
|
-
For enterprises requiring HSM-backed keys:
|
|
365
|
-
|
|
366
|
-
```yaml
|
|
367
|
-
encryption:
|
|
368
|
-
kms:
|
|
369
|
-
key_id: arn:aws:kms:us-east-1:123456789:key/abc-123
|
|
370
|
-
# Key never leaves AWS KMS
|
|
371
|
-
# Envelope encryption: KMS encrypts the data key
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
**How it works:**
|
|
375
|
-
1. Vaulter generates a data encryption key (DEK)
|
|
376
|
-
2. DEK encrypts your secrets locally
|
|
377
|
-
3. AWS KMS encrypts the DEK (envelope encryption)
|
|
378
|
-
4. Only encrypted DEK + encrypted secrets are stored
|
|
379
|
-
5. Decryption requires both KMS access AND S3 access
|
|
380
|
-
|
|
381
|
-
### Threat Model
|
|
382
|
-
|
|
383
|
-
| Threat | Protection |
|
|
384
|
-
|:-------|:-----------|
|
|
385
|
-
| S3 bucket breach | Data encrypted, key required |
|
|
386
|
-
| Key file leaked | Rotate key, re-encrypt |
|
|
387
|
-
| Man-in-middle | TLS + authenticated encryption |
|
|
388
|
-
| Malicious insider | Audit logs via S3 versioning |
|
|
389
|
-
| Accidental git commit | Secrets encrypted in .env |
|
|
390
|
-
|
|
391
|
-
### Security Best Practices
|
|
392
|
-
|
|
393
|
-
```bash
|
|
394
|
-
# ✅ DO
|
|
395
|
-
vaulter key generate # Random 256-bit key
|
|
396
|
-
echo ".vaulter/.key" >> .gitignore # Never commit keys
|
|
397
|
-
export VAULTER_KEY="${{ secrets.KEY }}" # CI/CD secrets
|
|
398
|
-
|
|
399
|
-
# ❌ DON'T
|
|
400
|
-
echo "password123" > .vaulter/.key # Weak key
|
|
401
|
-
git add .vaulter/.key # Exposed key
|
|
402
|
-
vaulter set KEY=val --key "hardcoded" # Key in command history
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
---
|
|
406
|
-
|
|
407
|
-
## Daily Use
|
|
408
|
-
|
|
409
|
-
### Workflow Overview
|
|
410
|
-
|
|
411
|
-
```bash
|
|
412
|
-
# Morning: sync with team's changes
|
|
413
|
-
vaulter pull -e dev
|
|
414
|
-
|
|
415
|
-
# During development: add new variable
|
|
416
|
-
vaulter set NEW_API_KEY="sk-xxx" -e dev
|
|
417
|
-
|
|
418
|
-
# End of day: push changes
|
|
419
|
-
vaulter push -e dev
|
|
420
|
-
|
|
421
|
-
# Deploy: export to production
|
|
422
|
-
vaulter k8s:secret -e prd | kubectl apply -f -
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
### Commands Reference
|
|
426
|
-
|
|
427
|
-
#### Core Commands
|
|
428
|
-
|
|
429
|
-
| Command | Description | Example |
|
|
430
|
-
|:--------|:------------|:--------|
|
|
431
|
-
| `init` | Initialize project | `vaulter init` |
|
|
432
|
-
| `get <key>` | Get a variable | `vaulter get DATABASE_URL -e prd` |
|
|
433
|
-
| `set KEY=val` | Set secrets (batch) | `vaulter set A=1 B=2 -e prd` |
|
|
434
|
-
| `set KEY::val` | Set configs (plain) | `vaulter set PORT::3000 -e dev` |
|
|
435
|
-
| `delete <key>` | Delete a variable | `vaulter delete OLD_KEY -e dev` |
|
|
436
|
-
| `list` | List all variables | `vaulter list -e prd` |
|
|
437
|
-
| `list --all-envs` | List across all envs | `vaulter list --all-envs` |
|
|
438
|
-
| `export` | Export for shell | `eval $(vaulter export -e dev)` |
|
|
439
|
-
|
|
440
|
-
#### Sync Commands
|
|
441
|
-
|
|
442
|
-
| Command | Description | Example |
|
|
443
|
-
|:--------|:------------|:--------|
|
|
444
|
-
| `sync` | Merge local and backend | `vaulter sync -e dev` |
|
|
445
|
-
| `pull` | Download from backend | `vaulter pull -e prd` |
|
|
446
|
-
| `push` | Upload to backend | `vaulter push -e dev` |
|
|
447
|
-
|
|
448
|
-
#### Integration Commands
|
|
449
|
-
|
|
450
|
-
| Command | Description | Example |
|
|
451
|
-
|:--------|:------------|:--------|
|
|
452
|
-
| `k8s:secret` | Kubernetes Secret | `vaulter k8s:secret -e prd` |
|
|
453
|
-
| `k8s:configmap` | Kubernetes ConfigMap | `vaulter k8s:configmap -e prd` |
|
|
454
|
-
| `helm:values` | Helm values.yaml | `vaulter helm:values -e prd` |
|
|
455
|
-
| `tf:vars` | Terraform .tfvars | `vaulter tf:vars -e prd` |
|
|
456
|
-
| `scan` | Scan monorepo | `vaulter scan` |
|
|
457
|
-
|
|
458
|
-
#### Audit Commands
|
|
459
|
-
|
|
460
|
-
| Command | Description | Example |
|
|
461
|
-
|:--------|:------------|:--------|
|
|
462
|
-
| `audit list` | List audit entries | `vaulter audit list -e prd` |
|
|
463
|
-
| `audit show` | Show entry details | `vaulter audit show <id>` |
|
|
464
|
-
| `audit stats` | Show statistics | `vaulter audit stats -e prd` |
|
|
465
|
-
| `audit cleanup` | Delete old entries | `vaulter audit cleanup --retention 30` |
|
|
466
|
-
|
|
467
|
-
#### Rotation Commands
|
|
468
|
-
|
|
469
|
-
| Command | Description | Example |
|
|
470
|
-
|:--------|:------------|:--------|
|
|
471
|
-
| `rotation list` | Show rotation status | `vaulter rotation list -e prd` |
|
|
472
|
-
| `rotation run` | Run rotation check | `vaulter rotation run -e prd --clear` |
|
|
473
|
-
|
|
474
|
-
### Set Command Syntax
|
|
475
|
-
|
|
476
|
-
```bash
|
|
477
|
-
# Secrets (encrypted, synced to backend)
|
|
478
|
-
vaulter set KEY=value # Single secret
|
|
479
|
-
vaulter set A=1 B=2 C=3 -e dev # Batch secrets
|
|
480
|
-
vaulter set KEY:=123 # Typed (number/boolean)
|
|
481
|
-
|
|
482
|
-
# Configs (plain text in split mode)
|
|
483
|
-
vaulter set PORT::3000 HOST::localhost # Configs
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
| Separator | Type | Backend Sync | Encrypted |
|
|
487
|
-
|:----------|:-----|:-------------|:----------|
|
|
488
|
-
| `=` | Secret | ✓ | ✓ |
|
|
489
|
-
| `:=` | Secret (typed) | ✓ | ✓ |
|
|
490
|
-
| `::` | Config | Split: ✗ / Unified: ✓ | ✓ |
|
|
491
|
-
|
|
492
|
-
### Global Options
|
|
493
|
-
|
|
494
|
-
```
|
|
495
|
-
-p, --project <name> Project name
|
|
496
|
-
-s, --service <name> Service name (monorepos)
|
|
497
|
-
-e, --env <env> Environment name (as defined in config)
|
|
498
|
-
-b, --backend <url> Backend URL override
|
|
499
|
-
-k, --key <path|value> Encryption key
|
|
500
|
-
-f, --file <path> Input file path
|
|
501
|
-
-o, --output <path> Output file path
|
|
502
|
-
-n, --namespace <name> Kubernetes namespace
|
|
503
|
-
--format <fmt> Output format (shell/json/yaml/env/tfvars/docker-args)
|
|
504
|
-
-v, --verbose Verbose output (shows values)
|
|
505
|
-
--dry-run Preview without applying
|
|
506
|
-
--json JSON output
|
|
507
|
-
--force Skip confirmations
|
|
508
|
-
--all Apply to all services in monorepo
|
|
509
|
-
```
|
|
510
|
-
|
|
511
|
-
### Flexible Environment Names
|
|
512
|
-
|
|
513
|
-
Vaulter lets you define your own environment names. Use whatever convention fits your workflow:
|
|
514
|
-
|
|
515
|
-
```yaml
|
|
516
|
-
# Short names (default)
|
|
517
|
-
environments: [dev, stg, prd]
|
|
518
|
-
|
|
519
|
-
# Full names
|
|
520
|
-
environments: [development, staging, production]
|
|
521
|
-
|
|
522
|
-
# Custom names
|
|
523
|
-
environments: [local, homolog, qa, uat, prod]
|
|
524
|
-
|
|
525
|
-
# Brazilian pattern
|
|
526
|
-
environments: [dev, homolog, prd]
|
|
527
|
-
```
|
|
528
|
-
|
|
529
|
-
All commands use `-e` with your custom names:
|
|
530
|
-
|
|
531
|
-
```bash
|
|
532
|
-
vaulter list -e homolog
|
|
533
|
-
vaulter pull -e development
|
|
534
|
-
vaulter k8s:secret -e uat | kubectl apply -f -
|
|
535
|
-
```
|
|
536
|
-
|
|
537
|
-
---
|
|
538
|
-
|
|
539
|
-
## Audit & Compliance
|
|
540
|
-
|
|
541
|
-
Vaulter includes built-in audit logging to track every change to your secrets. Essential for compliance (SOC2, HIPAA, PCI-DSS) and debugging "who changed what, when".
|
|
542
|
-
|
|
543
|
-
### Why Audit?
|
|
544
|
-
|
|
545
|
-
```
|
|
546
|
-
┌─────────────────────────────────────────────────────────────────┐
|
|
547
|
-
│ Without Audit Logging │
|
|
548
|
-
│ │
|
|
549
|
-
│ Developer: "Who deleted the API_KEY in production?" │
|
|
550
|
-
│ Team: 🤷 "No idea, check git blame? It's not in the repo..." │
|
|
551
|
-
│ │
|
|
552
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
553
|
-
|
|
554
|
-
┌─────────────────────────────────────────────────────────────────┐
|
|
555
|
-
│ With Vaulter Audit │
|
|
556
|
-
│ │
|
|
557
|
-
│ $ vaulter audit list -e prd --pattern "API_KEY" │
|
|
558
|
-
│ │
|
|
559
|
-
│ TIMESTAMP USER OP KEY ENV SRC │
|
|
560
|
-
│ 2025-01-15 14:32:01 john delete API_KEY prd cli │
|
|
561
|
-
│ 2025-01-10 09:15:22 jane set API_KEY prd sync │
|
|
562
|
-
│ 2025-01-05 11:00:00 deploy set API_KEY prd ci │
|
|
563
|
-
│ │
|
|
564
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
565
|
-
```
|
|
566
|
-
|
|
567
|
-
### Configuration
|
|
568
|
-
|
|
569
|
-
```yaml
|
|
570
|
-
# .vaulter/config.yaml
|
|
571
|
-
audit:
|
|
572
|
-
enabled: true # Enable audit logging (default: true)
|
|
573
|
-
retention_days: 90 # Auto-cleanup entries older than N days
|
|
574
|
-
user_source: env # User detection: 'env' (from USER/USERNAME) or custom
|
|
575
|
-
```
|
|
576
|
-
|
|
577
|
-
| Option | Default | Description |
|
|
578
|
-
|:-------|:--------|:------------|
|
|
579
|
-
| `enabled` | `true` | Enable/disable audit logging |
|
|
580
|
-
| `retention_days` | `90` | Auto-cleanup old entries |
|
|
581
|
-
| `user_source` | `'env'` | How to detect current user |
|
|
582
|
-
|
|
583
|
-
### Commands
|
|
584
|
-
|
|
585
|
-
#### List Audit Entries
|
|
586
|
-
|
|
587
|
-
```bash
|
|
588
|
-
# List recent entries (default: 50)
|
|
589
|
-
vaulter audit list -e prd
|
|
590
|
-
|
|
591
|
-
# Filter by user
|
|
592
|
-
vaulter audit list -e prd --user john
|
|
593
|
-
|
|
594
|
-
# Filter by operation
|
|
595
|
-
vaulter audit list -e prd --operation delete
|
|
596
|
-
|
|
597
|
-
# Filter by key pattern (supports wildcards)
|
|
598
|
-
vaulter audit list -e prd --pattern "DATABASE_*"
|
|
599
|
-
|
|
600
|
-
# Filter by date range
|
|
601
|
-
vaulter audit list -e prd --since "2025-01-01" --until "2025-01-15"
|
|
602
|
-
|
|
603
|
-
# Filter by source (cli, mcp, api, loader)
|
|
604
|
-
vaulter audit list -e prd --source cli
|
|
605
|
-
|
|
606
|
-
# Show all environments
|
|
607
|
-
vaulter audit list --all-envs
|
|
608
|
-
|
|
609
|
-
# JSON output for scripting
|
|
610
|
-
vaulter audit list -e prd --json
|
|
611
|
-
|
|
612
|
-
# Combine filters
|
|
613
|
-
vaulter audit list -e prd --user deploy --operation set --limit 100
|
|
614
|
-
```
|
|
615
|
-
|
|
616
|
-
**Output:**
|
|
617
|
-
```
|
|
618
|
-
TIMESTAMP USER OP KEY ENV SRC
|
|
619
|
-
2025-01-15 14:32:01 john delete API_KEY prd cli
|
|
620
|
-
2025-01-15 14:30:00 jane set DATABASE_URL prd cli
|
|
621
|
-
2025-01-15 10:00:00 claude set JWT_SECRET prd mcp
|
|
622
|
-
2025-01-14 16:45:22 jane sync * prd cli
|
|
623
|
-
|
|
624
|
-
Showing 4 entries
|
|
625
|
-
```
|
|
626
|
-
|
|
627
|
-
#### Show Entry Details
|
|
628
|
-
|
|
629
|
-
```bash
|
|
630
|
-
# Get full details of a specific entry
|
|
631
|
-
vaulter audit show <entry-id>
|
|
632
|
-
```
|
|
633
|
-
|
|
634
|
-
**Output:**
|
|
635
|
-
```
|
|
636
|
-
ID: abc123def456
|
|
637
|
-
Timestamp: 2025-01-15 14:32:01
|
|
638
|
-
User: john
|
|
639
|
-
Operation: delete
|
|
640
|
-
Key: API_KEY
|
|
641
|
-
Project: my-project
|
|
642
|
-
Environment: prd
|
|
643
|
-
Source: cli
|
|
644
|
-
Previous: sk-1234****5678
|
|
645
|
-
Metadata: {"reason": "rotating key"}
|
|
646
|
-
```
|
|
647
|
-
|
|
648
|
-
#### Audit Statistics
|
|
649
|
-
|
|
650
|
-
```bash
|
|
651
|
-
# View summary statistics
|
|
652
|
-
vaulter audit stats -e prd
|
|
653
|
-
```
|
|
654
|
-
|
|
655
|
-
**Output:**
|
|
656
|
-
```
|
|
657
|
-
Audit Statistics for my-project/prd
|
|
658
|
-
════════════════════════════════════════
|
|
659
|
-
Total entries: 1,247
|
|
660
|
-
Date range: 2024-10-15 09:00:00 to 2025-01-15 14:32:01
|
|
661
|
-
|
|
662
|
-
By Operation:
|
|
663
|
-
set 892
|
|
664
|
-
delete 124
|
|
665
|
-
sync 156
|
|
666
|
-
push 75
|
|
667
|
-
|
|
668
|
-
By User:
|
|
669
|
-
jane 456
|
|
670
|
-
john 321
|
|
671
|
-
github-ci 470
|
|
672
|
-
|
|
673
|
-
By Source:
|
|
674
|
-
cli 645
|
|
675
|
-
mcp 470
|
|
676
|
-
api 132
|
|
677
|
-
```
|
|
678
|
-
|
|
679
|
-
#### Cleanup Old Entries
|
|
680
|
-
|
|
681
|
-
```bash
|
|
682
|
-
# Cleanup entries older than retention_days (from config)
|
|
683
|
-
vaulter audit cleanup
|
|
684
|
-
|
|
685
|
-
# Override retention period
|
|
686
|
-
vaulter audit cleanup --retention 30
|
|
687
|
-
|
|
688
|
-
# Dry-run to see what would be deleted
|
|
689
|
-
vaulter audit cleanup --retention 30 --dry-run
|
|
690
|
-
```
|
|
691
|
-
|
|
692
|
-
### Automatic Audit Logging
|
|
693
|
-
|
|
694
|
-
Audit entries are created automatically for all write operations:
|
|
695
|
-
|
|
696
|
-
| Operation | Logged Info |
|
|
697
|
-
|:----------|:------------|
|
|
698
|
-
| `set` | Key, previous value (masked), new value (masked) |
|
|
699
|
-
| `delete` | Key, previous value (masked) |
|
|
700
|
-
| `sync` | Keys added, updated, deleted |
|
|
701
|
-
| `push` | Keys added, updated, deleted |
|
|
702
|
-
| `deleteAll` | All deleted keys |
|
|
703
|
-
|
|
704
|
-
### Sources
|
|
705
|
-
|
|
706
|
-
The `source` field indicates where the operation originated:
|
|
707
|
-
|
|
708
|
-
| Source | Description |
|
|
709
|
-
|:-------|:------------|
|
|
710
|
-
| `cli` | Manual CLI command |
|
|
711
|
-
| `mcp` | MCP server (AI assistant) |
|
|
712
|
-
| `api` | Programmatic API usage |
|
|
713
|
-
| `loader` | Auto-load from `vaulter/load` |
|
|
714
|
-
|
|
715
|
-
### Compliance Tips
|
|
716
|
-
|
|
717
|
-
```bash
|
|
718
|
-
# Export audit log for compliance review
|
|
719
|
-
vaulter audit list --all-envs --json > audit-report-$(date +%Y%m).json
|
|
720
|
-
|
|
721
|
-
# Monitor production changes
|
|
722
|
-
vaulter audit list -e prd --since "$(date -d 'yesterday' +%Y-%m-%d)"
|
|
723
|
-
|
|
724
|
-
# Alert on deletions
|
|
725
|
-
vaulter audit list -e prd --operation delete --json | jq '.entries | length'
|
|
726
|
-
```
|
|
727
|
-
|
|
728
|
-
---
|
|
729
|
-
|
|
730
|
-
## Secret Rotation
|
|
731
|
-
|
|
732
|
-
Regular secret rotation is a security best practice. Vaulter tracks rotation schedules and helps you identify secrets that need attention.
|
|
733
|
-
|
|
734
|
-
### Why Rotate?
|
|
735
|
-
|
|
736
|
-
- **Limit exposure**: If a key is compromised, damage is time-limited
|
|
737
|
-
- **Compliance**: Many standards require periodic rotation (PCI-DSS: 90 days)
|
|
738
|
-
- **Access control**: Rotated keys invalidate old access
|
|
739
|
-
- **Audit trail**: Clear history of when credentials changed
|
|
740
|
-
|
|
741
|
-
### How It Works
|
|
742
|
-
|
|
743
|
-
```
|
|
744
|
-
┌─────────────────────────────────────────────────────────────────┐
|
|
745
|
-
│ Rotation Workflow │
|
|
746
|
-
│ │
|
|
747
|
-
│ 1. vaulter rotation list → See what needs rotation │
|
|
748
|
-
│ │
|
|
749
|
-
│ KEY ENV LAST ROTATED ROTATE AFTER STATUS │
|
|
750
|
-
│ DATABASE_URL prd 45 days ago 90 days ✓ OK │
|
|
751
|
-
│ API_KEY prd 120 days ago 90 days ⚠ OVERDUE │
|
|
752
|
-
│ JWT_SECRET prd never 90 days ⚠ OVERDUE │
|
|
753
|
-
│ │
|
|
754
|
-
│ 2. Manually rotate the credential in the external service │
|
|
755
|
-
│ │
|
|
756
|
-
│ 3. vaulter set API_KEY="new-value" -e prd │
|
|
757
|
-
│ → Automatically updates rotatedAt timestamp │
|
|
758
|
-
│ │
|
|
759
|
-
│ 4. vaulter rotation run -e prd --overdue │
|
|
760
|
-
│ → CI/CD gate: fails if secrets are overdue │
|
|
761
|
-
│ │
|
|
762
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
763
|
-
```
|
|
764
|
-
|
|
765
|
-
### Configuration
|
|
766
|
-
|
|
767
|
-
```yaml
|
|
768
|
-
# .vaulter/config.yaml
|
|
769
|
-
encryption:
|
|
770
|
-
rotation:
|
|
771
|
-
enabled: true # Enable rotation tracking
|
|
772
|
-
interval_days: 90 # Default rotation interval
|
|
773
|
-
patterns: # Keys that should be rotated
|
|
774
|
-
- "*_KEY"
|
|
775
|
-
- "*_SECRET"
|
|
776
|
-
- "*_TOKEN"
|
|
777
|
-
- "*_PASSWORD"
|
|
778
|
-
- "DATABASE_URL"
|
|
779
|
-
- "REDIS_URL"
|
|
780
|
-
```
|
|
781
|
-
|
|
782
|
-
| Option | Default | Description |
|
|
783
|
-
|:-------|:--------|:------------|
|
|
784
|
-
| `enabled` | `true` | Enable rotation tracking |
|
|
785
|
-
| `interval_days` | `90` | Default rotation period |
|
|
786
|
-
| `patterns` | `["*_KEY", "*_SECRET", ...]` | Keys to track (glob patterns) |
|
|
787
|
-
|
|
788
|
-
### Commands
|
|
789
|
-
|
|
790
|
-
#### Check Rotation Status
|
|
791
|
-
|
|
792
|
-
```bash
|
|
793
|
-
# Check which secrets need rotation
|
|
794
|
-
vaulter rotation check -e prd
|
|
795
|
-
|
|
796
|
-
# Check all environments
|
|
797
|
-
vaulter rotation check --all-envs
|
|
798
|
-
|
|
799
|
-
# Custom threshold (default: 90 days)
|
|
800
|
-
vaulter rotation check -e prd --days 30
|
|
801
|
-
|
|
802
|
-
# JSON output
|
|
803
|
-
vaulter rotation check -e prd --json
|
|
804
|
-
```
|
|
805
|
-
|
|
806
|
-
**Output:**
|
|
807
|
-
```
|
|
808
|
-
Rotation check for my-project/prd
|
|
809
|
-
Default rotation interval: 90 days
|
|
810
|
-
|
|
811
|
-
⚠️ Secrets needing rotation (2):
|
|
812
|
-
• API_KEY - 120 days old
|
|
813
|
-
• JWT_SECRET - never rotated
|
|
814
|
-
|
|
815
|
-
Summary: 2 need rotation, 2 up to date
|
|
816
|
-
```
|
|
817
|
-
|
|
818
|
-
#### List Rotation Policies
|
|
819
|
-
|
|
820
|
-
```bash
|
|
821
|
-
# List secrets with rotation policies
|
|
822
|
-
vaulter rotation list -e prd
|
|
823
|
-
|
|
824
|
-
# Check all environments
|
|
825
|
-
vaulter rotation list --all-envs
|
|
826
|
-
|
|
827
|
-
# Verbose output with dates
|
|
828
|
-
vaulter rotation list -e prd -v
|
|
829
|
-
```
|
|
830
|
-
|
|
831
|
-
**Output:**
|
|
832
|
-
```
|
|
833
|
-
Secrets with rotation policies (3):
|
|
834
|
-
|
|
835
|
-
• DATABASE_URL - due in 45 days
|
|
836
|
-
• API_KEY - ⚠️ OVERDUE
|
|
837
|
-
• REDIS_URL - due in 34 days
|
|
838
|
-
```
|
|
839
|
-
|
|
840
|
-
#### Set Rotation Policy
|
|
841
|
-
|
|
842
|
-
```bash
|
|
843
|
-
# Set rotation policy for a secret
|
|
844
|
-
vaulter rotation set API_KEY --interval 90d -e prd
|
|
845
|
-
|
|
846
|
-
# Clear rotation policy
|
|
847
|
-
vaulter rotation set API_KEY --clear -e prd
|
|
848
|
-
|
|
849
|
-
# Set with different intervals
|
|
850
|
-
vaulter rotation set JWT_SECRET --interval 30d -e prd
|
|
851
|
-
vaulter rotation set DATABASE_URL --interval 6m -e prd
|
|
852
|
-
```
|
|
853
|
-
|
|
854
|
-
**Supported intervals:** `Nd` (days), `Nw` (weeks), `Nm` (months), `Ny` (years)
|
|
855
|
-
|
|
856
|
-
#### Run Rotation Workflow (CI/CD)
|
|
857
|
-
|
|
858
|
-
```bash
|
|
859
|
-
# CI/CD gate - exits with code 1 if secrets are overdue
|
|
860
|
-
vaulter rotation run -e prd
|
|
861
|
-
|
|
862
|
-
# Only check overdue secrets
|
|
863
|
-
vaulter rotation run -e prd --overdue
|
|
864
|
-
|
|
865
|
-
# Filter by pattern
|
|
866
|
-
vaulter rotation run -e prd --pattern "*_KEY"
|
|
867
|
-
|
|
868
|
-
# Custom threshold
|
|
869
|
-
vaulter rotation run -e prd --days 30
|
|
870
|
-
|
|
871
|
-
# Don't fail even if overdue (for reports)
|
|
872
|
-
vaulter rotation run -e prd --fail=false
|
|
873
|
-
|
|
874
|
-
# JSON output for scripting
|
|
875
|
-
vaulter rotation run -e prd --json
|
|
876
|
-
```
|
|
877
|
-
|
|
878
|
-
**Output:**
|
|
879
|
-
```
|
|
880
|
-
Rotation workflow: my-project
|
|
881
|
-
|
|
882
|
-
⚠️ Secrets requiring rotation (2):
|
|
883
|
-
• API_KEY - 32 days overdue (matched: *_KEY)
|
|
884
|
-
• JWT_SECRET - 120 days overdue
|
|
885
|
-
|
|
886
|
-
To rotate a secret:
|
|
887
|
-
vaulter set <KEY> "<new-value>" -e prd
|
|
888
|
-
|
|
889
|
-
The rotatedAt timestamp will be updated automatically.
|
|
890
|
-
|
|
891
|
-
Summary: 2 overdue, 2 up to date
|
|
892
|
-
```
|
|
893
|
-
|
|
894
|
-
#### Automatic rotatedAt Update
|
|
895
|
-
|
|
896
|
-
When you set a new value, Vaulter automatically tracks when it was last changed:
|
|
897
|
-
|
|
898
|
-
```bash
|
|
899
|
-
# Set new value (automatically updates rotatedAt)
|
|
900
|
-
vaulter set API_KEY="sk-new-rotated-key" -e prd
|
|
901
|
-
|
|
902
|
-
# Verify rotation was tracked
|
|
903
|
-
vaulter rotation check -e prd
|
|
904
|
-
```
|
|
905
|
-
|
|
906
|
-
**Output:**
|
|
907
|
-
```
|
|
908
|
-
Rotation check for my-project/prd
|
|
909
|
-
|
|
910
|
-
✓ Secrets up to date (1):
|
|
911
|
-
• API_KEY - 0 days old
|
|
912
11
|
|
|
913
|
-
|
|
914
|
-
|
|
12
|
+
Store secrets anywhere: AWS S3, MinIO, R2, Spaces, B2, or local filesystem.
|
|
13
|
+
<br>
|
|
14
|
+
AES-256-GCM encryption. Native K8s, Helm & Terraform integration.
|
|
915
15
|
|
|
916
|
-
|
|
16
|
+
</div>
|
|
917
17
|
|
|
918
|
-
|
|
18
|
+
---
|
|
919
19
|
|
|
920
|
-
|
|
921
|
-
|:------|:------------|
|
|
922
|
-
| `rotatedAt` | ISO timestamp of last rotation |
|
|
923
|
-
| `rotateAfter` | ISO timestamp when rotation is due |
|
|
20
|
+
## Installation
|
|
924
21
|
|
|
925
|
-
View with:
|
|
926
22
|
```bash
|
|
927
|
-
|
|
23
|
+
curl -fsSL https://raw.githubusercontent.com/forattini-dev/vaulter/main/install.sh | sh
|
|
24
|
+
# or: npm install -g vaulter
|
|
928
25
|
```
|
|
929
26
|
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
```yaml
|
|
933
|
-
# GitHub Actions - Weekly rotation check
|
|
934
|
-
name: Secret Rotation Check
|
|
935
|
-
on:
|
|
936
|
-
schedule:
|
|
937
|
-
- cron: '0 9 * * 1' # Every Monday at 9am
|
|
938
|
-
|
|
939
|
-
jobs:
|
|
940
|
-
check-rotation:
|
|
941
|
-
runs-on: ubuntu-latest
|
|
942
|
-
steps:
|
|
943
|
-
- uses: actions/checkout@v4
|
|
27
|
+
## Quick Start
|
|
944
28
|
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
echo "::warning::Some secrets are overdue for rotation!"
|
|
952
|
-
exit 1
|
|
953
|
-
}
|
|
954
|
-
echo "✓ All secrets are within rotation policy"
|
|
955
|
-
|
|
956
|
-
# Optional: Filter by pattern for specific checks
|
|
957
|
-
- name: Check API keys specifically
|
|
958
|
-
run: |
|
|
959
|
-
npx vaulter rotation run -e prd --pattern "*_KEY" --overdue
|
|
29
|
+
```bash
|
|
30
|
+
vaulter init # Initialize project
|
|
31
|
+
vaulter key generate --name master # Generate encryption key
|
|
32
|
+
vaulter var set DATABASE_URL="postgres://..." -e dev # Set secret
|
|
33
|
+
vaulter var set PORT::3000 -e dev # Set config (plain)
|
|
34
|
+
eval $(vaulter export shell -e dev) # Export to shell
|
|
960
35
|
```
|
|
961
36
|
|
|
962
|
-
### Compliance Matrix
|
|
963
|
-
|
|
964
|
-
| Standard | Requirement | Vaulter Config |
|
|
965
|
-
|:---------|:------------|:---------------|
|
|
966
|
-
| PCI-DSS | 90 days | `interval_days: 90` |
|
|
967
|
-
| SOC2 | Regular rotation | `interval_days: 90` |
|
|
968
|
-
| HIPAA | Periodic | `interval_days: 180` |
|
|
969
|
-
| Internal | Custom | `interval_days: N` |
|
|
970
|
-
|
|
971
37
|
---
|
|
972
38
|
|
|
973
|
-
##
|
|
974
|
-
|
|
975
|
-
### GitHub Actions (Quick Start)
|
|
976
|
-
|
|
977
|
-
```yaml
|
|
978
|
-
name: Deploy
|
|
979
|
-
on:
|
|
980
|
-
push:
|
|
981
|
-
branches: [main]
|
|
982
|
-
|
|
983
|
-
jobs:
|
|
984
|
-
deploy:
|
|
985
|
-
runs-on: ubuntu-latest
|
|
986
|
-
steps:
|
|
987
|
-
- uses: actions/checkout@v4
|
|
988
|
-
|
|
989
|
-
- name: Deploy secrets to Kubernetes
|
|
990
|
-
env:
|
|
991
|
-
VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
|
|
992
|
-
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
993
|
-
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
994
|
-
run: |
|
|
995
|
-
npx vaulter k8s:secret -e prd | kubectl apply -f -
|
|
996
|
-
```
|
|
997
|
-
|
|
998
|
-
### GitHub Actions (Complete Example)
|
|
999
|
-
|
|
1000
|
-
```yaml
|
|
1001
|
-
name: Deploy to Kubernetes
|
|
1002
|
-
on:
|
|
1003
|
-
push:
|
|
1004
|
-
branches: [main, develop]
|
|
1005
|
-
workflow_dispatch:
|
|
1006
|
-
inputs:
|
|
1007
|
-
environment:
|
|
1008
|
-
description: 'Target environment'
|
|
1009
|
-
required: true
|
|
1010
|
-
default: 'dev'
|
|
1011
|
-
type: choice
|
|
1012
|
-
options: [dev, stg, prd]
|
|
1013
|
-
|
|
1014
|
-
env:
|
|
1015
|
-
VAULTER_VERSION: '1.0.1'
|
|
1016
|
-
|
|
1017
|
-
jobs:
|
|
1018
|
-
deploy:
|
|
1019
|
-
runs-on: ubuntu-latest
|
|
1020
|
-
environment: ${{ github.event.inputs.environment || (github.ref == 'refs/heads/main' && 'prd') || 'dev' }}
|
|
1021
|
-
|
|
1022
|
-
steps:
|
|
1023
|
-
- uses: actions/checkout@v4
|
|
1024
|
-
|
|
1025
|
-
- name: Setup Node.js
|
|
1026
|
-
uses: actions/setup-node@v4
|
|
1027
|
-
with:
|
|
1028
|
-
node-version: '22'
|
|
1029
|
-
cache: 'npm'
|
|
1030
|
-
|
|
1031
|
-
- name: Install Vaulter
|
|
1032
|
-
run: npm install -g vaulter@${{ env.VAULTER_VERSION }}
|
|
1033
|
-
|
|
1034
|
-
- name: Configure kubectl
|
|
1035
|
-
uses: azure/k8s-set-context@v4
|
|
1036
|
-
with:
|
|
1037
|
-
kubeconfig: ${{ secrets.KUBECONFIG }}
|
|
1038
|
-
|
|
1039
|
-
- name: Deploy Secrets
|
|
1040
|
-
env:
|
|
1041
|
-
VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
|
|
1042
|
-
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
1043
|
-
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
1044
|
-
run: |
|
|
1045
|
-
ENV=${{ github.event.inputs.environment || (github.ref == 'refs/heads/main' && 'prd') || 'dev' }}
|
|
1046
|
-
|
|
1047
|
-
# Deploy K8s Secret
|
|
1048
|
-
vaulter k8s:secret -e $ENV -n my-namespace | kubectl apply -f -
|
|
1049
|
-
|
|
1050
|
-
# Deploy ConfigMap (non-sensitive config)
|
|
1051
|
-
vaulter k8s:configmap -e $ENV -n my-namespace | kubectl apply -f -
|
|
1052
|
-
|
|
1053
|
-
# Verify deployment
|
|
1054
|
-
kubectl get secret,configmap -n my-namespace
|
|
1055
|
-
|
|
1056
|
-
- name: Restart Deployment
|
|
1057
|
-
run: |
|
|
1058
|
-
kubectl rollout restart deployment/my-app -n my-namespace
|
|
1059
|
-
kubectl rollout status deployment/my-app -n my-namespace --timeout=120s
|
|
1060
|
-
```
|
|
1061
|
-
|
|
1062
|
-
### GitHub Actions (Monorepo with Services)
|
|
1063
|
-
|
|
1064
|
-
```yaml
|
|
1065
|
-
name: Deploy Service
|
|
1066
|
-
on:
|
|
1067
|
-
push:
|
|
1068
|
-
branches: [main]
|
|
1069
|
-
paths:
|
|
1070
|
-
- 'apps/svc-*/**'
|
|
1071
|
-
|
|
1072
|
-
jobs:
|
|
1073
|
-
detect-changes:
|
|
1074
|
-
runs-on: ubuntu-latest
|
|
1075
|
-
outputs:
|
|
1076
|
-
services: ${{ steps.changes.outputs.services }}
|
|
1077
|
-
steps:
|
|
1078
|
-
- uses: actions/checkout@v4
|
|
1079
|
-
- id: changes
|
|
1080
|
-
run: |
|
|
1081
|
-
# Detect which services changed
|
|
1082
|
-
SERVICES=$(git diff --name-only HEAD~1 | grep '^apps/svc-' | cut -d'/' -f2 | sort -u | jq -R -s -c 'split("\n")[:-1]')
|
|
1083
|
-
echo "services=$SERVICES" >> $GITHUB_OUTPUT
|
|
1084
|
-
|
|
1085
|
-
deploy:
|
|
1086
|
-
needs: detect-changes
|
|
1087
|
-
runs-on: ubuntu-latest
|
|
1088
|
-
strategy:
|
|
1089
|
-
matrix:
|
|
1090
|
-
service: ${{ fromJson(needs.detect-changes.outputs.services) }}
|
|
1091
|
-
steps:
|
|
1092
|
-
- uses: actions/checkout@v4
|
|
1093
|
-
|
|
1094
|
-
- name: Deploy ${{ matrix.service }}
|
|
1095
|
-
env:
|
|
1096
|
-
VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
|
|
1097
|
-
run: |
|
|
1098
|
-
# Deploy secrets for specific service
|
|
1099
|
-
vaulter k8s:secret -e prd -s ${{ matrix.service }} | kubectl apply -f -
|
|
1100
|
-
```
|
|
1101
|
-
|
|
1102
|
-
### GitHub Actions (Using Binary for Speed)
|
|
1103
|
-
|
|
1104
|
-
```yaml
|
|
1105
|
-
name: Deploy (Fast)
|
|
1106
|
-
on: [push]
|
|
1107
|
-
|
|
1108
|
-
jobs:
|
|
1109
|
-
deploy:
|
|
1110
|
-
runs-on: ubuntu-latest
|
|
1111
|
-
steps:
|
|
1112
|
-
- uses: actions/checkout@v4
|
|
1113
|
-
|
|
1114
|
-
- name: Download Vaulter Binary
|
|
1115
|
-
run: |
|
|
1116
|
-
curl -sL https://github.com/forattini-dev/vaulter/releases/latest/download/vaulter-linux -o vaulter
|
|
1117
|
-
chmod +x vaulter
|
|
1118
|
-
sudo mv vaulter /usr/local/bin/
|
|
39
|
+
## Why Vaulter?
|
|
1119
40
|
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
41
|
+
| Problem | Solution |
|
|
42
|
+
|:--------|:---------|
|
|
43
|
+
| Secrets in plaintext `.env` | Encrypted at rest (AES-256-GCM) |
|
|
44
|
+
| Manual sync between devs | `vaulter sync pull` / `vaulter sync push` |
|
|
45
|
+
| Copy-paste to CI/CD | `eval $(vaulter export shell -e prd)` |
|
|
46
|
+
| No audit trail | Full history via audit log |
|
|
47
|
+
| Different files per machine | Single source of truth |
|
|
1126
48
|
|
|
1127
|
-
|
|
49
|
+
**Zero lock-in**: Your data lives in YOUR storage (S3, MinIO, R2, filesystem).
|
|
1128
50
|
|
|
1129
|
-
|
|
1130
|
-
name: Deploy All Environments
|
|
1131
|
-
on:
|
|
1132
|
-
workflow_dispatch:
|
|
1133
|
-
inputs:
|
|
1134
|
-
environment:
|
|
1135
|
-
type: choice
|
|
1136
|
-
options: [dev, stg, prd]
|
|
51
|
+
---
|
|
1137
52
|
|
|
1138
|
-
|
|
1139
|
-
deploy:
|
|
1140
|
-
runs-on: ubuntu-latest
|
|
1141
|
-
environment: ${{ inputs.environment }}
|
|
1142
|
-
steps:
|
|
1143
|
-
- uses: actions/checkout@v4
|
|
53
|
+
## Commands
|
|
1144
54
|
|
|
1145
|
-
|
|
1146
|
-
env:
|
|
1147
|
-
VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
|
|
1148
|
-
run: |
|
|
1149
|
-
npx vaulter k8s:secret -e ${{ inputs.environment }} | kubectl apply -f -
|
|
55
|
+
### Setup
|
|
1150
56
|
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
57
|
+
| Command | Description |
|
|
58
|
+
|:--------|:------------|
|
|
59
|
+
| `init` | Initialize project config |
|
|
60
|
+
| `init --split` | Initialize with split mode (configs/secrets dirs) |
|
|
61
|
+
|
|
62
|
+
### Variables (`var`)
|
|
63
|
+
|
|
64
|
+
| Command | Description |
|
|
65
|
+
|:--------|:------------|
|
|
66
|
+
| `var get <key> -e <env>` | Get a variable |
|
|
67
|
+
| `var set KEY=val -e <env>` | Set secret (encrypted) |
|
|
68
|
+
| `var set KEY::val -e <env>` | Set config (plain text) |
|
|
69
|
+
| `var set KEY:=123 -e <env>` | Set typed secret (number/boolean) |
|
|
70
|
+
| `var delete <key> -e <env>` | Delete a variable |
|
|
71
|
+
| `var list -e <env>` | List all variables |
|
|
72
|
+
|
|
73
|
+
**Set syntax**: `=` encrypted secret · `::` plain config · `:=` typed secret
|
|
74
|
+
|
|
75
|
+
### Sync
|
|
76
|
+
|
|
77
|
+
| Command | Description |
|
|
78
|
+
|:--------|:------------|
|
|
79
|
+
| `sync merge -e <env>` | Bidirectional merge (default) |
|
|
80
|
+
| `sync pull -e <env>` | Download from backend |
|
|
81
|
+
| `sync pull --prune -e <env>` | Download, delete local-only vars |
|
|
82
|
+
| `sync push -e <env>` | Upload to backend |
|
|
83
|
+
| `sync push --prune -e <env>` | Upload, delete remote-only vars |
|
|
84
|
+
| `sync diff -e <env>` | Show differences without changes |
|
|
85
|
+
|
|
86
|
+
### Export
|
|
87
|
+
|
|
88
|
+
| Command | Description |
|
|
89
|
+
|:--------|:------------|
|
|
90
|
+
| `export shell -e <env>` | Export for shell `eval $(...)` |
|
|
91
|
+
| `export k8s-secret -e <env>` | Generate Kubernetes Secret |
|
|
92
|
+
| `export k8s-configmap -e <env>` | Generate Kubernetes ConfigMap |
|
|
93
|
+
| `export helm -e <env>` | Generate Helm values.yaml |
|
|
94
|
+
| `export terraform -e <env>` | Generate Terraform .tfvars |
|
|
95
|
+
| `export docker -e <env>` | Docker env-file format |
|
|
96
|
+
| `export vercel -e <env>` | Vercel environment JSON |
|
|
97
|
+
| `export github-actions -e <env>` | GitHub Actions secrets |
|
|
98
|
+
|
|
99
|
+
### Services (monorepo)
|
|
100
|
+
|
|
101
|
+
| Command | Description |
|
|
102
|
+
|:--------|:------------|
|
|
103
|
+
| `service list` | List discovered services |
|
|
104
|
+
| `service init` | Add service to config |
|
|
105
|
+
|
|
106
|
+
### Audit & Rotation
|
|
107
|
+
|
|
108
|
+
| Command | Description |
|
|
109
|
+
|:--------|:------------|
|
|
110
|
+
| `audit list -e <env>` | List audit entries |
|
|
111
|
+
| `audit stats -e <env>` | Show statistics |
|
|
112
|
+
| `rotation list -e <env>` | Check rotation status |
|
|
113
|
+
| `rotation run -e <env>` | CI/CD gate for overdue secrets |
|
|
1155
114
|
|
|
1156
|
-
###
|
|
115
|
+
### Key Management
|
|
1157
116
|
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
image: node:22-alpine
|
|
1165
|
-
script:
|
|
1166
|
-
- npx vaulter k8s:secret -e ${CI_ENVIRONMENT_NAME} | kubectl apply -f -
|
|
1167
|
-
environment:
|
|
1168
|
-
name: $CI_COMMIT_REF_NAME
|
|
1169
|
-
rules:
|
|
1170
|
-
- if: $CI_COMMIT_BRANCH == "main"
|
|
1171
|
-
variables:
|
|
1172
|
-
CI_ENVIRONMENT_NAME: prd
|
|
1173
|
-
- if: $CI_COMMIT_BRANCH == "develop"
|
|
1174
|
-
variables:
|
|
1175
|
-
CI_ENVIRONMENT_NAME: dev
|
|
1176
|
-
```
|
|
117
|
+
| Command | Description |
|
|
118
|
+
|:--------|:------------|
|
|
119
|
+
| `key generate --name <n>` | Generate symmetric key |
|
|
120
|
+
| `key generate --name <n> --asymmetric` | Generate RSA/EC key pair |
|
|
121
|
+
| `key list` | List all keys |
|
|
122
|
+
| `key export --name <n>` | Export encrypted bundle |
|
|
1177
123
|
|
|
1178
|
-
|
|
124
|
+
> Run `vaulter --help` or `vaulter <command> --help` for all options.
|
|
1179
125
|
|
|
1180
|
-
|
|
1181
|
-
pipeline {
|
|
1182
|
-
agent any
|
|
126
|
+
---
|
|
1183
127
|
|
|
1184
|
-
|
|
1185
|
-
VAULTER_KEY = credentials('vaulter-key')
|
|
1186
|
-
AWS_ACCESS_KEY_ID = credentials('aws-access-key')
|
|
1187
|
-
AWS_SECRET_ACCESS_KEY = credentials('aws-secret-key')
|
|
1188
|
-
}
|
|
128
|
+
## Security
|
|
1189
129
|
|
|
1190
|
-
|
|
1191
|
-
stage('Deploy Secrets') {
|
|
1192
|
-
steps {
|
|
1193
|
-
sh 'npx vaulter k8s:secret -e prd | kubectl apply -f -'
|
|
1194
|
-
}
|
|
1195
|
-
}
|
|
1196
|
-
}
|
|
1197
|
-
}
|
|
1198
|
-
```
|
|
130
|
+
Every secret is encrypted **before** leaving your machine using **AES-256-GCM**.
|
|
1199
131
|
|
|
1200
|
-
###
|
|
132
|
+
### Symmetric (Default)
|
|
1201
133
|
|
|
1202
134
|
```bash
|
|
1203
|
-
|
|
1204
|
-
vaulter export -e prd --format=env > .env.prd
|
|
1205
|
-
docker run --env-file .env.prd myapp
|
|
1206
|
-
|
|
1207
|
-
# For simple values only: command substitution (no spaces/newlines in values)
|
|
1208
|
-
docker run $(vaulter export -e prd --format=docker-args) myapp
|
|
135
|
+
vaulter key generate --name master
|
|
1209
136
|
```
|
|
1210
137
|
|
|
1211
|
-
|
|
1212
|
-
> values containing spaces or special characters won't work correctly with `$(...)` substitution.
|
|
1213
|
-
> Use `--env-file` for complex values or production deployments.
|
|
1214
|
-
|
|
1215
|
-
For `docker build` with build args, use shell format:
|
|
1216
|
-
|
|
1217
|
-
```bash
|
|
1218
|
-
# Export to shell and use in build
|
|
1219
|
-
eval $(vaulter export -e prd)
|
|
1220
|
-
docker build \
|
|
1221
|
-
--build-arg DATABASE_URL="$DATABASE_URL" \
|
|
1222
|
-
--build-arg API_KEY="$API_KEY" \
|
|
1223
|
-
-t myapp .
|
|
1224
|
-
```
|
|
138
|
+
### Asymmetric (RSA/EC)
|
|
1225
139
|
|
|
1226
|
-
|
|
140
|
+
For CI/CD separation: public key encrypts, private key decrypts.
|
|
1227
141
|
|
|
1228
142
|
```bash
|
|
1229
|
-
#
|
|
1230
|
-
vaulter
|
|
1231
|
-
|
|
1232
|
-
# Or inline
|
|
1233
|
-
terraform plan -var-file=<(vaulter tf:vars -e prd)
|
|
143
|
+
vaulter key generate --name master --asymmetric # RSA-4096
|
|
144
|
+
vaulter key generate --name master --asym --alg ec-p256 # EC P-256
|
|
1234
145
|
```
|
|
1235
146
|
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
#
|
|
1243
|
-
vaulter helm:values -e prd > values.secrets.yaml
|
|
1244
|
-
helm upgrade myapp ./chart -f values.yaml -f values.secrets.yaml
|
|
147
|
+
```yaml
|
|
148
|
+
# .vaulter/config.yaml
|
|
149
|
+
encryption:
|
|
150
|
+
mode: asymmetric
|
|
151
|
+
asymmetric:
|
|
152
|
+
algorithm: rsa-4096
|
|
153
|
+
key_name: master # ~/.vaulter/projects/<project>/keys/master[.pub]
|
|
1245
154
|
```
|
|
1246
155
|
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
```bash
|
|
1250
|
-
# Add to ~/.bashrc or ~/.zshrc
|
|
1251
|
-
alias vdev='eval $(vaulter export -e dev)'
|
|
1252
|
-
alias vstg='eval $(vaulter export -e stg)'
|
|
1253
|
-
alias vprd='eval $(vaulter export -e prd)'
|
|
1254
|
-
|
|
1255
|
-
# Usage
|
|
1256
|
-
vdev npm run dev
|
|
1257
|
-
vstg npm run test:integration
|
|
1258
|
-
```
|
|
156
|
+
**CI/CD**: Give CI only the public key (can write, can't read). Production gets the private key.
|
|
1259
157
|
|
|
1260
158
|
---
|
|
1261
159
|
|
|
1262
160
|
## Configuration
|
|
1263
161
|
|
|
1264
|
-
### Basic Config
|
|
1265
|
-
|
|
1266
162
|
```yaml
|
|
1267
163
|
# .vaulter/config.yaml
|
|
1268
164
|
version: "1"
|
|
1269
|
-
|
|
1270
165
|
project: my-project
|
|
1271
|
-
service: api # optional, for monorepos
|
|
1272
166
|
|
|
1273
167
|
backend:
|
|
1274
168
|
url: s3://bucket/envs?region=us-east-1
|
|
1275
|
-
# Or multiple with fallback
|
|
1276
|
-
urls:
|
|
1277
|
-
- s3://bucket/envs?region=us-east-1
|
|
1278
|
-
- file:///home/user/.vaulter-store
|
|
1279
169
|
|
|
1280
170
|
encryption:
|
|
1281
171
|
key_source:
|
|
1282
172
|
- env: VAULTER_KEY
|
|
1283
173
|
- file: .vaulter/.key
|
|
1284
|
-
# Secret rotation settings
|
|
1285
174
|
rotation:
|
|
1286
175
|
enabled: true
|
|
1287
176
|
interval_days: 90
|
|
1288
|
-
patterns:
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
177
|
+
patterns: ["*_KEY", "*_SECRET", "*_TOKEN"]
|
|
178
|
+
|
|
179
|
+
environments: [dev, stg, prd]
|
|
180
|
+
default_environment: dev
|
|
1292
181
|
|
|
1293
|
-
# Audit logging
|
|
1294
182
|
audit:
|
|
1295
183
|
enabled: true
|
|
1296
184
|
retention_days: 90
|
|
1297
|
-
|
|
1298
|
-
environments:
|
|
1299
|
-
- dev
|
|
1300
|
-
- stg
|
|
1301
|
-
- prd
|
|
1302
|
-
|
|
1303
|
-
default_environment: dev
|
|
1304
|
-
```
|
|
1305
|
-
|
|
1306
|
-
### Directory Modes
|
|
1307
|
-
|
|
1308
|
-
#### Unified Mode (Default)
|
|
1309
|
-
|
|
1310
|
-
```
|
|
1311
|
-
my-project/
|
|
1312
|
-
├── .vaulter/
|
|
1313
|
-
│ ├── config.yaml
|
|
1314
|
-
│ └── environments/
|
|
1315
|
-
│ ├── dev.env
|
|
1316
|
-
│ ├── stg.env
|
|
1317
|
-
│ └── prd.env
|
|
1318
|
-
```
|
|
1319
|
-
|
|
1320
|
-
#### Split Mode
|
|
1321
|
-
|
|
1322
|
-
Separates configs (committable) from secrets (gitignored):
|
|
1323
|
-
|
|
1324
|
-
```
|
|
1325
|
-
my-project/
|
|
1326
|
-
├── .vaulter/config.yaml
|
|
1327
|
-
└── deploy/
|
|
1328
|
-
├── configs/ # ✅ Committable (PORT, HOST, LOG_LEVEL)
|
|
1329
|
-
│ ├── dev.env
|
|
1330
|
-
│ └── prd.env
|
|
1331
|
-
└── secrets/ # ❌ Gitignored (DATABASE_URL, API_KEY)
|
|
1332
|
-
├── dev.env
|
|
1333
|
-
└── prd.env
|
|
1334
|
-
```
|
|
1335
|
-
|
|
1336
|
-
```yaml
|
|
1337
|
-
directories:
|
|
1338
|
-
mode: split
|
|
1339
|
-
configs: deploy/configs
|
|
1340
|
-
secrets: deploy/secrets
|
|
1341
185
|
```
|
|
1342
186
|
|
|
1343
|
-
Initialize with: `vaulter init --split`
|
|
1344
|
-
|
|
1345
187
|
### Backend URLs
|
|
1346
188
|
|
|
1347
|
-
| Provider | URL
|
|
1348
|
-
|
|
189
|
+
| Provider | URL |
|
|
190
|
+
|:---------|:----|
|
|
1349
191
|
| AWS S3 | `s3://bucket/path?region=us-east-1` |
|
|
1350
|
-
| AWS S3 + Profile | `s3://bucket/path?profile=myprofile` |
|
|
1351
192
|
| MinIO | `http://KEY:SECRET@localhost:9000/bucket` |
|
|
1352
193
|
| Cloudflare R2 | `https://KEY:SECRET@ACCOUNT.r2.cloudflarestorage.com/bucket` |
|
|
1353
|
-
| DigitalOcean
|
|
1354
|
-
| Backblaze B2 | `https://KEY:SECRET@s3.us-west-002.backblazeb2.com/bucket` |
|
|
194
|
+
| DigitalOcean | `https://KEY:SECRET@nyc3.digitaloceanspaces.com/bucket` |
|
|
1355
195
|
| FileSystem | `file:///path/to/storage` |
|
|
1356
|
-
| Memory | `memory://bucket-name` |
|
|
1357
|
-
|
|
1358
|
-
---
|
|
1359
196
|
|
|
1360
|
-
|
|
197
|
+
### Split Mode
|
|
1361
198
|
|
|
1362
|
-
|
|
199
|
+
Separate configs (committable) from secrets (gitignored):
|
|
1363
200
|
|
|
1364
201
|
```bash
|
|
1365
|
-
|
|
1366
|
-
|
|
202
|
+
vaulter init --split
|
|
203
|
+
```
|
|
1367
204
|
|
|
1368
|
-
|
|
1369
|
-
|
|
205
|
+
```
|
|
206
|
+
deploy/
|
|
207
|
+
├── configs/ # Committable (PORT, HOST)
|
|
208
|
+
└── secrets/ # Gitignored (DATABASE_URL, API_KEY)
|
|
1370
209
|
```
|
|
1371
210
|
|
|
1372
|
-
|
|
211
|
+
---
|
|
1373
212
|
|
|
1374
|
-
|
|
1375
|
-
integrations:
|
|
1376
|
-
kubernetes:
|
|
1377
|
-
secret_name: my-app-secrets
|
|
1378
|
-
configmap_name: my-app-config
|
|
1379
|
-
```
|
|
213
|
+
## CI/CD
|
|
1380
214
|
|
|
1381
|
-
###
|
|
215
|
+
### GitHub Actions
|
|
1382
216
|
|
|
1383
|
-
```
|
|
1384
|
-
|
|
1385
|
-
|
|
217
|
+
```yaml
|
|
218
|
+
name: Deploy
|
|
219
|
+
on:
|
|
220
|
+
push:
|
|
221
|
+
branches: [main]
|
|
1386
222
|
|
|
1387
|
-
|
|
1388
|
-
|
|
223
|
+
jobs:
|
|
224
|
+
deploy:
|
|
225
|
+
runs-on: ubuntu-latest
|
|
226
|
+
steps:
|
|
227
|
+
- uses: actions/checkout@v4
|
|
228
|
+
- name: Deploy secrets
|
|
229
|
+
env:
|
|
230
|
+
VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
|
|
231
|
+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
232
|
+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
233
|
+
run: npx vaulter export k8s-secret -e prd | kubectl apply -f -
|
|
1389
234
|
```
|
|
1390
235
|
|
|
1391
|
-
###
|
|
236
|
+
### Other Platforms
|
|
1392
237
|
|
|
1393
238
|
```bash
|
|
1394
|
-
#
|
|
1395
|
-
vaulter
|
|
239
|
+
# GitLab CI
|
|
240
|
+
npx vaulter export k8s-secret -e ${CI_ENVIRONMENT_NAME} | kubectl apply -f -
|
|
241
|
+
|
|
242
|
+
# Docker
|
|
243
|
+
vaulter export docker -e prd > .env.prd && docker run --env-file .env.prd myapp
|
|
1396
244
|
|
|
1397
|
-
#
|
|
1398
|
-
vaulter
|
|
245
|
+
# Terraform
|
|
246
|
+
vaulter export terraform -e prd > secrets.auto.tfvars
|
|
247
|
+
|
|
248
|
+
# Helm
|
|
249
|
+
vaulter export helm -e prd | helm upgrade myapp ./chart -f -
|
|
1399
250
|
```
|
|
1400
251
|
|
|
1401
252
|
---
|
|
1402
253
|
|
|
1403
254
|
## Monorepo Support
|
|
1404
255
|
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
| Tool | Detection File | Workspace Config |
|
|
1408
|
-
|:-----|:---------------|:-----------------|
|
|
1409
|
-
| NX | `nx.json` | `workspaceLayout` |
|
|
1410
|
-
| Turborepo | `turbo.json` | Uses pnpm/yarn workspaces |
|
|
1411
|
-
| Lerna | `lerna.json` | `packages` array |
|
|
1412
|
-
| pnpm | `pnpm-workspace.yaml` | `packages` array |
|
|
1413
|
-
| Yarn | `package.json` | `workspaces` field |
|
|
1414
|
-
| Rush | `rush.json` | `projects[].projectFolder` |
|
|
1415
|
-
|
|
1416
|
-
### Scan Command
|
|
1417
|
-
|
|
1418
|
-
```bash
|
|
1419
|
-
# Discover all packages
|
|
1420
|
-
vaulter scan
|
|
1421
|
-
|
|
1422
|
-
# Output:
|
|
1423
|
-
# Monorepo: NX
|
|
1424
|
-
# Found 17 package(s):
|
|
1425
|
-
# ✓ Initialized: 3
|
|
1426
|
-
# ○ Not initialized: 14
|
|
1427
|
-
# 📄 With .env files: 11
|
|
1428
|
-
```
|
|
1429
|
-
|
|
1430
|
-
### Batch Operations
|
|
256
|
+
Auto-detects NX, Turborepo, Lerna, pnpm, Yarn workspaces, Rush.
|
|
1431
257
|
|
|
1432
258
|
```bash
|
|
1433
|
-
#
|
|
1434
|
-
vaulter sync -e dev
|
|
1435
|
-
|
|
1436
|
-
#
|
|
1437
|
-
vaulter sync -e dev -s api,worker
|
|
259
|
+
vaulter service list # List discovered services
|
|
260
|
+
vaulter sync push -e dev -s api # Push specific service
|
|
261
|
+
vaulter sync push -e dev --shared # Push shared variables
|
|
262
|
+
vaulter export shell -e dev --shared # Export shared variables
|
|
1438
263
|
```
|
|
1439
264
|
|
|
1440
265
|
---
|
|
@@ -1444,254 +269,89 @@ vaulter sync -e dev -s api,worker
|
|
|
1444
269
|
```typescript
|
|
1445
270
|
import { VaulterClient, loadConfig } from 'vaulter'
|
|
1446
271
|
|
|
1447
|
-
const
|
|
1448
|
-
const client = new VaulterClient({ config })
|
|
1449
|
-
|
|
272
|
+
const client = new VaulterClient({ config: loadConfig() })
|
|
1450
273
|
await client.connect()
|
|
1451
274
|
|
|
1452
|
-
// CRUD operations
|
|
1453
|
-
const value = await client.get('DATABASE_URL', 'my-project', 'prd')
|
|
1454
275
|
await client.set({ key: 'API_KEY', value: 'sk-xxx', project: 'my-project', environment: 'prd' })
|
|
276
|
+
const value = await client.get('API_KEY', 'my-project', 'prd')
|
|
1455
277
|
const vars = await client.list({ project: 'my-project', environment: 'prd' })
|
|
1456
278
|
|
|
1457
279
|
await client.disconnect()
|
|
1458
280
|
```
|
|
1459
281
|
|
|
1460
|
-
###
|
|
282
|
+
### Auto-load (dotenv compatible)
|
|
1461
283
|
|
|
1462
284
|
```typescript
|
|
1463
|
-
// Auto-
|
|
1464
|
-
import 'vaulter/load'
|
|
1465
|
-
|
|
1466
|
-
// Or with options
|
|
1467
|
-
import { loader } from 'vaulter'
|
|
1468
|
-
loader({ path: '.env.local', override: true })
|
|
285
|
+
import 'vaulter/load' // Auto-loads .env into process.env
|
|
1469
286
|
```
|
|
1470
287
|
|
|
1471
288
|
---
|
|
1472
289
|
|
|
1473
290
|
## MCP Server
|
|
1474
291
|
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
### Setup
|
|
292
|
+
Claude AI integration via Model Context Protocol.
|
|
1478
293
|
|
|
1479
294
|
```bash
|
|
1480
|
-
# Start server
|
|
1481
295
|
vaulter mcp
|
|
1482
|
-
|
|
1483
|
-
# Test with MCP Inspector
|
|
1484
|
-
npx @anthropic-ai/mcp-inspector vaulter mcp
|
|
1485
296
|
```
|
|
1486
297
|
|
|
1487
|
-
### Claude Desktop
|
|
298
|
+
### Claude Desktop
|
|
1488
299
|
|
|
1489
300
|
```json
|
|
1490
301
|
{
|
|
1491
302
|
"mcpServers": {
|
|
1492
303
|
"vaulter": {
|
|
1493
304
|
"command": "vaulter",
|
|
1494
|
-
"args": ["mcp"]
|
|
305
|
+
"args": ["mcp", "--cwd", "/path/to/project"]
|
|
1495
306
|
}
|
|
1496
307
|
}
|
|
1497
308
|
}
|
|
1498
309
|
```
|
|
1499
310
|
|
|
1500
|
-
###
|
|
1501
|
-
|
|
1502
|
-
The MCP server uses a priority chain to resolve defaults:
|
|
1503
|
-
|
|
1504
|
-
1. **Tool arguments** (explicit in each call)
|
|
1505
|
-
2. **Project config** (`.vaulter/config.yaml`)
|
|
1506
|
-
3. **Project MCP config** (`.vaulter/config.yaml` → `mcp:` section)
|
|
1507
|
-
4. **Global MCP config** (`~/.vaulter/config.yaml` → `mcp:` section)
|
|
1508
|
-
5. **Hardcoded defaults**
|
|
1509
|
-
|
|
1510
|
-
#### Project MCP Defaults
|
|
1511
|
-
|
|
1512
|
-
Add an `mcp:` section to your project's `.vaulter/config.yaml`:
|
|
1513
|
-
|
|
1514
|
-
```yaml
|
|
1515
|
-
# .vaulter/config.yaml
|
|
1516
|
-
version: "1"
|
|
1517
|
-
project: my-project
|
|
1518
|
-
|
|
1519
|
-
backend:
|
|
1520
|
-
url: s3://bucket/envs?region=us-east-1
|
|
1521
|
-
|
|
1522
|
-
# MCP defaults (used when MCP server runs in this project)
|
|
1523
|
-
mcp:
|
|
1524
|
-
default_backend: s3://bucket/envs?region=us-east-1
|
|
1525
|
-
default_project: my-project
|
|
1526
|
-
default_environment: dev
|
|
1527
|
-
default_key: master # Key name for encryption
|
|
1528
|
-
```
|
|
1529
|
-
|
|
1530
|
-
#### Global MCP Defaults
|
|
1531
|
-
|
|
1532
|
-
For MCP clients that don't support `cwd`, create `~/.vaulter/config.yaml`:
|
|
1533
|
-
|
|
1534
|
-
```yaml
|
|
1535
|
-
# ~/.vaulter/config.yaml
|
|
1536
|
-
mcp:
|
|
1537
|
-
default_backend: s3://bucket/envs?region=us-east-1
|
|
1538
|
-
default_project: my-project
|
|
1539
|
-
default_environment: dev
|
|
1540
|
-
default_key: master
|
|
1541
|
-
```
|
|
1542
|
-
|
|
1543
|
-
#### Working Directory
|
|
311
|
+
### Tools
|
|
1544
312
|
|
|
1545
|
-
|
|
313
|
+
| Category | Tools |
|
|
314
|
+
|:---------|:------|
|
|
315
|
+
| **Variables** | `var_get`, `var_set`, `var_delete`, `var_list` |
|
|
316
|
+
| **Sync** | `sync_push`, `sync_pull`, `sync_merge`, `sync_diff` |
|
|
317
|
+
| **Export** | `export_shell`, `export_k8s_secret`, `export_k8s_configmap`, `export_helm`, `export_terraform` |
|
|
318
|
+
| **Discovery** | `compare`, `search`, `services`, `init` |
|
|
319
|
+
| **Keys** | `key_generate`, `key_list`, `key_show`, `key_export`, `key_import` |
|
|
320
|
+
| **Audit** | `audit_list`, `audit_stats` |
|
|
321
|
+
| **Rotation** | `rotation_list`, `rotation_run` |
|
|
1546
322
|
|
|
1547
|
-
|
|
1548
|
-
{
|
|
1549
|
-
"mcpServers": {
|
|
1550
|
-
"vaulter": {
|
|
1551
|
-
"command": "vaulter",
|
|
1552
|
-
"args": ["mcp", "--cwd", "/path/to/project"]
|
|
1553
|
-
}
|
|
1554
|
-
}
|
|
1555
|
-
}
|
|
1556
|
-
```
|
|
323
|
+
### Resources (4)
|
|
1557
324
|
|
|
1558
|
-
|
|
325
|
+
Static data views (no input required). For actions with parameters, use tools.
|
|
1559
326
|
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
"env": {
|
|
1567
|
-
"VAULTER_CWD": "/path/to/project"
|
|
1568
|
-
}
|
|
1569
|
-
}
|
|
1570
|
-
}
|
|
1571
|
-
}
|
|
1572
|
-
```
|
|
327
|
+
| URI | Description |
|
|
328
|
+
|:----|:------------|
|
|
329
|
+
| `vaulter://instructions` | **Read first!** How vaulter stores data |
|
|
330
|
+
| `vaulter://mcp-config` | MCP settings sources |
|
|
331
|
+
| `vaulter://config` | Project configuration (YAML) |
|
|
332
|
+
| `vaulter://services` | Monorepo services list |
|
|
1573
333
|
|
|
1574
|
-
|
|
334
|
+
---
|
|
1575
335
|
|
|
1576
|
-
|
|
336
|
+
## TUI (Terminal Interface)
|
|
1577
337
|
|
|
1578
338
|
```bash
|
|
1579
|
-
#
|
|
1580
|
-
vaulter
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
**Example output:**
|
|
1584
|
-
```json
|
|
1585
|
-
{
|
|
1586
|
-
"summary": "MCP Configuration Sources - shows WHERE each setting was loaded from",
|
|
1587
|
-
"settings": {
|
|
1588
|
-
"backend": {
|
|
1589
|
-
"value": "s3://my-bucket/envs",
|
|
1590
|
-
"source": "project",
|
|
1591
|
-
"sourceDescription": "Project config (.vaulter/config.yaml)"
|
|
1592
|
-
},
|
|
1593
|
-
"project": {
|
|
1594
|
-
"value": "my-project",
|
|
1595
|
-
"source": "project.mcp",
|
|
1596
|
-
"sourceDescription": "Project MCP defaults (.vaulter/config.yaml → mcp section)"
|
|
1597
|
-
},
|
|
1598
|
-
"environment": {
|
|
1599
|
-
"value": "dev",
|
|
1600
|
-
"source": "global.mcp",
|
|
1601
|
-
"sourceDescription": "Global MCP defaults (~/.vaulter/config.yaml → mcp section)"
|
|
1602
|
-
}
|
|
1603
|
-
},
|
|
1604
|
-
"configFiles": {
|
|
1605
|
-
"projectConfig": "/home/user/project/.vaulter/config.yaml",
|
|
1606
|
-
"globalConfig": "/home/user/.vaulter/config.yaml"
|
|
1607
|
-
}
|
|
1608
|
-
}
|
|
339
|
+
vaulter tui # Menu
|
|
340
|
+
vaulter tui dashboard # Secrets dashboard
|
|
341
|
+
vaulter tui audit # Audit log viewer
|
|
342
|
+
vaulter tui keys # Key manager
|
|
1609
343
|
```
|
|
1610
344
|
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
| Source | Description |
|
|
1614
|
-
|:-------|:------------|
|
|
1615
|
-
| `cli` | CLI flag (`--backend`, `--project`, etc.) |
|
|
1616
|
-
| `project` | Project config (`.vaulter/config.yaml`) |
|
|
1617
|
-
| `project.mcp` | Project MCP defaults (`.vaulter/config.yaml` → `mcp:` section) |
|
|
1618
|
-
| `global.mcp` | Global MCP defaults (`~/.vaulter/config.yaml` → `mcp:` section) |
|
|
1619
|
-
| `default` | Built-in default value |
|
|
345
|
+
### Shortcuts
|
|
1620
346
|
|
|
1621
|
-
**
|
|
1622
|
-
|
|
1623
|
-
For CLI debugging, use the `--verbose` flag to see config sources on startup:
|
|
1624
|
-
|
|
1625
|
-
```bash
|
|
1626
|
-
vaulter mcp --verbose
|
|
1627
|
-
```
|
|
347
|
+
**Global**: `q` quit · `ESC` back · `↑↓` navigate
|
|
1628
348
|
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
|
1634
|
-
|
|
1635
|
-
| `vaulter_get` | Get a variable |
|
|
1636
|
-
| `vaulter_set` | Set a variable |
|
|
1637
|
-
| `vaulter_delete` | Delete a variable |
|
|
1638
|
-
| `vaulter_list` | List variables |
|
|
1639
|
-
| `vaulter_export` | Export in various formats (shell, env, json, yaml, tfvars, docker-args) |
|
|
1640
|
-
| `vaulter_sync` | Bidirectional sync |
|
|
1641
|
-
| `vaulter_pull` | Download from backend |
|
|
1642
|
-
| `vaulter_push` | Upload to backend |
|
|
1643
|
-
|
|
1644
|
-
#### Discovery & Analysis
|
|
1645
|
-
|
|
1646
|
-
| Tool | Description |
|
|
1647
|
-
|:-----|:------------|
|
|
1648
|
-
| `vaulter_compare` | Compare environments |
|
|
1649
|
-
| `vaulter_search` | Search by pattern |
|
|
1650
|
-
| `vaulter_scan` | Scan monorepo |
|
|
1651
|
-
| `vaulter_services` | List services |
|
|
1652
|
-
| `vaulter_init` | Initialize project |
|
|
1653
|
-
|
|
1654
|
-
#### Integrations
|
|
1655
|
-
|
|
1656
|
-
| Tool | Description |
|
|
1657
|
-
|:-----|:------------|
|
|
1658
|
-
| `vaulter_k8s_secret` | Generate K8s Secret |
|
|
1659
|
-
| `vaulter_k8s_configmap` | Generate K8s ConfigMap |
|
|
1660
|
-
| `vaulter_helm_values` | Generate Helm values.yaml |
|
|
1661
|
-
| `vaulter_tf_vars` | Generate Terraform .tfvars |
|
|
1662
|
-
|
|
1663
|
-
#### Key Management
|
|
1664
|
-
|
|
1665
|
-
| Tool | Description |
|
|
1666
|
-
|:-----|:------------|
|
|
1667
|
-
| `vaulter_key_generate` | Generate encryption key (symmetric or asymmetric) |
|
|
1668
|
-
| `vaulter_key_list` | List all keys (project + global) |
|
|
1669
|
-
| `vaulter_key_show` | Show key details |
|
|
1670
|
-
| `vaulter_key_export` | Export key to encrypted bundle |
|
|
1671
|
-
| `vaulter_key_import` | Import key from encrypted bundle |
|
|
1672
|
-
|
|
1673
|
-
### Resources (10)
|
|
1674
|
-
|
|
1675
|
-
| URI Pattern | Description |
|
|
1676
|
-
|:------------|:------------|
|
|
1677
|
-
| `vaulter://instructions` | ⚠️ **CRITICAL**: How vaulter stores data (read first!) |
|
|
1678
|
-
| `vaulter://mcp-config` | 🔍 Shows WHERE each MCP setting comes from |
|
|
1679
|
-
| `vaulter://config` | Project configuration |
|
|
1680
|
-
| `vaulter://services` | Monorepo services |
|
|
1681
|
-
| `vaulter://keys` | List all encryption keys |
|
|
1682
|
-
| `vaulter://keys/<name>` | Specific key details |
|
|
1683
|
-
| `vaulter://keys/global/<name>` | Global key details |
|
|
1684
|
-
| `vaulter://project/env` | Environment variables |
|
|
1685
|
-
| `vaulter://project/env/service` | Service-specific vars |
|
|
1686
|
-
| `vaulter://compare/env1/env2` | Environment diff
|
|
1687
|
-
|
|
1688
|
-
### Prompts (5)
|
|
1689
|
-
|
|
1690
|
-
- `setup_project` — Initialize a new project
|
|
1691
|
-
- `migrate_dotenv` — Migrate existing .env
|
|
1692
|
-
- `deploy_secrets` — Deploy to Kubernetes
|
|
1693
|
-
- `compare_environments` — Compare two environments
|
|
1694
|
-
- `security_audit` — Audit for security issues
|
|
349
|
+
| Screen | Shortcuts |
|
|
350
|
+
|:-------|:----------|
|
|
351
|
+
| Menu | `1` `2` `3` quick access to screens |
|
|
352
|
+
| Dashboard | `r` refresh · `v` toggle values · `e` cycle env |
|
|
353
|
+
| Audit | `o` filter op · `s` filter source · `/` search · `c` clear |
|
|
354
|
+
| Keys | `r` refresh · `c` toggle config |
|
|
1695
355
|
|
|
1696
356
|
---
|
|
1697
357
|
|
|
@@ -1701,10 +361,8 @@ Download from [Releases](https://github.com/forattini-dev/vaulter/releases):
|
|
|
1701
361
|
|
|
1702
362
|
| Platform | Binary |
|
|
1703
363
|
|:---------|:-------|
|
|
1704
|
-
| Linux x64 | `vaulter-linux-x64` |
|
|
1705
|
-
|
|
|
1706
|
-
| macOS x64 | `vaulter-macos-x64` |
|
|
1707
|
-
| macOS ARM64 | `vaulter-macos-arm64` |
|
|
364
|
+
| Linux x64/ARM64 | `vaulter-linux-x64`, `vaulter-linux-arm64` |
|
|
365
|
+
| macOS x64/ARM64 | `vaulter-macos-x64`, `vaulter-macos-arm64` |
|
|
1708
366
|
| Windows x64 | `vaulter-win-x64.exe` |
|
|
1709
367
|
|
|
1710
368
|
---
|