Installing Redmine on a VPS for Project Management and Task Tracking
TL;DR
In this detailed guide, we will step-by-step configure Redmine — a powerful, flexible, and open-source project management and task tracking system — on your own VPS server. You will learn how to prepare the server, install all necessary components (PostgreSQL, Ruby, Nginx, Puma), configure them to work together, ensure security with HTTPS, and organize regular backups. As a result, you will get a fully controlled platform for effective project management for your team.
- Complete installation of Redmine 5.x on Ubuntu 24.04 LTS using Nginx, Puma, and PostgreSQL.
- Configuring secure access via HTTPS with Certbot for free SSL/TLS certificates.
- Detailed instructions for server preparation, including SSH, firewall, and basic utility configuration.
- Recommendations for choosing the optimal VPS configuration and scaling.
- Scripts for automatic database and Redmine file backups.
- Troubleshooting common issues and frequently asked questions section.
What We Configure and Why
In this guide, we will focus on installing and configuring Redmine — an open-source and flexible project management system based on Ruby on Rails. Redmine provides a wide range of features for teams of any size: issue tracking, Gantt charts, calendar, document management, forums, wikis, time tracking, as well as integration with version control systems like Git and Subversion.
By choosing Redmine, you will get a powerful tool for organizing work that will help you:
- Centralize project management: All tasks, documents, discussions, and plans will be in one place, accessible to the entire team.
- Effectively track tasks: Create tasks, assign executors, set priorities and deadlines, track progress and statuses.
- Improve communication: Use built-in forums and wikis for knowledge sharing and project discussions.
- Gain full control over data: Unlike cloud solutions, your data is stored on your VPS, ensuring maximum privacy and security.
- Flexibility and customization: Redmine's open-source code allows you to adapt it to your team's unique needs, install plugins, and customize its appearance.
Alternatives: Cloud-Managed vs. Self-Hosted
There are many project management solutions on the market. They can be conditionally divided into two categories:
-
Cloud-Managed services: These are platforms like Jira, Asana, Trello, Monday.com. They offer a ready-to-use "out-of-the-box" solution that doesn't require technical knowledge for server setup. You simply register, pay a monthly subscription, and start working.
- Pros: Ease of getting started, minimal administration, provider support.
- Cons: Dependence on a third-party provider, lack of full control over data, limited customization options, potentially higher long-term costs, especially for large teams.
-
Self-Hosted solutions on a VPS: These include Redmine, GitLab, Mattermost, Nextcloud. You rent a VPS, install and configure the software yourself.
- Pros: Full control over data and security, high degree of customization, often lower long-term costs, especially if you already have server administration experience.
- Cons: Requires technical knowledge for installation and maintenance, responsibility for backups and updates lies with you.
Choosing Redmine on a VPS is ideal for those who value control, privacy, and want the ability to fine-tune the system to their needs, without overpaying for cloud services, especially as the team grows. This guide will help you master all the necessary steps for a successful deployment.
What VPS Configuration is Needed for This Task
Choosing the right VPS configuration is key to ensuring stable and fast Redmine performance. Requirements may vary depending on your team size, number of projects, intensity of use, and volume of stored files.
Minimum Requirements for a Small Team (up to 10 users)
- CPU: 2 cores. Although Redmine can run on 1 core, 2 cores will provide better responsiveness, especially when multiple users are working simultaneously or performing resource-intensive operations (e.g., report generation or indexing).
- RAM: 4 GB. Ruby on Rails (on which Redmine runs), the database (PostgreSQL), and the web server (Nginx + Puma) are quite memory-intensive. 4 GB is a comfortable minimum for stable operation.
- Disk: 80 GB SSD. SSD drives significantly speed up database operations and application loading. 80 GB will be sufficient for the operating system, Redmine, the database, and some attached files. If you plan to store many files or use Redmine to manage a large number of projects with images and documents, consider 100-120 GB.
- Network: 100 Mbps. This will be sufficient for most tasks. If you plan to actively use Redmine with many users working with large files, consider 1 Gbps.
Recommended VPS Plan for Medium Teams (10-30 users)
For more active use and medium-sized teams, consider the following characteristics:
- CPU: 4 cores
- RAM: 8 GB
- Disk: 160 GB SSD
- Network: 1 Gbps
Such a configuration will provide excellent performance and a margin of safety for growth. You can consider a VPS with the specified characteristics for rent.
When a Dedicated Server is Needed, Not a VPS
A Dedicated server becomes preferable to a VPS in the following cases:
- Very large teams (50+ users) or high system load.
- Critically important projects requiring maximum performance and minimal delays.
- Isolation requirements: If you do not want to share resources with other users on the same physical server.
- Specific security or compliance requirements: Some regulations may require physical isolation.
- Planning to run many other services on the same server besides Redmine.
For such scenarios, a suitable dedicated server will provide you with all the physical resources of the machine without virtualization.
VPS Location: What It Affects
Choosing the VPS server location is important for several reasons:
- Latency: The closer the server is to your team and end-users, the lower the latency and faster Redmine's response will be. Choose a data center geographically close to your team's primary work location.
- Data legislation: Some jurisdictions have strict data storage laws (e.g., GDPR in Europe). Choosing a server location that complies with these laws can be critically important.
- Availability and reliability: Large providers typically have data centers in different regions with high availability and reliable network channels.
Consider these factors when choosing a provider and a specific data center for your VPS.
Server Preparation
Before installing Redmine, you need to perform basic setup and preparation of your VPS. We will use Ubuntu Server 24.04 LTS, as it is a current and stable operating system for 2026.
1. Connecting to the Server and Updating the System
First, connect to your VPS via SSH using the credentials provided by your provider. This is usually the root user and password.
ssh root@ВАШ_IP_АДРЕС
After connecting, update the package list and install all available updates. This will ensure all components are up-to-date and known vulnerabilities are patched.
sudo apt update # Обновление списка пакетов
sudo apt upgrade -y # Установка всех доступных обновлений
2. Creating a New User with Sudo Privileges
Working as the root user is unsafe. Create a new user and grant them sudo privileges.
adduser redmineuser # Создание нового пользователя с именем redmineuser
usermod -aG sudo redmineuser # Добавление пользователя в группу sudo
Set a strong password for the new user when prompted by the system. After that, exit the root session and log in as the new user.
exit # Выход из сессии root
ssh redmineuser@ВАШ_IP_АДРЕС # Вход под новым пользователем
3. Configuring SSH Keys (Recommended)
To enhance security and convenience, it is recommended to use SSH keys instead of passwords. If you don't have a key pair yet, generate them on your local machine:
ssh-keygen -t rsa -b 4096 # Генерация новой пары SSH-ключей на локальной машине
Then copy the public key to your VPS:
ssh-copy-id redmineuser@ВАШ_IP_АДРЕС # Копирование публичного ключа на сервер
After this, you can disable password authentication for SSH (by editing /etc/ssh/sshd_config: PasswordAuthentication no and restarting sudo systemctl restart sshd), but only do so after ensuring that key-based login works.
4. Configuring the Firewall (UFW)
Install and configure UFW (Uncomplicated Firewall) to restrict server access to only necessary ports.
sudo apt install ufw -y # Установка UFW
sudo ufw allow OpenSSH # Разрешить SSH-подключения (порт 22)
sudo ufw allow http # Разрешить HTTP-трафик (порт 80)
sudo ufw allow https # Разрешить HTTPS-трафик (порт 443)
sudo ufw enable # Включение фаервола
sudo ufw status # Проверка статуса фаервола
Ensure SSH is allowed before enabling the firewall, otherwise you might lose access to the server.
5. Installing Fail2Ban
Fail2Ban helps protect against brute-force password attacks by blocking IP addresses from which too many failed login attempts originate.
sudo apt install fail2ban -y # Установка Fail2Ban
sudo systemctl enable fail2ban # Включение автозапуска Fail2Ban
sudo systemctl start fail2ban # Запуск Fail2Ban
Fail2Ban protects SSH by default. For more fine-grained configuration, you can copy the configuration file /etc/fail2ban/jail.conf to /etc/fail2ban/jail.local and make changes there.
6. Installing Basic Utilities
Install some useful utilities that may come in handy during installation and administration.
sudo apt install git curl wget htop build-essential -y # Установка Git, Curl, Wget, Htop и инструментов для сборки
Your server is now prepared for the installation of Redmine and its components.
Software Installation — Step-by-Step
In this section, we will install all the necessary software to run Redmine: the PostgreSQL database, Ruby runtime environment, Nginx web server, and Puma application server.
1. Installing PostgreSQL 16
Redmine works well with PostgreSQL. Let's install the latest version.
sudo apt install postgresql postgresql-contrib -y # Install PostgreSQL and additional utilities
Let's create a database user and the database itself for Redmine. Replace redmine_user and your_strong_password with your own values.
sudo -u postgres psql -c "CREATE USER redmine_user WITH PASSWORD 'your_strong_password';" # Create DB user
sudo -u postgres psql -c "CREATE DATABASE redmine_db OWNER redmine_user ENCODING 'UTF8';" # Create database
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE redmine_db TO redmine_user;" # Grant user privileges
2. Installing RVM for Ruby Management (alternative: rbenv)
We will use RVM (Ruby Version Manager) to install and manage Ruby versions. This will allow us to easily install the required Ruby version and avoid conflicts with the system version.
sudo apt install software-properties-common gnupg2 -y # Install dependencies for adding repositories
gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB # Import RVM GPG keys
curl -sSL https://get.rvm.io | bash -s stable --ruby # Install RVM and the latest stable Ruby version
After installing RVM, you need to load it into the current session. You might need to log out and log back into SSH or execute:
source /home/redmineuser/.rvm/scripts/rvm # Load RVM into the current session
rvm install ruby-3.4.0 # Install Ruby 3.4.0 (current for 2026)
rvm use ruby-3.4.0 --default # Set Ruby 3.4.0 as the default version
ruby -v # Check installed Ruby version
Install Bundler — Ruby's dependency manager.
gem install bundler -v 2.5.1 # Install Bundler version 2.5.1
3. Downloading Redmine
Create a directory for Redmine and download the latest stable version (e.g., 5.1.x or 5.2.x, current for 2026) from the official website or GitHub. We will use /var/www/redmine.
sudo mkdir -p /var/www/redmine # Create directory for Redmine
sudo chown -R redmineuser:redmineuser /var/www/redmine # Change directory owner
cd /var/www/redmine # Navigate to Redmine directory
wget https://www.redmine.org/releases/redmine-5.1.2.tar.gz # Download Redmine 5.1.2 (example)
tar -xvzf redmine-5.1.2.tar.gz # Unpack archive
mv redmine-5.1.2/ . # Move contents to current directory
rmdir redmine-5.1.2 # Remove empty directory
rm redmine-5.1.2.tar.gz # Remove archive
4. Installing Redmine Dependencies
Navigate to the Redmine directory and install all necessary gems (Ruby libraries) using Bundler.
cd /var/www/redmine # Navigate to Redmine directory
bundle install --without development test # Install dependencies, excluding dev and test
You might need to install additional system libraries for some gems:
sudo apt install libpq-dev libmagickwand-dev imagemagick -y # Install dependencies for PostgreSQL and ImageMagick
After installing these dependencies, if bundle install finished with errors, try running it again.
5. Configuring the Redmine Database
Copy the example database configuration file and edit it, specifying your PostgreSQL database details.
cp config/database.yml.example config/database.yml # Copy configuration file
nano config/database.yml # Open file for editing
In the config/database.yml file, find the production: section and modify it as follows (replace the data with your own):
production:
adapter: postgresql
database: redmine_db
host: localhost
username: redmine_user
password: "your_strong_password"
encoding: utf8
pool: 5
Save and close the file (Ctrl+X, Y, Enter).
6. Generating a Secret Token
Redmine requires a secret token to protect sessions and other cryptographic operations.
bundle exec rake generate_secret_token # Generate secret token
7. Database Migration and Loading Default Data
Execute database migrations to create all necessary Redmine tables.
bundle exec rake db:migrate RAILS_ENV=production # Execute database migrations
Load default data (languages, roles, task statuses). Select the default language (e.g., ru for Russian).
bundle exec rake redmine:load_default_data RAILS_ENV=production # Load default data
When the system prompts for a language, enter ru and press Enter.
8. Setting Permissions
Ensure that Redmine has the necessary write permissions for the files, log, and tmp directories.
sudo chown -R redmineuser:redmineuser files log tmp public/plugin_assets # Set owner
chmod -R 755 files log tmp public/plugin_assets # Set access rights
9. Test Run of Puma
To verify Redmine's functionality, run it in development mode using Puma.
bundle exec puma -e production -b tcp://127.0.0.1:3000 # Start Puma on port 3000
If everything is configured correctly, you will see messages about Puma starting. You can check Redmine's availability from the server using curl http://127.0.0.1:3000. You should see the page's HTML code. Press Ctrl+C to stop Puma. In the next section, we will configure it as a system service.