Redmine Server Planning Guide

Stable Redmine performance depends more on server planning than on installation speed. Use this guide to choose capacity, security controls, and operational defaults before go-live.

2. Network and Access Model

  • Open inbound port 80 for HTTP validation and 443 for HTTPS traffic.
  • Restrict SSH access by IP ranges where possible.
  • Enforce key-based SSH authentication and disable password login.
  • Use DNS records with short TTL during migration windows.
If your DNS or firewall is unstable, SSL automation can fail even when the application stack is correct.

3. Security Baseline for Production

  • Enable automatic security updates for the OS package manager.
  • Run Redmine behind HTTPS only after initial validation.
  • Use least-privilege database credentials for application access.
  • Store secrets outside ad-hoc shell history and shared channels.
  • Review plugin sources and versions before deployment.

4. Backup and Recovery Policy

Define backup scope before launch, not after first incident:

  • Database snapshots at least daily, with retention policy.
  • File backups for attachments, themes, and custom plugins.
  • At least one offsite backup copy.
  • Monthly restore drills to verify backup integrity.

A backup that has never been restored is only a hypothesis.

5. Monitoring and Operations

  • Track CPU, memory, disk I/O, and free disk thresholds.
  • Monitor HTTP status rates and response times.
  • Watch database growth and slow query trends.
  • Rotate logs and keep enough history for incident analysis.

7. Swap Configuration for Low-Memory Servers

Ruby on Rails and Phusion Passenger require substantial memory during startup and request spikes. On servers with 2 GB RAM or less, a swap file prevents out-of-memory process kills during Redmine boots or background jobs.

Create a 2 GB swap file

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

To persist swap across reboots, add this line to /etc/fstab:

/swapfile none swap sw 0 0

Tune swappiness

Lower swappiness tells the kernel to prefer RAM over swap — suitable for a dedicated Redmine server:

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Without swap, a 2 GB server can run out of memory during plugin installation, large report generation, or after an unclean restart — killing the Redmine process with no obvious error in the application log.