# HealthPlix Reverse Proxy Setup (CentOS 7 + Apache) This guide is for a central public Apache server that forwards each hospital domain to its own local HMS over VPN. Example topology: - Public Apache server: 139.59.13.39 - Hospital A domain: 100001.dhms.in -> A record -> 139.59.13.39 - Hospital A HMS private VPN IP: 10.7.0.32 - Hospital B domain: 100002.dhms.in -> A record -> 139.59.13.39 - Hospital B HMS private VPN IP: 10.8.0.45 Recommended exposure model: - Expose only callback/fetch path to internet. - Do not expose full HMS unless required. ## 1) Install and enable required Apache modules Run on CentOS 7 Apache host: sudo yum install -y mod_ssl sudo httpd -M | egrep "proxy|ssl|headers|rewrite" If any are missing, enable in Apache config and restart httpd. ## 2) Reusable virtual-host template (callback-only) Create one file per hospital in /etc/httpd/conf.d/ Template file name: - /etc/httpd/conf.d/DOMAIN.conf Template content: ServerName DOMAIN RewriteEngine On RewriteRule ^/(.*)$ https://DOMAIN/$1 [R=301,L] ServerName DOMAIN SSLEngine On SSLCertificateFile /etc/letsencrypt/live/DOMAIN/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/DOMAIN/privkey.pem ProxyRequests Off ProxyPreserveHost On SSLProxyEngine On RequestHeader set X-Forwarded-Proto "https" RequestHeader append X-Forwarded-For %{REMOTE_ADDR}s ProxyTimeout 60 Timeout 60 # Callback/fetch endpoint only ProxyPass /healthplix/fetch http://VPN_HMS_IP/healthplix/fetch ProxyPassReverse /healthplix/fetch http://VPN_HMS_IP/healthplix/fetch ErrorLog /var/log/httpd/DOMAIN-healthplix-error.log CustomLog /var/log/httpd/DOMAIN-healthplix-access.log combined Replace: - DOMAIN with hospital DNS name (example 100001.dhms.in) - VPN_HMS_IP with local HMS VPN IP (example 10.7.0.32) ## 3) Hardened variant (recommended) Use this inside the :443 VirtualHost when HealthPlix source IPs and secret are available. # 3.1 Limit endpoint to known HealthPlix source IPs Require all denied Require ip 203.0.113.10 Require ip 203.0.113.11 # 3.2 Shared-secret header validation at edge RewriteEngine On RewriteCond %{REQUEST_URI} ^/healthplix/fetch$ RewriteCond %{HTTP:X-Healthplix-Secret} !^REPLACE_WITH_STRONG_SECRET$ RewriteRule ^ - [F,L] # 3.3 Restrict methods Require all denied # 3.4 Body size limits (adjust to payload) LimitRequestBody 1048576 Notes: - Replace placeholder IPs with official HealthPlix outbound IPs. - Replace secret with a long random value. - Validate same secret again in HMS controller before processing. ## 4) Multi-hospital mapping examples Hospital A: - Domain: 100001.dhms.in - Target: 10.7.0.32 Hospital B: - Domain: 100002.dhms.in - Target: 10.8.0.45 Hospital C: - Domain: 100003.dhms.in - Target: 10.9.0.20 All domains can point to same public IP 139.59.13.39. Apache routes by ServerName. ## 5) Enable and reload Apache sudo apachectl configtest sudo systemctl reload httpd If using firewalld: sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --add-service=https --permanent sudo firewall-cmd --reload ## 6) HMS application-side settings For outbound sync from HMS to HealthPlix: - Keep HEALTHPLIX_BASE_URL as official HealthPlix API base URL. - Keep token/patient/appointment paths as currently configured. For inbound fetch/callback from HealthPlix: - Give HealthPlix callback URL as: https://DOMAIN/healthplix/fetch ## 7) Validation checklist 1. DNS resolves correctly: nslookup DOMAIN 2. TLS certificate is valid: curl -Iv https://DOMAIN/healthplix/fetch 3. Reverse proxy reaches HMS private node: curl -i -X POST https://DOMAIN/healthplix/fetch -H "X-Healthplix-Secret: REPLACE_WITH_STRONG_SECRET" -d '{}' 4. Apache logs show routed request in domain-specific log file. 5. HMS receives request and returns expected response. ## 8) Operations notes - Keep one vhost file per hospital for isolation. - Keep one log file pair per hospital for easier troubleshooting. - Rotate logs and monitor 4xx/5xx rates. - Keep VPN routes and ACLs documented and version-controlled. - Do not log bearer tokens or patient-sensitive payloads in plaintext.