Manual Installation Guide
This guide provides step-by-step instructions for manually deploying GeoPulse on bare metal servers or VMs without Docker/Kubernetes.
Prerequisites
- Root access (
sudo) - Linux system (Ubuntu, Debian, RHEL, Rocky Linux, AlmaLinux, or Fedora)
- Internet connection
- Basic command-line knowledge
If you're running in a minimal container (LXC, Docker, etc.) or already operating as root:
-
Skip
sudo: If you're root, run commands withoutsudoprefix# Instead of: sudo apt-get install ...
# Use: apt-get install ... -
PostgreSQL commands: Replace
sudo -u postgreswith one of these:# Option 1: Switch user (then run psql commands)
su - postgres
# Option 2: Use runuser (from root, single command)
runuser -u postgres -- psql -d geopulse -c "SELECT 1;" -
Install sudo (optional): For consistency with these instructions:
apt-get install -y sudo # Debian/Ubuntu
dnf install -y sudo # RHEL/Rocky/Fedora
Table of Contents
Installation Steps:
- Choose Your Backend Type
- Determine Your CPU Architecture
- Install System Dependencies
- Create System User
- Create Directory Structure
- Configure PostgreSQL
- Generate Security Keys
- Download GeoPulse Artifacts
- Install Backend
- Install Frontend
- Create Configuration File
- Create Systemd Service
- Configure Nginx Web Server
- Start and Verify Services
Post-Installation:
- Create First Admin User
- Configuration Management
- Monitoring and Logs
- Upgrading GeoPulse
- Troubleshooting
1. Choose Your Backend Type
GeoPulse offers two backend options:
Native Backend (Recommended)
- ✅ No Java required
- ✅ Lower memory usage (50-100 MB)
- ✅ Faster startup (milliseconds)
- ✅ Better performance
- ❌ Architecture-specific binary
Production deployments, resource-constrained environments, Raspberry Pi
JVM Backend
- ✅ Platform-independent (works on any Java 25+ system)
- ✅ Easier debugging
- ❌ Requires Java 25+ runtime
- ❌ Higher memory usage (512-1024 MB)
- ❌ Slower startup
Development, testing, cross-platform compatibility
2. Determine Your CPU Architecture
Before downloading, identify your CPU architecture and capabilities to select the correct binary.
Check Architecture
uname -m
Output meanings:
x86_64→ AMD64 (Intel/AMD processors)aarch64orarm64→ ARM64 (ARM processors, Raspberry Pi, AWS Graviton)
Check CPU Features (AMD64 only)
For AMD64 systems, check if your CPU supports modern instruction sets:
# Check for x86-64-v3 support (AVX2, BMI2, FMA)
grep -q avx2 /proc/cpuinfo && grep -q bmi2 /proc/cpuinfo && grep -q fma /proc/cpuinfo && echo "Modern CPU (x86-64-v3)" || echo "Older CPU (x86-64-v2)"
Result interpretation:
- "Modern CPU (x86-64-v3)": Use
geopulse-backend-native-amd64-{version}CPUs from ~2013+: Intel Haswell, AMD Zen or newer - "Older CPU (x86-64-v2)": Use
geopulse-backend-native-amd64-compat-{version}Older Intel/AMD CPUs, VPS with older hypervisors
Check CPU Model (ARM64 only)
For ARM64 systems, check if it's a Raspberry Pi:
cat /proc/cpuinfo | grep -i "raspberry\|bcm" && echo "Raspberry Pi - use compat build" || echo "Modern ARM64 - use optimized build"
Result interpretation:
- "Raspberry Pi - use compat build": Use
geopulse-backend-native-arm64-compat-{version}Raspberry Pi 3, 4, or similar - "Modern ARM64 - use optimized build": Use
geopulse-backend-native-arm64-{version}AWS Graviton, Ampere Altra, Apple Silicon (if running Linux)
Summary Table
| Architecture | CPU Type | Binary to Download |
|---|---|---|
| AMD64 | Modern (2013+) | geopulse-backend-native-amd64-{version} |
| AMD64 | Older (pre-2013) | geopulse-backend-native-amd64-compat-{version} |
| ARM64 | Modern | geopulse-backend-native-arm64-{version} |
| ARM64 | Raspberry Pi 3/4 | geopulse-backend-native-arm64-compat-{version} |
| Any | JVM Backend | geopulse-backend-jvm-{version}.tar.gz |
3. Install System Dependencies
Ubuntu / Debian
# Update package list
sudo apt-get update
# Install core dependencies (including timezone data and lsb-release for repository setup)
sudo apt-get install -y curl wget tar openssl ca-certificates tzdata lsb-release
# Configure timezone (required for PostgreSQL)
sudo ln -sf /usr/share/zoneinfo/UTC /etc/localtime
sudo dpkg-reconfigure -f noninteractive tzdata
# Install PostgreSQL 18 + PostGIS
sudo apt-get install -y postgresql-18 postgresql-18-postgis-3
# Install Nginx
sudo apt-get install -y nginx
# If using JVM backend, install Java 25
# sudo apt-get install -y openjdk-25-jre-headless
If PostgreSQL 18 is not available in your distribution's repositories, you can use PostgreSQL's official APT repository. GeoPulse also supports PostgreSQL 17; existing installations can move to 18 later as described in Upgrading to PostgreSQL 18:
# Ensure lsb-release is installed (needed for release detection)
sudo apt-get install -y lsb-release
# Add PostgreSQL APT repository key (modern method)
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
sudo gpg --dearmor -o /usr/share/keyrings/postgresql-keyring.gpg
# Add PostgreSQL repository with signed-by keyring
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-keyring.gpg] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# Update package lists
sudo apt-get update
# Install PostgreSQL 18
sudo apt-get install -y postgresql-18 postgresql-18-postgis-3
RHEL / Rocky Linux / AlmaLinux
# Install core dependencies (including timezone data)
sudo dnf install -y curl wget tar openssl ca-certificates tzdata
# Configure timezone (required for PostgreSQL)
sudo ln -sf /usr/share/zoneinfo/UTC /etc/localtime
# Install PostgreSQL 18 + PostGIS
sudo dnf install -y postgresql18-server postgresql18-contrib postgis36_18
# Install Nginx (optional)
sudo dnf install -y nginx
# If using JVM backend, install Java 25
# sudo dnf install -y java-25-openjdk-headless
Fedora
# Install core dependencies (including timezone data)
sudo dnf install -y curl wget tar openssl ca-certificates tzdata
# Configure timezone (required for PostgreSQL)
sudo ln -sf /usr/share/zoneinfo/UTC /etc/localtime
# Install PostgreSQL + PostGIS (17 or newer)
sudo dnf install -y postgresql-server postgresql-contrib postgis
# Install Nginx (optional)
sudo dnf install -y nginx
# If using JVM backend, install Java 25
# sudo dnf install -y java-25-openjdk-headless
4. Create System User
This user will own all GeoPulse files and run the backend service. It cannot log in interactively, making it secure.
sudo useradd -r -s /bin/false -d /opt/geopulse -c "GeoPulse Service" geopulse
5. Create Directory Structure
# Application directory (backend, keys)
sudo mkdir -p /opt/geopulse/backend
sudo mkdir -p /opt/geopulse/keys
# Configuration directory
sudo mkdir -p /etc/geopulse
# Frontend directory (for Nginx deployment)
sudo mkdir -p /var/www/geopulse
# Data directory (dumps, backups)
sudo mkdir -p /var/lib/geopulse/dumps
# Logs directory
sudo mkdir -p /var/log/geopulse/backend
sudo mkdir -p /var/log/geopulse/nginx
# Set ownership and permissions
sudo chown -R geopulse:geopulse /opt/geopulse
sudo chown -R geopulse:geopulse /var/lib/geopulse
sudo chown -R geopulse:geopulse /var/log/geopulse
# Secure the keys directory
sudo chmod 750 /opt/geopulse/keys
/opt/geopulse- Application installation/etc/geopulse- Configuration files/var/www/geopulse- Frontend static files (Nginx)/var/lib/geopulse- Runtime data, backups/var/log/geopulse- Application logs
6. Configure PostgreSQL
Initialize and Start PostgreSQL
Ubuntu/Debian:
sudo systemctl start postgresql
sudo systemctl enable postgresql
RHEL/Rocky/AlmaLinux:
# Initialize database cluster (first time only)
sudo /usr/pgsql-18/bin/postgresql-18-setup initdb
# Start and enable
sudo systemctl start postgresql-18
sudo systemctl enable postgresql-18
Create Database and User
sudo -u postgres psql << 'EOF'
-- Create user
CREATE USER geopulse WITH PASSWORD 'your_secure_password_here';
-- Create database
CREATE DATABASE geopulse OWNER geopulse;
-- Connect to geopulse database
\c geopulse
-- Enable PostGIS extensions (must be done as superuser)
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
-- Grant privileges
GRANT ALL PRIVILEGES ON DATABASE geopulse TO geopulse;
GRANT ALL ON SCHEMA public TO geopulse;
GRANT ALL ON ALL TABLES IN SCHEMA public TO geopulse;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO geopulse;
EOF
Replace 'your_secure_password_here' with a strong, random password. Save this password - you'll need it in step 11.
Verify PostGIS Installation
sudo -u postgres psql -d geopulse -c "SELECT PostGIS_Version();"
You should see PostGIS version information.
7. Generate Security Keys
GeoPulse requires one cryptographic key: the encryption key that protects stored secrets (OIDC client secrets, GPS source and integration credentials, AI provider API keys, backups). Sign-in sessions are stored in the database and need no keys.
# Generate the encryption key (256-bit)
sudo bash -c 'openssl rand -base64 32 > /opt/geopulse/keys/ai-encryption-key.txt'
# Set secure permissions
sudo chmod 640 /opt/geopulse/keys/ai-encryption-key.txt
sudo chown geopulse:geopulse /opt/geopulse/keys/ai-encryption-key.txt
# Verify files were created
sudo ls -lh /opt/geopulse/keys/
These keys are critical. Never commit them to version control or share them. The private key should only be readable by the geopulse user.
8. Download GeoPulse Artifacts
Set your desired version (check GitHub Releases for the latest version):
VERSION=1.39.0
Create a temporary download directory:
mkdir -p /tmp/geopulse-install
cd /tmp/geopulse-install
Download Frontend (Required)
The frontend is architecture-independent:
wget https://github.com/tess1o/geopulse/releases/download/v${VERSION}/geopulse-frontend-${VERSION}.tar.gz
Download Backend (Choose ONE Option)
Based on your CPU architecture determined in Step 2:
Option A: Native AMD64 (Modern CPUs - Intel Haswell 2013+, AMD Zen 2017+)
wget https://github.com/tess1o/geopulse/releases/download/v${VERSION}/geopulse-backend-native-amd64-${VERSION}
Option B: Native AMD64 Compatible (Older CPUs, x86-64-v2)
wget https://github.com/tess1o/geopulse/releases/download/v${VERSION}/geopulse-backend-native-amd64-compat-${VERSION}
Option C: Native ARM64 (Modern ARM64)
wget https://github.com/tess1o/geopulse/releases/download/v${VERSION}/geopulse-backend-native-arm64-${VERSION}
Option D: Native ARM64 Compatible (Raspberry Pi 3/4)
wget https://github.com/tess1o/geopulse/releases/download/v${VERSION}/geopulse-backend-native-arm64-compat-${VERSION}
Option E: JVM Backend (Any platform with Java 25+)
wget https://github.com/tess1o/geopulse/releases/download/v${VERSION}/geopulse-backend-jvm-${VERSION}.tar.gz
Download and Verify Checksums
Always verify checksums to ensure downloaded files haven't been tampered with.
# Download checksums
wget https://github.com/tess1o/geopulse/releases/download/v${VERSION}/SHA256SUMS
# Verify checksums
sha256sum -c SHA256SUMS --ignore-missing
You should see:
geopulse-frontend-1.39.0.tar.gz: OK
geopulse-backend-native-amd64-1.39.0: OK
If verification fails, do not proceed. Re-download the files.