Redmine Project Management Installation
Redmine is a flexible, open-source project management and issue tracking platform written in Ruby on Rails. It provides comprehensive project tracking, resource planning, issue management, and team collaboration features used by organizations worldwide. This guide covers Ruby installation, MySQL database setup, Apache/Nginx configuration, plugin installation, and email notifications.
Table of Contents
- Prerequisites
- System Requirements
- Ruby Installation
- Rails and Dependencies
- Database Setup
- Redmine Installation
- Web Server Configuration
- SSL Configuration
- Email Setup
- Plugin Installation
- Backup and Updates
- Conclusion
Prerequisites
Ensure you have:
- Ubuntu 20.04 LTS or later
- Root or sudo access
- A registered domain name
- Minimum 2GB RAM (4GB+ recommended)
- 15GB available disk space
- Basic Linux administration knowledge
Update system:
sudo apt update && sudo apt upgrade -y
System Requirements
Verify system specifications:
Check OS version:
cat /etc/os-release
uname -m
Verify available resources:
free -h
df -h
Install required build tools:
sudo apt install -y build-essential libssl-dev libreadline-dev zlib1g-dev curl wget git
Ruby Installation
Install RVM (Ruby Version Manager):
curl -sSL https://get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
Install Ruby 3.0 or later:
rvm install 3.0.0
rvm use 3.0.0 --default
Verify installation:
ruby --version
gem --version
Install bundler:
gem install bundler
Rails and Dependencies
Install MySQL client:
sudo apt install -y mysql-server libmysqlclient-dev
Install ImageMagick for image processing:
sudo apt install -y imagemagick libmagickwand-dev
Install Curl development files:
sudo apt install -y libcurl4-openssl-dev
Install Git:
sudo apt install -y git
Database Setup
Start MySQL:
sudo systemctl start mysql
sudo systemctl enable mysql
Secure MySQL:
sudo mysql_secure_installation
Create Redmine database:
sudo mysql -u root -p << EOF
CREATE DATABASE redmine CHARACTER SET utf8mb4;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'SecurePassword123!';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
FLUSH PRIVILEGES;
EXIT;
EOF
Test connection:
mysql -u redmine -p -h localhost redmine
EXIT;
Redmine Installation
Create installation directory:
sudo mkdir -p /opt/redmine
sudo chown -R $USER:$USER /opt/redmine
cd /opt/redmine
Download Redmine:
wget https://www.redmine.org/releases/redmine-5.0.0.tar.gz
tar -xzf redmine-5.0.0.tar.gz
mv redmine-5.0.0/* .
rmdir redmine-5.0.0
Create database configuration:
cp config/database.yml.example config/database.yml
nano config/database.yml
Update for production:
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: "SecurePassword123!"
encoding: utf8mb4
Install dependencies:
cd /opt/redmine
bundle install --without development test
Generate secret token:
bundle exec rake generate_secret_token
Create database schema:
bundle exec rake db:migrate RAILS_ENV=production
Load default data:
bundle exec rake redmine:load_default_data RAILS_ENV=production
REDMINE_LANG=en
Set ownership:
sudo chown -R www-data:www-data /opt/redmine
Web Server Configuration
Apache Configuration
Install Apache and Passenger:
sudo apt install -y apache2 apache2-dev
gem install passenger
passenger-install-apache2-module
Enable Passenger module:
sudo nano /etc/apache2/mods-available/passenger.load
Add:
LoadModule passenger_module /usr/local/rvm/gems/ruby-3.0.0/gems/passenger-6.0.0/buildout/apache2/mod_passenger.so
Create virtual host:
sudo nano /etc/apache2/sites-available/redmine.conf
Add:
<VirtualHost *:80>
ServerName redmine.example.com
ServerAlias www.redmine.example.com
DocumentRoot /opt/redmine/public
<Directory /opt/redmine/public>
AllowOverride All
Require all granted
</Directory>
PassengerAppRoot /opt/redmine
PassengerRuby /usr/local/rvm/wrappers/ruby-3.0.0/ruby
ErrorLog ${APACHE_LOG_DIR}/redmine_error.log
CustomLog ${APACHE_LOG_DIR}/redmine_access.log combined
</VirtualHost>
Enable site and modules:
sudo a2enmod passenger
sudo a2ensite redmine.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
Nginx Configuration
Install Nginx:
sudo apt install -y nginx
Install Puma web server:
cd /opt/redmine
bundle add puma
Configure Puma:
nano config/puma.rb
Add:
bind "unix:///var/run/puma.sock"
daemonize true
pidfile "/var/run/puma.pid"
state_path "/var/run/puma.state"
Create systemd service:
sudo nano /etc/systemd/system/puma.service
Add:
[Unit]
Description=Puma HTTP Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/redmine
ExecStart=/usr/local/rvm/gems/ruby-3.0.0/bin/puma -c /opt/redmine/config/puma.rb
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Enable and start Puma:
sudo systemctl daemon-reload
sudo systemctl enable puma
sudo systemctl start puma
Create Nginx configuration:
sudo nano /etc/nginx/sites-available/redmine
Add:
upstream puma {
server unix:///var/run/puma.sock;
}
server {
listen 80;
server_name redmine.example.com www.redmine.example.com;
root /opt/redmine/public;
location / {
proxy_pass http://puma;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Enable site:
sudo ln -s /etc/nginx/sites-available/redmine /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl start nginx
sudo systemctl enable nginx
SSL Configuration
Install Certbot:
sudo apt install -y certbot python3-certbot-apache
Obtain SSL certificate:
sudo certbot certonly --apache -d redmine.example.com
Update Apache/Nginx configuration to use HTTPS. For Apache:
sudo nano /etc/apache2/sites-available/redmine.conf
Update to listen on port 443 with SSL directives.
For Nginx, update with:
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/redmine.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/redmine.example.com/privkey.pem;
Email Setup
Configure SMTP in Redmine:
cd /opt/redmine
nano config/configuration.yml
Add email configuration:
production:
email_delivery:
delivery_method: :smtp
smtp_settings:
address: smtp.gmail.com
port: 587
user_name: [email protected]
password: your-app-password
authentication: plain
enable_starttls_auto: true
openssl_verify_mode: none
Test email:
bundle exec rails console -e production
Mailer.deliver_test_email('[email protected]')
Plugin Installation
Download useful plugins:
cd /opt/redmine/plugins
git clone https://github.com/redmine/redmine_agile.git
git clone https://github.com/redmine/redmine_checklists.git
Install plugin dependencies:
cd /opt/redmine
bundle install
Migrate plugin database:
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
Restart Redmine:
For Apache with Passenger:
touch /opt/redmine/tmp/restart.txt
For Nginx with Puma:
sudo systemctl restart puma
Backup and Updates
Create backup script:
sudo nano /usr/local/bin/redmine-backup.sh
Add:
#!/bin/bash
BACKUP_DIR="/backups/redmine"
REDMINE_DIR="/opt/redmine"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# Database backup
mysqldump -u redmine -p'SecurePassword123!' redmine | gzip > "$BACKUP_DIR/redmine-db-$DATE.sql.gz"
# Files backup
tar -czf "$BACKUP_DIR/redmine-files-$DATE.tar.gz" "$REDMINE_DIR"
# Keep only 30 days
find $BACKUP_DIR -type f -mtime +30 -delete
echo "Backup completed: $DATE"
Make executable:
sudo chmod +x /usr/local/bin/redmine-backup.sh
Schedule backups:
sudo crontab -e
Add:
0 2 * * * /usr/local/bin/redmine-backup.sh >> /var/log/redmine-backup.log 2>&1
Update Redmine:
cd /opt/redmine
git fetch origin
git checkout 5.1.0
bundle install
bundle exec rake db:migrate RAILS_ENV=production
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
Conclusion
Redmine is now fully installed and configured as a comprehensive project management platform. With Ruby on Rails, MySQL database, email notifications, and plugin support, you have a powerful tool for team project tracking. Regular backups and updates ensure system reliability and access to new features. Configure projects, users, and permissions to establish an effective project management workflow.


