Deep Ruby on Rails expertise
Azati has extensive experience developing and maintaining Ruby on Rails applications, including complex multi-version upgrade paths and legacy codebase modernization.
A DevOps services company running mission-critical server infrastructure for external clients needed a reliable engineering partner to maintain, extend, and modernize their heavily customized Redmine platform. Azati took ownership of the full plugin ecosystem, executed a major version upgrade across the entire stack, and kept all business operations running without interruption.
major system components upgraded
custom plugins maintained and adapted
business continuity preserved
The client is a DevOps managed services provider running 24/7 server infrastructure support for external clients. To manage their operations internally, they built a heavily customized Redmine platform, spanning task management, time tracking, SLA reporting, and billing, that over time became too complex and business-critical to maintain without dedicated Ruby on Rails expertise.
The platform ran on legacy versions of Ruby, Rails, Redmine, Sidekiq, and Redis, with known security vulnerabilities and growing incompatibility risks across the whole ecosystem.
The codebase had almost no automated tests and sparse documentation for custom business logic, making a safe major upgrade appear nearly impossible without breaking things.
30+ custom and commercial plugins needed to keep working post-migration, each with unique integrations, interdependencies, and zero safety net from tests.
The company needed a seasoned Ruby on Rails partner able to step in, learn the system quickly, and take full ownership of its development and stability. Specifically:
Azati has extensive experience developing and maintaining Ruby on Rails applications, including complex multi-version upgrade paths and legacy codebase modernization.
The team had prior hands-on experience building and adapting Redmine plugins, understanding the framework's extension points, hook system, and engine-level constraints across versions.
Azati has a structured methodology for navigating upgrades with minimal or absent test coverage, audit-first, incremental change, manual verification tracking, which was directly applicable here.
Worried about upgrading without breaking business-critical workflows?
Let's plan your Rails migrationRather than proposing a rewrite, risky given the absence of tests and the deeply embedded business logic, Azati chose an audit-first, incremental approach: understand the system fully before touching it, then upgrade and adapt component by component.
Azati started by mapping the full plugin ecosystem, all 30+ plugins, their dependencies, compatibility status, and business logic. Since automated tests were nearly absent, the team built a manual verification tracking process to safely account for each component during migration.
All system components were migrated to new AlmaLinux 9 servers. Production and staging databases were separated onto dedicated servers for the first time, improving isolation and making future deployments safer.
The core application stack was upgraded across all major versions, Ruby 2.7 to 3.3.10, Rails 6.1 to 7.2.3, Redmine to 6.1.1, and Sidekiq from 5.2.9 to 7.3.9. Deprecated logic was identified and fixed throughout, and CI pipelines for the redmine_centosadmin plugins were repaired.
Every custom and third-party plugin was verified, adapted, and tested against the new environment. Integrations including Telegram (via TDLib), Jira, GitLab, Mattermost, Prometheus, Elasticsearch, and the client's own CRM were validated end-to-end.
Beyond the migration, Azati continued developing new plugins and extending existing ones, automation features, SLA reporting, and team efficiency tracking.
| Metric / area | Before engagement with Azati | After engagement with Azati |
|---|---|---|
| Redmine | Legacy | 6.1.1 |
| Ruby | 2.7 | 3.3.10 |
| Rails | 6.1 | 7.2.3 |
| Sidekiq | 5.2.9 | 7.3.9 |
| Redis | 5.0.7 | 8.4.0 |
| PostgreSQL | Legacy | 14 (prod/stage separated) |
| OS / servers | Legacy | AlmaLinux 9 |
The platform is secured with SSL/TLS encryption, SSH access controls, and OAuth 2.0 authentication, with role-based access enforced across all sensitive data, including encrypted credential storage and protected wiki documentation. Upgrading to fully supported versions of Ruby, Rails, and Redmine closed a backlog of known CVEs that had accumulated on the legacy stack.
The T&M model was the natural fit for this project, the scope of plugin maintenance, upgrades, and new feature development evolved continuously as the client's internal workflows grew. This allowed Azati to respond to shifting priorities without renegotiating contracts, keeping delivery predictable while staying flexible.
The nature of the engagement required an ongoing, flow-based approach rather than fixed sprints:
All major components, Ruby, Rails, Redmine, Sidekiq, Redis, PostgreSQL, upgraded without interrupting client workflows, SLA delivery, or internal operations.
Migration to actively maintained releases of Ruby, Rails, and Redmine eliminated a backlog of known CVEs inherited from the legacy stack.
Every custom, open-source, and commercial plugin was verified, adapted, and confirmed functional in the new environment.
Full migration to AlmaLinux 9 servers with separated prod/staging databases, improving deployment safety and environment isolation.
Sidekiq queue monitoring replaced with sidekiq-throttled, providing a live dashboard and eliminating a long-standing blind spot in job processing.
New and updated plugins cover task scheduling, checklists, SLA report generation, and CRM sync, directly supporting the client's DevOps workflows.
Targeted test coverage introduced on critical paths on Azati's initiative, reducing regression risk for future development.
The choice of incremental upgrade over a full rewrite ensured:
Upgrading to fully supported versions of Ruby, Rails, and Redmine closed a backlog of known CVEs. The platform is no longer running on components that receive no security patches, a meaningful risk reduction for a system handling sensitive infrastructure access and client data.
The incremental upgrade strategy preserved years of embedded business logic, SLA rules, billing automation, and CRM integrations, while bringing the platform fully up to date. The system can now evolve safely for years to come without a costly rewrite.
Separating production and staging databases, migrating to modern AlmaLinux 9 servers, and eliminating unsupported dependencies gives the team a well-isolated foundation, reducing the risk of environment-level incidents as the client's customer base grows.
The client gained long-term access to Redmine plugin expertise, Telegram API and TDLib integration skills, and a proven Rails upgrade methodology, capabilities that are rare to find and difficult to build in-house for a team focused entirely on infrastructure services.
Last updated