| # Security Guidelines - Crossword App | |
| ## π Environment Variables & API Keys | |
| ### β **Secure Practices Implemented** | |
| #### **1. Environment Files** | |
| - β `.env` files are gitignored | |
| - β `.env.example` template provided | |
| - β No real secrets in source code | |
| - β Automatic setup script provided | |
| #### **2. API Key Management** | |
| **Local Development:** | |
| ```bash | |
| # 1. Set up environment | |
| ./setup-env.sh | |
| # 2. Edit .env with your real key | |
| HUGGINGFACE_API_KEY=hf_your_real_key_here | |
| # 3. .env is automatically gitignored | |
| ``` | |
| **Production Deployment:** | |
| - **HuggingFace Spaces**: Use Settings β Environment Variables | |
| - **Railway/Heroku**: Use config vars | |
| - **Docker**: Pass as runtime environment variables | |
| #### **3. Default Security** | |
| - π‘οΈ **Graceful fallback** when API keys missing | |
| - π‘οΈ **No crashes** on missing configuration | |
| - π‘οΈ **Warning messages** instead of errors | |
| - π‘οΈ **Safe defaults** for all settings | |
| ### π¨ **What NOT to Do** | |
| β Never commit real API keys: | |
| ```javascript | |
| // β NEVER DO THIS | |
| const apiKey = 'hf_real_key_here'; | |
| ``` | |
| β Never hardcode secrets: | |
| ```javascript | |
| // β NEVER DO THIS | |
| const config = { | |
| huggingfaceKey: 'hf_abcd1234...' | |
| }; | |
| ``` | |
| β Never share .env files: | |
| ```bash | |
| # β NEVER DO THIS | |
| git add .env | |
| git commit -m "added config" | |
| ``` | |
| ### β **Safe Patterns** | |
| β Always use environment variables: | |
| ```javascript | |
| // β SAFE | |
| const apiKey = process.env.HUGGINGFACE_API_KEY; | |
| ``` | |
| β Always check for existence: | |
| ```javascript | |
| // β SAFE WITH FALLBACK | |
| if (!apiKey || apiKey === 'hf_xxxxxxxxxx') { | |
| console.warn('API key not configured, using fallback'); | |
| return this.fallbackMethod(); | |
| } | |
| ``` | |
| β Always use templates: | |
| ```bash | |
| # β SAFE | |
| cp .env.example .env | |
| # Edit .env with real values | |
| ``` | |
| ## π **File Security** | |
| ### **Gitignore Coverage** | |
| ```gitignore | |
| # Environment files | |
| .env | |
| .env.local | |
| .env.*.local | |
| # Security files | |
| *.key | |
| *.pem | |
| .secret | |
| secrets/ | |
| ``` | |
| ### **File Structure** | |
| ``` | |
| backend/ | |
| βββ .env.example # β Safe template (committed) | |
| βββ .env # π Real values (gitignored) | |
| βββ .env.backup # π Backup (gitignored) | |
| βββ setup-env.sh # β Setup script (committed) | |
| ``` | |
| ## π **Deployment Security** | |
| ### **HuggingFace Spaces** | |
| 1. Go to Space Settings | |
| 2. Add Environment Variable: `HUGGINGFACE_API_KEY` | |
| 3. Set value to your real API key | |
| 4. Restart space | |
| ### **Docker Deployment** | |
| ```bash | |
| # Runtime environment variable | |
| docker run -e HUGGINGFACE_API_KEY=hf_your_key app | |
| ``` | |
| ### **CI/CD Pipelines** | |
| ```yaml | |
| # GitHub Actions example | |
| env: | |
| HUGGINGFACE_API_KEY: ${{ secrets.HUGGINGFACE_API_KEY }} | |
| ``` | |
| ## π **Security Verification** | |
| ### **Pre-commit Checklist** | |
| - [ ] No real API keys in code | |
| - [ ] .env in .gitignore | |
| - [ ] Only .env.example committed | |
| - [ ] All secrets use environment variables | |
| - [ ] Fallback mechanisms working | |
| ### **Testing Security** | |
| ```bash | |
| # Test without API key | |
| unset HUGGINGFACE_API_KEY | |
| npm run dev | |
| # Should work with fallback | |
| # Test with invalid key | |
| export HUGGINGFACE_API_KEY="invalid" | |
| npm run dev | |
| # Should gracefully fallback | |
| ``` | |
| ## π **Resources** | |
| - [HuggingFace API Keys](https://huggingface.co/settings/tokens) | |
| - [Environment Variable Best Practices](https://12factor.net/config) | |
| - [Git Security Guidelines](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure) | |
| ## π **If API Key Gets Exposed** | |
| 1. **Immediately revoke** the key at https://huggingface.co/settings/tokens | |
| 2. **Generate new key** with appropriate permissions | |
| 3. **Update** all deployment environments | |
| 4. **Check git history** for any committed secrets | |
| 5. **Consider repository security scan** | |
| --- | |
| **Remember**: Security is a process, not a destination. Always be vigilant! π‘οΈ |