A step-by-step guide to deploying your own password manager on a local machine or Google Cloud VPS.
Before you begin, make sure you have the following:
node --version and npm --version in your terminal. You should see version numbers 18+ and 9+ respectively.
Get AccessNode running on your local machine first to verify everything works.
git clone https://github.com/your-username/accessnode.git cd accessnode
If you don't have the repository, download and extract the project files into a folder called accessnode.
npm install
This installs all required packages: Express, SQLite, bcrypt, JWT, and more. It may take 30-60 seconds.
Copy the example environment file and edit it with your settings:
cp .env.example .env
Open .env in your editor and change the values:
PORT=3000 JWT_SECRET=generate-a-random-string-here-at-least-32-chars SESSION_EXPIRY=24h
JWT_SECRET must be a long, random string. Never use the default value in production. You can generate one with:node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
npm start
You should see AccessNode running at http://localhost:3000. Open this URL in your browser. The SQLite database (accessnode.db) is created automatically on first run.
http://localhost:3000, click "Get Started Free", create an account with any email and password (min. 8 characters), and you'll be taken to your dashboard.
Deploy AccessNode on a Google Cloud VPS for 24/7 availability.
Go to the Google Cloud Console → Compute Engine → VM Instances and click Create Instance.
Name: accessnode-server
Region & Zone: Choose one close to your users (e.g., us-central1-a)
Machine type: e2-micro or e2-small is sufficient (0.5-1 vCPU, 1-2 GB RAM)
Boot disk: Ubuntu 22.04 LTS, 20 GB standard persistent disk
Firewall: Check both Allow HTTP traffic and Allow HTTPS traffic
Click Create. Wait ~30 seconds for the VM to provision.
AccessNode runs on port 3000 by default. Create a firewall rule to allow traffic:
Go to VPC Network → Firewall → Create Firewall Rule
Name: allow-accessnode
Targets: All instances in the network
Source IP ranges: 0.0.0.0/0
Protocols and ports: tcp:3000,80,443
Click Create
Prevent your IP from changing on VM restart:
accessnode-ipSSH into your VM and install the required software.
gcloud compute ssh accessnode-server
Or use the SSH button in the Google Cloud Console next to your VM instance.
# Add NodeSource repository curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - # Install Node.js and npm sudo apt-get install -y nodejs # Verify installation node --version npm --version
sudo apt-get update sudo apt-get install -y git
cd /opt sudo git clone https://github.com/your-username/accessnode.git sudo chown -R $USER:$USER /opt/accessnode cd /opt/accessnode npm install
If you're uploading files directly instead of using git, use scp or the Google Cloud Console file upload.
cp .env.example .env nano .env
Generate a secure JWT_SECRET and update the .env file:
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
Copy the output and paste it into your .env as the JWT_SECRET.
.env file has:
NODE_ENV=production (enables stricter security)node server.js
You should see AccessNode running at http://localhost:3000. Press Ctrl+C to stop it after confirming it works.
Test from your browser at http://YOUR_VM_IP:3000. You should see the landing page.
A reverse proxy lets you serve AccessNode on standard ports (80/443) and adds a layer of security.
sudo apt-get install -y nginx
sudo nano /etc/nginx/sites-available/accessnode
Paste the following configuration:
server {
listen 80;
server_name your-domain.com;
client_max_body_size 10m;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
Replace your-domain.com with your actual domain or VM IP address.
sudo ln -s /etc/nginx/sites-available/accessnode /etc/nginx/sites-enabled/ sudo rm /etc/nginx/sites-enabled/default # Remove default site sudo nginx -t # Test configuration sudo systemctl reload nginx # Apply changes
Now you can access AccessNode at http://your-domain.com or http://YOUR_VM_IP without specifying a port.
Enable HTTPS for secure, encrypted connections to your password manager.
sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com
Follow the prompts. Certbot will automatically update your Nginx config to use HTTPS and set up auto-renewal.
sudo certbot renew --dry-run
If this succeeds, your certificates will auto-renew before expiry. Certbot adds a cron job for this automatically.
After enabling SSL, update your .env to set the app URL so cookies and redirects use HTTPS:
NODE_ENV=production
PM2 keeps AccessNode running 24/7, auto-restarts on crashes, and starts on system boot.
sudo npm install -g pm2
cd /opt/accessnode pm2 start server.js --name accessnode pm2 save
pm2 startup systemd
PM2 will output a command to run as sudo. Copy and paste that command to enable auto-start on system boot.
pm2 status # View running processes pm2 logs accessnode # View application logs pm2 restart accessnode # Restart the app pm2 stop accessnode # Stop the app pm2 delete accessnode # Remove from PM2 pm2 monit # Real-time monitoring dashboard
When new versions are released, update your deployment:
cd /opt/accessnode git pull origin main npm install # Install any new dependencies pm2 restart accessnode # Restart with the new code
cp /opt/accessnode/accessnode.db /opt/accessnode/accessnode.db.backup
Set up a daily cron job to back up your encrypted database to Google Cloud Storage or another location:
# Daily backup at 2 AM 0 2 * * * cp /opt/accessnode/accessnode.db /opt/backups/accessnode-$(date +\%Y\%m\%d).db
# Find what's using the port sudo lsof -i :3000 # Kill the process sudo kill -9 <PID> # Or use a different port in .env PORT=3001
pm2 statussudo systemctl status nginxsudo tail -f /var/log/nginx/error.logIf the SQLite database gets corrupted, restore from a backup:
pm2 stop accessnode cp accessnode.db.backup accessnode.db pm2 start accessnode
sudo certbot renew sudo systemctl reload nginx
pm2 logs accessnode --lines 50node --versionrm -rf node_modules && npm installdf -hReady to get started? Your vault is waiting.
Create Free Account