Secret ​
Alchemy provides built-in mechanisms for handling sensitive data securely. This guide explains how to manage secrets in your Alchemy resources.
What are Secrets? ​
Secrets in Alchemy are sensitive values that need special handling to prevent exposure in logs, state files, or source code. Examples include:
- API keys and tokens
- Passwords and credentials
- Private certificates
- Connection strings with credentials
Encryption Password ​
Secrets are encrypted using a password that you provide when initializing your Alchemy app:
const app = await alchemy("my-app", {
stage: "dev",
password: process.env.SECRET_PASSPHRASE,
});
IMPORTANT
Always store your encryption password securely and never commit it to source control.
Using the alchemy.secret() Function ​
The primary way to handle secrets in Alchemy is with the alchemy.secret()
function:
// Create a secret from an environment variable
const apiKey = alchemy.secret(process.env.API_KEY);
When a secret is stored in state, it is automatically encrypted:
{
"props": {
"key": {
"@secret": "Tgz3e/WAscu4U1oanm5S4YXH..."
}
}
}
Multiple Secret Values ​
You can create multiple secrets in your application:
// Create multiple secrets from environment variables
const apiKey = alchemy.secret(process.env.API_KEY);
const databaseUrl = alchemy.secret(process.env.DATABASE_URL);
const jwtSecret = alchemy.secret(process.env.JWT_SECRET);
Using Secrets in Resources ​
Secrets can be passed to resources like Cloudflare Workers. First, define your worker script:
// worker-script.ts
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
if (url.pathname.startsWith('/env/')) {
const varName = url.pathname.split('/env/')[1];
const value = env[varName];
return new Response(value || 'undefined', {
status: 200,
headers: { 'Content-Type': 'text/plain' }
});
}
return new Response('Secret is safe: ' + env.API_KEY, { status: 200 });
}
};
Then use the script and bind the secrets:
// Use the script with secrets
const worker = await Worker("multi-secret-worker", {
name: "multi-secret-worker",
script: workerScript,
format: "esm",
bindings: {
API_KEY: alchemy.secret(process.env.API_KEY),
DATABASE_URL: alchemy.secret(process.env.DATABASE_URL),
JWT_SECRET: alchemy.secret(process.env.JWT_SECRET)
}
});