You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A self-hosted, web-based toolkit for SSL/TLS certificate management, email security, network diagnostics, and cryptographic tooling. Built with a Flask backend and React frontend, orchestrated with Docker Compose.
If you see a default nginx page instead of the app, run ./rebuild-frontend.sh.
This is a known Docker build-cache issue — see TROUBLESHOOTING.md.
Useful commands
docker compose up -d # Start in background
docker compose down # Stop all containers
docker compose logs -f # Tail all logs
docker compose logs -f backend # Backend logs only
./rebuild-frontend.sh # Force-rebuild the frontend
./test_api.sh # Smoke-test the API
Development Setup
Backend
cd backend
pip install -r requirements.txt
python app.py # Dev server on :5000
The production entrypoint used by Gunicorn is main:app. app.py calls create_app() directly for local dev.
Frontend
cd frontend
npm install
npm start # Dev server on :3000 with hot reload
npm test# Jest tests
npm run build # Production build
Configuration
Environment variables
SECRET_KEY=change-this-in-production# Flask secret keyFLASK_ENV=productionADMIN_TOKEN=your-admin-bearer-token# Required for /api/admin/* endpointsREACT_APP_API_URL=/api
Rate limiting defaults
Scope
Limit
Per IP (no key)
200 req/hour, 50 req/min
Per API key
Configurable at key creation time
Set X-API-Key: <key> on requests to rate-limit by key instead of IP.
Language
English (default) and German are bundled. Use the globe icon in the top bar to switch. Translation files live in frontend/src/locales/.
HTTPS
HTTPS is disabled by default. To enable it in production:
Place your certificate and key in nginx/certs/
Uncomment the HTTPS server block in nginx/nginx.conf
Restart: docker compose restart nginx
API Reference
All endpoints are prefixed with /api. POST requests must set Content-Type: application/json unless using multipart/form-data for file upload.
Authentication headers:
X-API-Key: <key> — optional; switches rate-limiting to per-key mode
Authorization: Bearer <ADMIN_TOKEN> — required for all /api/admin/* endpoints
To report a security vulnerability, open a GitHub issue with the security label. Do not describe active exploits in public comments.
Deployment
Production checklist
SECRET_KEY set to a random 32+ character string
ADMIN_TOKEN set for API key management
HTTPS enabled in nginx/nginx.conf with real certificates
Image versions pinned in docker-compose.yml
JSON file storage replaced with PostgreSQL (cert monitor, API keys)
In-memory rate limiter replaced with Redis (storage_uri in app/__init__.py)
FLASK_ENV=production
Log aggregation configured
Health check (GET /api/health) wired into load balancer
Horizontal scaling
The backend is stateless by design. Replace the in-memory rate limiter and cert monitor with Redis + PostgreSQL, then run multiple backend replicas behind the nginx upstream.