Self-hosted backup orchestration without vendor lock-in
Centralized backup management to gain independence and autonomy over your data
Testing/stability/feedback, not adding more (significant) features at the moment.
- Deploy a Redis container
- Deploy a PostgreSQL container
-
Create a new service using the Docker Image option
-
Enter the image URL:
ghcr.io/heijmerikx/stashd-backend:0.1.0-alpha.9Choose the latest image tag available.
-
Configure environment variables (use Railway references to connect to your databases):
Variable Description DB_HOSTPostgreSQL host DB_NAMEPostgreSQL database name DB_USERPostgreSQL user DB_PASSWORDPostgreSQL password REDIS_HOSTRedis host REDIS_USERNAMERedis username REDIS_PASSWORDRedis password JWT_SECRETSecret for JWT signing (32+ chars) ENCRYPTION_SECRETSecret for encrypting credentials (32+ chars)
-
Create a new service using the Docker Image option
-
Enter the image URL:
ghcr.io/heijmerikx/stashd-frontend:0.1.0-alpha.9Here too, have the version match the backend image tag
-
Configure environment variables:
Variable Description BACKEND_URLInternal backend URL, e.g. https://my-stashd-backend.up.railway.app(without/api)The frontend nginx proxies
/apirequests to the backend, so no CORS configuration is needed.
- Create a
.envfile with required variables:
DB_PASSWORD=your_secure_db_password
JWT_SECRET=your_jwt_secret_min_32_chars
ENCRYPTION_SECRET=your_encryption_secret_min_32_chars
CORS_ORIGIN=http://localhost- Run with Docker Compose:
docker compose up -dThis starts:
- Frontend: http://localhost (port 80)
- Backend API: http://localhost:3000
- PostgreSQL and Redis (internal)
- 2 worker replicas for backup job processing
Optional environment variables:
STASHD_VERSION- Image version tag (default:alpha)HTTP_PORT- Frontend port (default: 80)API_PORT- Backend API port (default: 3000)BACKUP_PATH- Host path for backup storage (default: Docker volume)
To pin a specific version:
STASHD_VERSION=0.1.0-alpha.1 docker compose up -dCheck the k8s directory for examples for reference.
Run with Docker Compose:
docker compose -f docker-compose.dev.yml up -dThis starts:
- Frontend: http://localhost:5173
- Backend API: http://localhost:8080
- PostgreSQL: localhost:5430
- Redis: localhost:6380
PORT- Server port (default: 3000)DB_HOST- PostgreSQL hostDB_PORT- PostgreSQL portDB_NAME- Database nameDB_USER- Database userDB_PASSWORD- Database passwordREDIS_HOST- Redis host for job queueREDIS_PORT- Redis port (default: 6379)JWT_SECRET- Secret for JWT signingENCRYPTION_SECRET- Secret for encrypting sensitive data (notification credentials). Must be 32+ characters for AES-256CORS_ORIGIN- Allowed CORS origin
BACKEND_URL- Backend URL for nginx proxy (e.g.http://backend:8080)
The backend handles SIGTERM gracefully - it waits for active backup jobs to complete before exiting. This prevents interrupted backups during deployments.
Docker Compose: Uses stop_grace_period: 5m to allow up to 5 minutes for backups to complete.
Kubernetes: Set terminationGracePeriodSeconds in your Pod spec:
spec:
terminationGracePeriodSeconds: 300 # 5 minutesStashd uses semantic versioning. During alpha, images are tagged as:
0.1.0-alpha.1,0.1.0-alpha.2, etc. - specific versionsalpha- latest alpha release
Stashd is dual-licensed under Apache 2.0 and a commercial license.
- Personal & Open Source: Free under Apache 2.0
- Commercial Use: Requires a commercial license
