Version: 2.0
Last Updated: October 2025
Project: Blockchain-Based Financial Management Application
- Quick Start
- Server Deployment
- Local Installation
- Configuration Reference
- ResilientDB Integration
- ResVault Wallet Setup
- Troubleshooting
- Security Guidelines
- Architecture Overview
- Development Scripts
- Node.js 16.x or higher
- MongoDB 6.x or higher
- Git
- ResVault Chrome Extension (for production only)
# 1. Clone repository
git clone https://github.com/quiet98k/ecs189f-final-project.git
cd ecs189f-final-project
# 2. Configure environment
cp local/backend.env.example backend/.env
cp local/frontend.env.example resCash/.env.local
# Edit backend/.env and resCash/.env.local with your settings
# 3. Run setup script
# Windows:
.\setup-local.ps1
# Linux/macOS:
chmod +x setup-local.sh && ./setup-local.shAccess: http://localhost:3000
- Ubuntu 20.04+ or Debian 10+
- 2+ CPU cores
- 4GB+ RAM
- 20GB+ disk space
- Public IP address or domain name
# On your production server
git clone https://github.com/quiet98k/ecs189f-final-project.git
cd ecs189f-final-project
chmod +x deploy-server.sh
./deploy-server.shThe script will:
- Install Node.js, MongoDB, PM2, and Nginx
- Prompt for configuration (domain, ResilientDB URLs)
- Generate secure secrets
- Build and deploy the application
- Configure reverse proxy and firewall
- Optionally install SSL certificate
# Update system
sudo apt update && sudo apt upgrade -y
# Install Node.js 18.x
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
# Install MongoDB
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt update
sudo apt install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod
# Install PM2
sudo npm install -g pm2
# Install Nginx
sudo apt install -y nginx
sudo systemctl enable nginxcd backend
# Copy configuration template
cp ../local/backend.env.example .env
# Edit configuration
nano .envRequired settings for production:
# MongoDB
MONGODB_URI=mongodb://127.0.0.1:27017
MONGODB_DB_NAME=rescash_production
# ResilientDB - Update with your server URLs
GRAPHQL_URI=http://YOUR_RESILIENTDB_HOST:8000/graphql
CROW_SERVER_URI=http://YOUR_RESILIENTDB_HOST:18000/v1/transactions
# Security - Generate random secrets
SESSION_SECRET=<run: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))">
JWT_SECRET=<run: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))">
# Server
PORT=8099
HOST=0.0.0.0
# Production flags
ENABLE_RESILIENT_SYNC=true
ENABLE_DEV_LOGIN=false
DEV_PUBLIC_KEY=# Install dependencies
npm install --production
# Start with PM2
pm2 start server.js --name rescash-backend
pm2 save
pm2 startupcd ../resCash
# Copy configuration template
cp ../local/frontend.env.example .env.local
# Edit configuration
nano .env.localRequired settings:
REACT_APP_ENABLE_DEV_LOGIN=false
REACT_APP_API_BASE_URL=https://your-domain.com/api# Install dependencies and build
npm install
npm run buildsudo nano /etc/nginx/sites-available/rescashNginx configuration:
server {
listen 80;
server_name your-domain.com;
# Frontend
location / {
root /var/www/ecs189f-final-project/resCash/build;
try_files $uri $uri/ /index.html;
}
# Backend API
location /api/ {
proxy_pass http://127.0.0.1:8099/api/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}# Enable site
sudo ln -s /etc/nginx/sites-available/rescash /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginxsudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enablesudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com# Check backend status
pm2 status
pm2 logs rescash-backend
# Check MongoDB
mongosh
> use rescash_production
> db.transactions.countDocuments()
# Check Nginx
sudo nginx -t
sudo systemctl status nginx
# Test application
curl http://your-domain.com
curl http://your-domain.com/api/test# Clone repository
git clone https://github.com/quiet98k/ecs189f-final-project.git
cd ecs189f-final-project
# Configure environment
cp local\backend.env.example backend\.env
cp local\frontend.env.example resCash\.env.local
# Edit configuration files
notepad backend\.env
notepad resCash\.env.local
# Run setup script
.\setup-local.ps1
# Start application
.\start-dev.ps1# Clone repository
git clone https://github.com/quiet98k/ecs189f-final-project.git
cd ecs189f-final-project
# Configure environment
cp local/backend.env.example backend/.env
cp local/frontend.env.example resCash/.env.local
# Edit configuration files
nano backend/.env
nano resCash/.env.local
# Make scripts executable
chmod +x *.sh
# Run setup script
./setup-local.sh
# Start application
./start-dev.shMongoDB:
- Windows: https://www.mongodb.com/try/download/community
- macOS:
brew install mongodb-community - Linux: See server deployment section
Node.js:
- Download from https://nodejs.org/ (LTS version recommended)
# Windows
net start MongoDB
# macOS
brew services start mongodb-community
# Linux
sudo systemctl start mongodcd backend
# Copy configuration
cp ../local/backend.env.example .env
# Edit .env fileLocal development settings:
MONGODB_URI=mongodb://127.0.0.1:27017
MONGODB_DB_NAME=rescash_test
# If you have ResilientDB, update these URLs
# Otherwise, they won't be used with ENABLE_RESILIENT_SYNC=false
GRAPHQL_URI=http://YOUR_RESILIENTDB_HOST:8000/graphql
CROW_SERVER_URI=http://YOUR_RESILIENTDB_HOST:18000/v1/transactions
SESSION_SECRET=local_dev_secret
JWT_SECRET=local_dev_jwt_secret
PORT=8099
HOST=127.0.0.1
# Local development mode (no blockchain required)
ENABLE_RESILIENT_SYNC=false
ENABLE_DEV_LOGIN=true
DEV_PUBLIC_KEY=LOCAL_TEST_PUBLIC_KEY# Install dependencies
npm install
# Start backend
npm startOpen new terminal:
cd resCash
# Copy configuration
cp ../local/frontend.env.example .env.local
# Edit .env.local fileSettings:
REACT_APP_ENABLE_DEV_LOGIN=true
REACT_APP_API_BASE_URL=http://localhost:8099# Install dependencies
npm install
# Start frontend
npm startAccess: http://localhost:3000
Features:
- ✅ Bypasses ResVault authentication
- ✅ Disables blockchain synchronization
- ✅ Uses local MongoDB only
- ✅ Faster startup
- ❌ No blockchain features
Configuration:
# Backend
ENABLE_DEV_LOGIN=true
ENABLE_RESILIENT_SYNC=false
# Frontend
REACT_APP_ENABLE_DEV_LOGIN=trueFeatures:
- ✅ ResVault authentication required
- ✅ Blockchain synchronization enabled
- ✅ Secure transaction signing
- ✅ Full blockchain features
Configuration:
# Backend
ENABLE_DEV_LOGIN=false
ENABLE_RESILIENT_SYNC=true
# Frontend
REACT_APP_ENABLE_DEV_LOGIN=false| Variable | Description | Example | Required |
|---|---|---|---|
MONGODB_URI |
MongoDB connection string | mongodb://127.0.0.1:27017 |
Yes |
MONGODB_DB_NAME |
Database name | rescash_production |
Yes |
GRAPHQL_URI |
ResilientDB GraphQL endpoint | http://server:8000/graphql |
Yes* |
CROW_SERVER_URI |
ResilientDB transaction endpoint | http://server:18000/v1/transactions |
Yes* |
SESSION_SECRET |
Session encryption key | Random 32-byte hex | Yes |
JWT_SECRET |
JWT token signing key | Random 32-byte hex | Yes |
PORT |
Backend server port | 8099 |
No |
HOST |
Server bind address | 0.0.0.0 (prod), 127.0.0.1 (dev) |
No |
ENABLE_RESILIENT_SYNC |
Enable blockchain sync | true / false |
Yes |
ENABLE_DEV_LOGIN |
Enable dev mode bypass | true / false |
Yes |
DEV_PUBLIC_KEY |
Dev mode public key | Any string | No |
* Required only when ENABLE_RESILIENT_SYNC=true
| Variable | Description | Example | Required |
|---|---|---|---|
REACT_APP_ENABLE_DEV_LOGIN |
Show dev login option | true / false |
Yes |
REACT_APP_API_BASE_URL |
Backend API URL | http://localhost:8099 |
Yes |
# backend/.env
MONGODB_URI=mongodb://127.0.0.1:27017
MONGODB_DB_NAME=rescash_test
GRAPHQL_URI=http://your-resilientdb:8000/graphql
CROW_SERVER_URI=http://your-resilientdb:18000/v1/transactions
SESSION_SECRET=dev_session_secret
JWT_SECRET=dev_jwt_secret
PORT=8099
HOST=127.0.0.1
ENABLE_RESILIENT_SYNC=false
ENABLE_DEV_LOGIN=true
DEV_PUBLIC_KEY=LOCAL_TEST_PUBLIC_KEY# resCash/.env.local
REACT_APP_ENABLE_DEV_LOGIN=true
REACT_APP_API_BASE_URL=http://localhost:8099# backend/.env
MONGODB_URI=mongodb://127.0.0.1:27017
MONGODB_DB_NAME=rescash_production
GRAPHQL_URI=http://your-resilientdb:8000/graphql
CROW_SERVER_URI=http://your-resilientdb:18000/v1/transactions
SESSION_SECRET=<32-byte-random-hex>
JWT_SECRET=<32-byte-random-hex>
PORT=8099
HOST=0.0.0.0
ENABLE_RESILIENT_SYNC=true
ENABLE_DEV_LOGIN=false
DEV_PUBLIC_KEY=# resCash/.env.local
REACT_APP_ENABLE_DEV_LOGIN=false
REACT_APP_API_BASE_URL=https://your-domain.com/apiResilientDB is a high-performance blockchain platform that provides:
- Distributed ledger for immutable transaction records
- Byzantine fault-tolerant consensus
- High throughput and low latency
- GraphQL API for querying
- REST API for transaction submission
ResCash integrates with two ResilientDB services:
-
GraphQL Server (Port 8000)
- Query transaction data
- Retrieve public keys
- Read blockchain state
-
Crow HTTP Server (Port 18000)
- Submit new transactions
- Retrieve transaction lists
- WebSocket updates
All ResilientDB URLs are configured via environment variables:
# In backend/.env
GRAPHQL_URI=http://YOUR_RESILIENTDB_HOST:8000/graphql
CROW_SERVER_URI=http://YOUR_RESILIENTDB_HOST:18000/v1/transactionsImportant: Replace YOUR_RESILIENTDB_HOST with your actual ResilientDB server address.
If you don't have your own ResilientDB instance, you can use a public one:
GRAPHQL_URI=http://PUBLIC_INSTANCE_IP:8000/graphql
CROW_SERVER_URI=http://PUBLIC_INSTANCE_IP:18000/v1/transactionsNote: Public instances are suitable for testing only. For production, deploy your own ResilientDB cluster.
ResCash uses resilient-node-cache to sync blockchain data to MongoDB:
How it works:
- WebSocket connects to ResilientDB Crow server
- Listens for new block notifications
- Automatically syncs new transactions to MongoDB
- Provides fast local queries while maintaining blockchain integrity
Configuration:
ENABLE_RESILIENT_SYNC=true # Enable syncThe sync service automatically derives WebSocket URL from CROW_SERVER_URI.
# Test GraphQL endpoint
curl -X POST http://YOUR_RESILIENTDB_HOST:8000/graphql \
-H "Content-Type: application/json" \
-d '{"query": "{ __typename }"}'
# Test Crow server
curl http://YOUR_RESILIENTDB_HOST:18000/v1/transactionsResVault is a Chrome extension that serves as a blockchain wallet for ResilientDB:
- Manages cryptographic key pairs
- Signs transactions securely
- Provides authentication for dApps
- Similar to MetaMask for Ethereum
-
Install Chrome/Edge Browser
- ResVault requires Chromium-based browser
-
Install ResVault Extension
- Visit: https://blog.resilientdb.com/2023/09/21/ResVault.html
- Follow installation instructions
- Or search "ResVault" in Chrome Web Store
-
Create Wallet
- Click ResVault icon in browser
- Create new wallet or import existing
- IMPORTANT: Backup your seed phrase securely!
-
Configure ResilientDB Endpoint
- Click ResVault settings icon
- Set GraphQL URL to match your backend configuration:
http://YOUR_RESILIENTDB_HOST:8000/graphql - This MUST match the
GRAPHQL_URIinbackend/.env
When REACT_APP_ENABLE_DEV_LOGIN=false:
- User clicks "Sign In Via ResVault"
- ResVault popup appears
- User approves connection
- ResVault creates authentication transaction on blockchain
- Backend retrieves transaction and issues JWT
- User is authenticated
- User fills transaction form
- Clicks "Submit Transaction"
- ResVault popup shows transaction details
- User signs transaction with private key
- Transaction is submitted to ResilientDB
- Backend caches transaction metadata in MongoDB
For local testing without ResVault:
# backend/.env
ENABLE_DEV_LOGIN=true
# resCash/.env.local
REACT_APP_ENABLE_DEV_LOGIN=trueThis enables "Retry Dev Login" button that bypasses ResVault authentication.
WARNING: Never use dev mode in production!
# Check if MongoDB is running
mongosh
# If connection fails:
# Windows
net start MongoDB
# macOS
brew services start mongodb-community
# Linux
sudo systemctl start mongod
sudo systemctl status mongodCheck backend/.env:
MONGODB_URI=mongodb://127.0.0.1:27017 # Correct formatView MongoDB logs:
# Linux
sudo tail -f /var/log/mongodb/mongod.log
# MongoDB log location varies by OSSolution 1: Disable sync for local development
# backend/.env
ENABLE_RESILIENT_SYNC=falseSolution 2: Verify ResilientDB URLs
# Test GraphQL
curl http://YOUR_RESILIENTDB_HOST:8000/graphql
# Test Crow server
curl http://YOUR_RESILIENTDB_HOST:18000/v1/transactionsSolution 3: Check firewall allows connections to ports 8000 and 18000
If you see WebSocket connection errors but don't need blockchain features:
ENABLE_RESILIENT_SYNC=false- Verify ResVault is installed:
chrome://extensions - Ensure ResVault is enabled
- Check browser console (F12) for errors
- Try reloading the page
- Check that ResVault GraphQL URL matches backend:
- ResVault settings:
http://YOUR_HOST:8000/graphql - backend/.env:
GRAPHQL_URI=http://YOUR_HOST:8000/graphql
- ResVault settings:
- Refresh the page after changing settings
Ensure dev mode is enabled:
# backend/.env
ENABLE_DEV_LOGIN=true
# resCash/.env.local
REACT_APP_ENABLE_DEV_LOGIN=trueRestart both backend and frontend after changes.
# Find and kill process
# Windows
Get-NetTCPConnection -LocalPort 8099 | Select-Object -ExpandProperty OwningProcess | Stop-Process -Force
# Linux/macOS
lsof -ti:8099 | xargs kill -9# Windows
Get-NetTCPConnection -LocalPort 3000 | Select-Object -ExpandProperty OwningProcess | Stop-Process -Force
# Linux/macOS
lsof -ti:3000 | xargs kill -9Symptom: Network errors in browser console
Solutions:
-
Verify backend is running:
curl http://localhost:8099/test
-
Check
resCash/.env.local:REACT_APP_API_BASE_URL=http://localhost:8099
-
Restart frontend after changing
.env.local
cd backend
rm -rf node_modules package-lock.json
npm installcd resCash
rm -rf node_modules package-lock.json
npm install# View logs
pm2 logs rescash-backend
# Restart application
pm2 restart rescash-backend
# View status
pm2 status
# Reset PM2
pm2 delete all
pm2 start server.js --name rescash-backend
pm2 saveBefore deploying to production, verify:
-
ENABLE_DEV_LOGIN=falsein backend.env -
REACT_APP_ENABLE_DEV_LOGIN=falsein frontend.env.local - Strong random
SESSION_SECRET(32+ bytes) - Strong random
JWT_SECRET(32+ bytes) - HTTPS enabled with valid SSL certificate
- Firewall configured (only ports 80, 443, 22 open)
- MongoDB not exposed to internet (bind to 127.0.0.1)
-
.envfiles not committed to Git - ResVault configured with correct GraphQL URL
- Regular backups configured for MongoDB
- PM2 logs rotation enabled
- Nginx security headers configured
# Generate SESSION_SECRET
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
# Generate JWT_SECRET
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"Copy output to .env file.
DO:
- Use
.env.examplefiles as templates - Keep
.envfiles local only - Add
.envto.gitignore - Use different secrets for dev/prod
- Rotate secrets periodically (every 3-6 months)
DON'T:
- Commit
.envfiles to Git - Share
.envfiles publicly - Use default/example secrets in production
- Hardcode secrets in source code
# Bind to localhost only
# In MongoDB config (/etc/mongod.conf):
net:
bindIp: 127.0.0.1
port: 27017
# Enable authentication (optional but recommended)
security:
authorization: enabledAdd to Nginx configuration:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;-
Update dependencies:
npm audit npm audit fix npm update
-
Monitor logs:
pm2 logs rescash-backend sudo tail -f /var/log/nginx/error.log
-
Backup database:
mongodump --out /backups/rescash-$(date +%Y%m%d)
┌─────────────────────────────────────┐
│ User Browser │
│ ┌─────────────────────────────┐ │
│ │ React Frontend (Port 3000) │ │
│ └────────────┬────────────────┘ │
│ │ │
│ ┌────────────▼────────────────┐ │
│ │ ResVault SDK Integration │ │
│ └────────────┬────────────────┘ │
└────────────────┼────────────────────┘
│ HTTP/WebSocket
│
┌────────────────▼────────────────────┐
│ ResilientDB Blockchain │
│ ┌──────────────────────────────┐ │
│ │ GraphQL Server (Port 8000) │ │
│ └──────────────────────────────┘ │
│ ┌──────────────────────────────┐ │
│ │ Crow Server (Port 18000) │ │
│ └──────────────────────────────┘ │
└────────────────┬────────────────────┘
│ GraphQL / REST
┌────────────────▼────────────────────┐
│ Backend Server (Port 8099) │
│ ┌──────────────────────────────┐ │
│ │ Express REST API │ │
│ │ JWT Authentication │ │
│ │ WebSocket Sync Service │ │
│ └──────────────────────────────┘ │
└────────────────┬────────────────────┘
│ Mongoose ORM
┌────────────────▼────────────────────┐
│ MongoDB (Port 27017) │
│ - Transaction Cache │
│ - User Sessions │
│ - Query Optimization │
└─────────────────────────────────────┘
- User fills form in React frontend
- Frontend calls ResVault SDK
- ResVault signs transaction with private key
- Transaction submitted to ResilientDB
- Backend receives transaction ID
- Backend fetches transaction details from ResilientDB
- Backend caches transaction in MongoDB
- Frontend displays confirmation
- Frontend requests transaction list
- Backend queries MongoDB (fast)
- Optional: Sync check with ResilientDB
- Backend returns JSON response
- Frontend displays charts and tables
- User clicks "Sign In Via ResVault"
- ResVault creates authentication transaction
- Transaction includes user's public key
- Backend retrieves public key from blockchain
- Backend generates JWT with public key
- JWT stored in browser session
- JWT sent with all API requests
Frontend:
- React 19 + TypeScript
- Bootstrap 5 + CoreUI
- ResVault SDK
- Lottie animations
- Custom Canvas charts
Backend:
- Node.js 18+
- Express 4
- Mongoose (MongoDB ODM)
- Apollo Client (GraphQL)
- resilient-node-cache (WebSocket sync)
- JWT (authentication)
Database:
- MongoDB 6 (local cache)
- ResilientDB (blockchain ledger)
DevOps:
- PM2 (process management)
- Nginx (reverse proxy)
- Certbot (SSL certificates)
Windows:
setup-local.ps1- Install dependencies and configurestart-dev.ps1- Start both serversstop-dev.ps1- Stop all processescheck-config.ps1- Verify configuration
Linux/macOS:
setup-local.sh- Install dependencies and configurestart-dev.sh- Start both serversstop-dev.sh- Stop all processescheck-config.sh- Verify configuration
deploy-server.sh- Automated server deployment (Linux only)
Purpose: One-time setup for local development
What it does:
- Checks prerequisites (Node.js, MongoDB, npm)
- Copies configuration templates
- Installs backend dependencies
- Installs frontend dependencies
- Verifies MongoDB status
- Creates start/stop scripts
Usage:
# Windows
.\setup-local.ps1
# Linux/macOS
chmod +x setup-local.sh
./setup-local.shPurpose: Start development servers
What it does:
- Starts backend on port 8099
- Starts frontend on port 3000
- Opens browser automatically
Usage:
# Windows
.\start-dev.ps1
# Linux/macOS
./start-dev.shPurpose: Stop all development servers
What it does:
- Kills processes on port 8099
- Kills processes on port 3000
Usage:
# Windows
.\stop-dev.ps1
# Linux/macOS
./stop-dev.shPurpose: Verify configuration before running
What it does:
- Checks if
.envfiles exist - Verifies required variables are set
- Warns about dev mode in production
- Checks dependencies installation
- Verifies MongoDB status
Output:
- ✓ Green: Configuration correct
- ✗ Red: Missing or incorrect
- ⚠ Yellow: Warning to review
Usage:
# Windows
.\check-config.ps1
# Linux/macOS
./check-config.shPurpose: Automated production deployment
What it does:
- Interactive configuration wizard
- Installs all server dependencies
- Configures environment variables
- Builds frontend for production
- Sets up PM2 process manager
- Configures Nginx reverse proxy
- Sets up firewall rules
- Optionally installs SSL certificate
Usage:
# On production server (Ubuntu/Debian)
chmod +x deploy-server.sh
./deploy-server.shcd backend
# Development mode
npm start
# Production mode (with PM2)
pm2 start server.js --name rescash-backend
pm2 logs rescash-backend
pm2 restart rescash-backend
pm2 stop rescash-backendcd resCash
# Development server
npm start
# Production build
npm run build
# Serve production build (for testing)
npx serve -s build# Start
# Windows: net start MongoDB
# macOS: brew services start mongodb-community
# Linux: sudo systemctl start mongod
# Connect
mongosh
# Use database
use rescash_test
# View collections
show collections
# Count transactions
db.transactions.countDocuments()
# View recent transactions
db.transactions.find().limit(5).pretty()- ResilientDB: https://resilientdb.com/
- ResVault Guide: https://blog.resilientdb.com/2023/09/21/ResVault.html
- MongoDB Docs: https://www.mongodb.com/docs/
- React Docs: https://react.dev/
- Express Docs: https://expressjs.com/
- Configuration Templates:
local/directory - Example Configurations: See section 4.3
- GitHub Repository: https://github.com/quiet98k/ecs189f-final-project
- Issues: https://github.com/quiet98k/ecs189f-final-project/issues
- Configuration Check: Run
check-config.shorcheck-config.ps1
-
Configuration is Everything
- All deployment differences are in
.envfiles - Copy from
local/templates - Update ResilientDB URLs to match your deployment
- All deployment differences are in
-
Development vs Production
- Dev mode:
ENABLE_DEV_LOGIN=true, no ResVault needed - Prod mode:
ENABLE_DEV_LOGIN=false, ResVault required
- Dev mode:
-
ResilientDB URLs
- No hardcoded addresses in code
- All URLs from environment variables
- Update
GRAPHQL_URIandCROW_SERVER_URIin backend/.env
-
One-Command Setup
setup-local.sh/.ps1for local developmentdeploy-server.shfor production- Modify .env files as needed
-
Security First
- Generate random secrets for production
- Disable dev login in production
- Use HTTPS with SSL certificate
- Never commit
.envfiles
Last Updated: October 2025
Version: 2.0
Project: ResCash - Blockchain Financial Management
Institution: UC Davis - ECS 189F Fall 2024