Local Development
Guide to setting up a local development environment for PATH DRC EMR.
Overview
This guide covers setting up a development environment for:
- Testing configuration changes
- Developing custom modules
- Contributing to the distribution
Prerequisites
Required Software
- Git: Version control
- Docker: Version 20.10+
- Docker Compose: Version 2.0+
- Java: JDK 17 (for backend development)
- Maven: 3.8+ (for building)
- Node.js: 18+ (for frontend development)
GitHub Access
You need a GitHub Personal Access Token with read:packages scope for:
- Pulling Docker images
- Downloading Maven dependencies from GitHub Packages
Getting Started
Clone the Repository
git clone https://github.com/path-drc/path-drc-emr.git
cd path-drc-emr
Configure Maven Settings
Create or update ~/.m2/settings.xml:
<settings>
<servers>
<server>
<id>path-drc</id>
<username>YOUR_GITHUB_USERNAME</username>
<password>YOUR_GITHUB_TOKEN</password>
</server>
</servers>
</settings>
Environment Setup
# Copy environment template
cp .env.example .env
# Edit as needed
nano .env
Running Locally
Option 1: Pull Pre-Built Images
Fastest way to get started:
# Login to GitHub Container Registry
docker login ghcr.io
# Pull images
docker compose pull
# Start services
docker compose up -d
Option 2: Build Locally
For testing local changes:
# Build all images
docker compose build
# Start services
docker compose up -d
Option 3: Build Specific Site
# Build site-specific distribution
docker compose build \
--build-arg BUILD_TYPE=site \
--build-arg MVN_PROJECT=akram
# Start
docker compose up -d
Development Workflows
Backend Development
For changes to the distribution configuration:
# Make changes to distro/ or sites/
# Rebuild backend
docker compose build backend
# Restart
docker compose up -d backend
# Watch logs
docker compose logs -f backend
Frontend Development
For frontend configuration changes:
# Edit frontend/config/config.json
# Rebuild frontend
docker compose build frontend
# Restart
docker compose up -d frontend
Configuration Changes
For Initializer configuration changes:
# Edit files in distro/configuration/
# Rebuild and restart
docker compose build backend
docker compose restart backend
# Or trigger Initializer reload
curl -X POST http://localhost/openmrs/ws/rest/v1/initializer/reload \
-u admin:Admin123
Project Structure
path-drc-emr/
├── distro/ # Base distribution
│ ├── pom.xml
│ ├── distro.properties # Module versions
│ └── configuration/ # Initializer configs
├── sites/ # Site-specific builds
│ ├── akram/
│ └── libikisi/
├── frontend/ # Frontend assets
│ ├── Dockerfile
│ ├── config/
│ └── assets/
├── gateway/ # nginx configuration
│ ├── Dockerfile
│ └── default.conf.template
├── docker-compose.yml # Service definitions
├── Dockerfile # Backend image
└── pom.xml # Parent POM
Useful Commands
Service Management
# Start all services
docker compose up -d
# Stop all services
docker compose down
# Restart specific service
docker compose restart backend
# View logs
docker compose logs -f backend
# Shell access
docker compose exec backend bash
docker compose exec db mysql -u openmrs -popenmrs openmrs
Building
# Build all images
docker compose build
# Build without cache
docker compose build --no-cache
# Build specific service
docker compose build backend
# Maven build (outside Docker)
mvn -P distro clean package
Cleanup
# Remove containers
docker compose down
# Remove containers and volumes (WARNING: deletes data)
docker compose down -v
# Remove all project images
docker compose down --rmi all
# Clean Docker system
docker system prune
Debugging
View Logs
# All services
docker compose logs -f
# Specific service
docker compose logs -f backend
# Last 100 lines
docker compose logs --tail 100 backend
# With timestamps
docker compose logs -t backend
Database Access
# MySQL shell
docker compose exec db mysql -u openmrs -popenmrs openmrs
# Run query
docker compose exec db mysql -u openmrs -popenmrs openmrs \
-e "SELECT * FROM users LIMIT 5;"
Container Shell
# Backend container
docker compose exec backend bash
# Check files
docker compose exec backend ls -la /openmrs/distribution/
Health Checks
# Check service status
docker compose ps
# Check backend health
curl http://localhost/openmrs/health/started
# Check session
curl http://localhost/openmrs/ws/rest/v1/session
Testing
Validate Configuration
# Run configuration validator
mvn -P distro,validator clean verify
Build Test
# Test pull request build
mvn -P distro clean package
Integration Testing
# Start fresh environment
docker compose down -v
docker compose up -d
# Wait for startup
while [[ "$(curl -s -o /dev/null -w '%{http_code}' http://localhost/openmrs/login.htm)" != "200" ]]; do
sleep 10
done
# Run tests...
Common Issues
Build Fails
Maven dependency issues:
# Check Maven settings
cat ~/.m2/settings.xml
# Clear cache and retry
rm -rf ~/.m2/repository/org/path
mvn -P distro clean package
Container Won’t Start
Check logs:
docker compose logs backend
Check resources:
docker stats --no-stream
df -h
Slow Startup
First startup takes time for database initialization. Watch logs:
docker compose logs -f backend | grep -i "started\|error"
IDE Setup
IntelliJ IDEA
- Open project as Maven project
- Configure JDK 17
- Import Maven settings from
~/.m2/settings.xml
VS Code
Recommended extensions:
- Docker
- Java Extension Pack
- XML Tools
- YAML
Related
- Building Images - Image build details
- CI/CD - Automated builds
- Contributing - Contribution guidelines