Builds on push to main and version tags, pushes to git.necloud.us container registry. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bible Study App
A self-hosted Bible study tool with notes, projects, and user accounts.
Requirements
- Node.js v18 or higher — nodejs.org
- npm (bundled with Node.js)
- GCC / make (only needed for production/server installs — required to build the
better-sqlite3native module)
Quick Start (Development)
git clone https://github.com/nmemmert/study-bible-project.git
cd study-bible-project
bash setup.sh
setup.sh installs dependencies, finds a free port, and starts both servers:
| Server | Default URL |
|---|---|
| API (Express) | http://localhost:3001 |
| Frontend (Vite) | http://localhost:5173 |
Stop the servers:
kill $(cat .api.pid) $(cat .vite.pid)
View logs:
tail -f .api.log # API server
tail -f .vite.log # Vite dev server
Production Install (Ubuntu / systemd)
Installs the app as a persistent systemd service under /opt/study-app.
# Install Node.js 20 (if not already installed)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
# Install build tools (required for better-sqlite3)
sudo apt-get install -y build-essential python3
# Clone and install
git clone https://github.com/nmemmert/study-bible-project.git
cd study-bible-project
sudo bash deploy/install.sh
The installer will:
- Install Node.js dependencies and build the frontend
- Create a
study-appsystem user - Register and start a systemd service
Useful commands after install:
systemctl status study-app # Check service status
journalctl -u study-app -f # Stream logs
systemctl restart study-app # Restart after an update
Open the firewall port (if needed):
sudo ufw allow 3001/tcp
sudo ufw reload
The app listens on port 3001 by default. Set the PORT environment variable in the systemd unit to change it.
Updating (Production)
cd /path/to/study-bible-project
git pull
sudo bash deploy/install.sh
The installer preserves the session secret across updates so logged-in users are not signed out.
Migrating to a New Machine
On the old machine — create a backup:
npm run backup
This creates study-app-backup_<timestamp>.zip in the project root.
On the new machine — restore after cloning and installing:
Development:
npm run restore study-app-backup_<timestamp>.zip
Production (after sudo bash deploy/install.sh completes):
sudo bash scripts/restore-data.sh study-app-backup_<timestamp>.zip --production
See scripts/backup-data.sh and scripts/restore-data.sh for details.
Project Structure
├── server/ # Express API + SQLite database
│ └── data/ # projects.db lives here (gitignored)
├── src/ # React frontend (Vite)
├── deploy/ # systemd service unit + install script
├── scripts/ # backup / restore helpers
└── setup.sh # Development quick-start
License
Private / personal use.