Solidus on VPS: Flexible Ruby on Rails E-commerce Platform — Stable Spree Alternative

16.03.2026
20:19

Solidus is not just a Spree fork. It's a conscious decision by Ruby on Rails community to create stable, production-ready e-commerce platform with clean code and predictable upgrades. Fork happened in 2015 based on Spree 2.4, and since then Solidus powers brands like Bonobos, MeUndies, Away, Casper and Ace & Tate.

This guide shows who Solidus is right for, how it differs from Spree, how to install it on THE.Hosting VPS in any of 50+ locations — from Netherlands (Meppel) to Japan (Tokyo), from Germany (Frankfurt) to USA (New Jersey). No marketing — only practice, real experience and honest recommendations from Ruby developers.

What is Solidus

Solidus is an open-source e-commerce platform built on Ruby on Rails as a Rails Engine. It's a Spree 2.4 fork created in 2015 by Stembolt team (working on Bonobos store) when original Spree changed development direction and its support became unstable.

History and evolution:

Spree Commerce appeared in 2007 and quickly became popular Rails e-commerce solution with million+ downloads. However by 2015 many developers were dissatisfied with project direction — code became "opinionated" and hard to customize. When company behind Spree was acquired, significant part of community migrated to Solidus.

Solidus started as Spree 2.4 fork with focus on three key goals: stable production-ready code without experimental features, simple and predictable upgrades between versions, better API compatibility for integrations. In 2018 Stembolt was also acquired (JUUL Labs), but community led by Nebulab (Italian company from Chieti) reorganized under decentralized governance model.

Current platform state:

4,781+ GitHub stars, active development (last commit 2 days ago at time of writing). Main contribution from Nebulab and dozens of companies using platform in production. Funding through Open Collective from retailers, agencies and developers. Used by brands: Bonobos (men's clothing), MeUndies (underwear), Away (luggage), Casper (mattresses), Ace & Tate (eyewear), Floyd (furniture), Maisonette (kids goods).

Platform architecture:

Solidus is a set of gems working together. solidus_core — platform core with business logic, data models, controllers. solidus_backend — admin interface for store management. solidus_api — REST API for integrations and mobile apps. solidus_frontend — starter storefront template (optional, can replace with your own).

When installing solidus gem, Bundler pulls all these components. But can use only solidus_core + solidus_api and write own frontend in React/Vue or any other tech — this is one of headless commerce scenarios.

Key capabilities out of box:

Catalog management with product variants, options, category taxonomy. Multi-store — multiple shops with single admin and shared database. Promotions — discounts, coupons, application rules with high flexibility. Store credits — store credits for returns and compensations. Inventory management — stock accounting by warehouses with reservation. Returns and adjustments — returns with reasons and order corrections.

Payments through integrations with dozens of processors (official gems for Stripe, PayPal, Braintree). Shipping through calculators by weight, zones, fixed rates or API integrations (FedEx, UPS). Tax calculation — taxes by zones, product categories or through API (Avalara). Pluggable architecture — each platform component replaceable with own implementation through configuration.

Solidus vs Spree: Key Differences

Question "Solidus or Spree?" arises for every Ruby developer choosing e-commerce platform. Both built on Rails, share history (Solidus forked from Spree 2.4) and even partially compatible.

Stability and support:

Solidus focuses on production-ready code. Nothing gets into master without two approvals from core contributors confident code works in production. Spree historically added experimental features leading to breaking changes and complex upgrades.

Solidus support is decentralized — community of companies actually using platform. Nebulab coordinates development but doesn't control project alone. Spree after several ownership changes has less predictable roadmap — in 2015 support ceased, then resumed in 2016 with version 3.0.

Upgrades:

Solidus makes upgrades simple. Major versions come with clear changelog and migration paths. Can upgrade gradually without rewriting half the code. Spree is notorious for complex upgrades between versions — each major release could break compatibility with extensions and customizations.

API and integrations:

Solidus strives for stable API. Third-party integrations work predictably. Clear extension points through configurable classes instead of monkey patching. Spree had API stability problems — integrations broke between releases.

Community:

Solidus community is smaller numerically but more engaged. Core contributors are companies using platform daily. Code quality prioritized over feature release speed. Spree has larger community historically but after Solidus fork many active participants migrated there.

When to choose Solidus:

  • Need stability for production
  • Plan long-term project support
  • Predictable upgrades important
  • Work with enterprise clients
  • Want clean code for customization

When to stay on Spree:

  • Already using Spree without critical issues
  • Need specific Spree extensions
  • Team familiar specifically with Spree
  • Ready to handle potential breaking changes

When to Choose Solidus

Solidus is not universal solution. It's a platform for Ruby/Rails developers wanting full control over e-commerce logic.

Solidus is perfect if:

You have Rails developers on team or work with Rails agency. Solidus written in Ruby/Rails and requires knowledge of these technologies for serious customization. No point learning new language if team works on PHP or .NET — use platforms on familiar stack.

You need flexibility for unique business logic. Standard platforms (Shopify, WooCommerce) give 80% functionality out of box but last 20% impossible or very expensive to implement. Solidus gives full control — every component replaceable, every logic overridable.

You're building complex store with custom scenarios: subscription commerce (product subscriptions), complex pricing rules (dynamic prices by customers/volumes), custom fulfillment logic (non-standard logistics), integration with legacy systems (ERP, WMS, CRM integrations).

You want headless architecture. Use solidus_core + solidus_api, write frontend in React/Vue/Next.js or mobile app. API flexible enough for any scenarios. You value stability and long-term support. Solidus focused on production-ready code without experimental features that might break in next version.

Solidus is NOT suitable if:

You don't have Rails developers and don't plan hiring them. Platform requires Ruby/Rails knowledge. Consultants cost $80-150/hour which is more expensive than PHP developers. You need ready store in a weekend. Solidus provides tools and framework but not ready storefront with themes. Minimum several weeks development until launch.

Budget is very limited. Platform itself is free but development and hosting will cost more than Shopify at start. You're looking for simplest solution. WooCommerce or Shopify will give store with minimal investment and no programming.

You need huge extension ecosystem. Spree (before fork) and WooCommerce have thousands of ready plugins. Solidus ecosystem is smaller — will need to write integrations yourself. You're not ready to support Rails application. Rails requires regular gem updates, security patches, performance monitoring.

System Requirements

Solidus is a Rails application requiring moderate resources. Not as "heavy" stack as .NET or Java but not as light as PHP.

Minimum requirements for development:

Configuration 2 vCPU / 2 GB RAM / 20 GB SSD will allow deploying Solidus for local development and testing. Ruby 3.0+ (recommended 3.2+). Rails 6.1+ (Solidus compatible with Rails 7). PostgreSQL 12+ or MySQL 5.7+. Redis for background jobs (Sidekiq/DelayedJob). Node.js and Yarn for asset compilation.

Recommended configuration for production:

For real store with traffic need minimum 4 vCPU / 8 GB RAM / 80 GB NVMe SSD. Why? Rails application with Puma web server typically runs 4-6 worker processes 150-250 MB each — that's 1-1.5 GB. PostgreSQL under load requires 2-4 GB for effective query and index caching.

Redis for queues and cache — 500 MB minimum. Sidekiq workers for background jobs (emails, order processing) — another 300-500 MB. Asset compilation and temp files — 1 GB buffer. Operating system and system processes — 1-2 GB. Reserve for peak loads — 1-2 GB.

Total really need 6-8 GB RAM for comfortable medium store operation. On 4 GB will work but with swap during traffic peaks. For high-traffic store (50k+ visits/day) take 8 vCPU / 16 GB RAM.

NVMe SSD is critically important for PostgreSQL. Difference between SATA SSD and NVMe especially noticeable with complex catalog queries with thousands of products and concurrent transactions. On SATA store with 10k+ SKUs slows down at 30+ concurrent users. NVMe handles without drops.

Which VPS to choose on THE.Hosting:

For development fits Beryllium VPS with 2 vCPU / 2 GB RAM / 20 GB NVMe for €3.77/month. Available in all 50+ locations — choose closest for minimum latency.

For production small/medium store take Ruthenium VPS with 4 vCPU / 8 GB RAM / 80 GB NVMe for ~€20/month. Recommended locations by regions:

For European business: Netherlands (Meppel) — Europe's largest internet hub with excellent Amsterdam connectivity (AMS-IX). Germany (Frankfurt) — continent's financial center, minimum latency for Central Europe. United Kingdom (London) — local jurisdiction important after Brexit for UK clients. France (Paris) — for French-speaking audience from France, Belgium, Switzerland.

For Asian market: Japan (Tokyo) — optimal for all East Asia including Korea, Taiwan, Philippines. Hong Kong — best choice for China and Southeast Asia (Thailand, Vietnam, Singapore). South Korea (Seoul) — region's high-speed infrastructure, low latency to Japan and China.

For American audience: USA (New Jersey) — close to New York and entire East Coast, excellent connectivity. Canada (Toronto) — for Canadian market with local data jurisdiction. Brazil (São Paulo) — Latin America's largest market, only location in region.

For CIS and Eastern Europe: Poland (Warsaw) — fast access for Ukraine, Belarus, Baltic states. Romania (Bucharest) — budget location with good regional connectivity. Moldova (Chișinău) — Dedicated servers available for enterprise projects.

For high-traffic store (100k+ visits/month) take Iridium VPS (8 vCPU / 16 GB / 160 GB) or Dedicated Server. Dedicated available in 7 locations: Finland, France, Germany, Moldova, Netherlands, USA, United Kingdom.

Important for Rails hosting: need full root access to install Ruby via rbenv/rvm, ability to run Puma on non-standard ports, enough IOPS for PostgreSQL. THE.Hosting gives root on all plans, NVMe disks everywhere, 24/7 support in Russian and English.

Installing Solidus on Ubuntu 24.04

We'll install Solidus on modern Linux stack: Ubuntu 24.04 LTS + Ruby 3.3 + Rails 7.1 + PostgreSQL 16 + Puma + Nginx.

System preparation

Connect via SSH and update system:

sudo apt update && sudo apt upgrade -y

Install dependencies:

sudo apt install -y curl git-core zlib1g-dev build-essential libssl-dev \
  libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev \
  libcurl4-openssl-dev software-properties-common libffi-dev \
  libpq-dev imagemagick libmagickwand-dev nodejs yarn

Installing Ruby 3.3 via rbenv

Install rbenv for Ruby version management:

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc

Install ruby-build plugin:

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

Install Ruby 3.3.0:

rbenv install 3.3.0
rbenv global 3.3.0
ruby -v

Install Bundler:

gem install bundler
rbenv rehash

PostgreSQL 16 installation

sudo apt install -y postgresql postgresql-contrib libpq-dev
sudo systemctl start postgresql
sudo systemctl enable postgresql

Create database:

sudo -u postgres psql

In PostgreSQL console:

CREATE DATABASE solidus_production;
CREATE USER solidus WITH ENCRYPTED PASSWORD 'strong_password_here';
GRANT ALL PRIVILEGES ON DATABASE solidus_production TO solidus;
ALTER DATABASE solidus_production OWNER TO solidus;
\q

Creating Rails application with Solidus

Create new Rails application:

cd ~
gem install rails -v 7.1.3
rails new my_shop --database=postgresql
cd my_shop

Add Solidus to Gemfile:

# Gemfile
gem 'solidus'
gem 'solidus_auth_devise'

Install gems:

bundle install

Run Solidus installer:

bin/rails generate solidus:install

Installer will ask several questions. Answer:

  • Would you like to run migrations? → Yes
  • Would you like to load seed data? → Yes (for demo data)
  • Would you like to load sample data? → Yes (optional for testing)
  • Create admin user? → Yes
  • Email: admin@example.com
  • Password: test123 (change on production!)

Database configuration

Edit config/database.yml:

production:
  adapter: postgresql
  encoding: unicode
  database: solidus_production
  pool: 5
  username: solidus
  password: strong_password_here
  host: localhost

Apply migrations:

RAILS_ENV=production bin/rails db:migrate

Installing and configuring Puma

Puma already included in Rails. Create config:

config/puma/production.rb:

workers ENV.fetch("WEB_CONCURRENCY") { 2 }
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "production" }

on_worker_boot do
  ActiveRecord::Base.establish_connection
end

Creating systemd service

/etc/systemd/system/solidus.service:

[Unit]
Description=Solidus Rails App
After=network.target postgresql.service

[Service]
Type=simple
User=deploy
WorkingDirectory=/home/deploy/my_shop
Environment=RAILS_ENV=production
Environment=RAILS_LOG_TO_STDOUT=true
ExecStart=/home/deploy/.rbenv/shims/bundle exec puma -C config/puma/production.rb
Restart=always

[Install]
WantedBy=multi-user.target

Create deploy user and move application:

sudo useradd -m -s /bin/bash deploy
sudo cp -r ~/my_shop /home/deploy/
sudo chown -R deploy:deploy /home/deploy/my_shop

Start service:

sudo systemctl daemon-reload
sudo systemctl start solidus
sudo systemctl enable solidus

Nginx setup

sudo apt install -y nginx

/etc/nginx/sites-available/solidus:

upstream solidus {
  server 127.0.0.1:3000;
}

server {
  listen 80;
  server_name your-domain.com www.your-domain.com;

  root /home/deploy/my_shop/public;

  location / {
    try_files $uri @solidus;
  }

  location @solidus {
    proxy_pass http://solidus;
    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;
    proxy_redirect off;
  }

  location ~ ^/(assets|packs)/ {
    expires 1y;
    add_header Cache-Control public;
    add_header ETag "";
    break;
  }
}

Activate:

sudo ln -s /etc/nginx/sites-available/solidus /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

SSL via Let's Encrypt

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com -d www.your-domain.com

Store access

Storefront: https://your-domain.com
Admin: https://your-domain.com/admin
Credentials: admin@example.com / test123

Initial Store Setup

After installation open admin at https://your-domain.com/admin and login with credentials created during setup (admin@example.com / test123). First thing — change admin password to strong one.

In settings specify store name, email address for notifications, currency and timezone. Upload store logo if you have one. Configure taxes by zones — for European Union that's VAT by countries, for USA sales tax by states, for Russia 20% VAT on all products.

Shipping methods configured through calculators. Can set fixed cost, calculation by product weight, by geographic zones or integrate carrier company APIs. Create shipping zones specifying countries and regions where you ship orders.

For accepting payments add payment system. Solidus supports Stripe, PayPal, Braintree and dozens of other processors through ready extensions. Install needed gem, generate configuration and specify API keys from processor. Don't store card data on your server — all processors work through tokenization.

Creating catalog starts with adding products. For each product specify name, description, price, SKU and enable inventory tracking if needed. Upload product images (multiple allowed). Create categories through taxonomy system and distribute products among them. If product has variants like sizes or colors, configure option types and create variants with different combinations.

Standard Solidus frontend is functional but minimalistic. You can customize it through view overrides in your application, use more modern solidus_starter_frontend, write own frontend in React or Vue using Solidus API, or hire agency to create unique design for your brand.

Extensions and Integrations

Popular extensions:

solidus_paypal_commerce_platform — PayPal integration
solidus_stripe — Stripe payments
solidus_social — social login (Facebook, Google)
solidus_i18n — internationalization
solidus_related_products — related/cross-sell products
solidus_wishlist — wishlists
solidus_reviews — product reviews
solidus_subscriptions — subscription commerce

List at extensions.solidus.io

API integrations:

Solidus API allows integrations with:

  • ERP systems (SAP, Oracle, Microsoft Dynamics)
  • CRM (Salesforce, HubSpot)
  • Shipping (ShipStation, Shippo)
  • Email marketing (Mailchimp, Klaviyo)
  • Analytics (Google Analytics, Segment)

Writing own extension:

solidus extension my_extension

Creates template with correct structure.

Performance and Scaling

Caching

Rails cache in production:

config/environments/production.rb:

config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'] }
config.action_controller.perform_caching = true

Fragment caching in views:

<% cache product do %>
  <%= render product %>
<% end %>

Database optimization

Eager loading for N+1 queries:

@products = Spree::Product.includes(:master, :images).all

Database indices on frequently queried fields.

Regular VACUUM and ANALYZE for PostgreSQL:

VACUUM ANALYZE;

Background jobs

Use Sidekiq for async operations:

Gemfile:

gem 'sidekiq'

Emails, order processing, inventory updates — everything in background.

CDN for assets

Store images on S3/CloudFront:

Gemfile:

gem 'aws-sdk-s3'

config/storage.yml for Active Storage.

Horizontal scaling

For high-traffic:

  • 2-3 app servers behind load balancer
  • PostgreSQL master + read replicas
  • Redis cluster
  • Shared file storage (S3)
  • CDN (Cloudflare, CloudFront)

Security

Basic measures:

HTTPS mandatory — Let's Encrypt free.

Regular updates:

bundle update

Strong parameters in Rails protect from mass assignment.

CSRF protection enabled by default.

Secret management:

Use Rails credentials:

EDITOR=nano bin/rails credentials:edit

Store API keys, database passwords there.

PCI compliance:

Don't store full card numbers — use payment processors (Stripe, Braintree) who handle compliance.

Solidus by default doesn't save CVV and full numbers — only processor tokens.

Frequently Asked Questions

Can Solidus be used for free?

Yes, completely open-source under BSD license. But need hosting, domain and developers for customization.

How is Solidus better than Spree?

More stable code, predictable upgrades, better API compatibility, active community from production users.

Can migrate from Spree to Solidus?

Yes, migration relatively simple as Solidus forked from Spree 2.4. Many gems compatible.

Does Solidus support Rails 7?

Yes, compatible with Rails 6.1+ and 7.x.

Do I need Ruby knowledge to work?

For store administration — no. For customization and development — Ruby/Rails experience mandatory.

Can use as headless?

Yes, use solidus_core + solidus_api and write own frontend in anything via REST API.

Which companies use Solidus?

Bonobos, MeUndies, Away, Casper, Ace & Tate, Floyd, Maisonette and hundreds others.

Is commercial support available?

Nebulab and other agencies provide paid support and development. Cost $80-150/hour.

Support and Community

Official resources:

Documentation: guides.solidus.io — comprehensive guides
GitHub: github.com/solidusio/solidus — source code
Slack: solidusio.slack.com — active community chat
Extensions: extensions.solidus.io — extension catalog
Open Collective: opencollective.com/solidus — funding

Nebulab — main contributor:

Italian company from Chieti city specializes in e-commerce. CTO Alberto and team — main Solidus maintainers since 2018.

Agencies and consultants:

Nebulab (Italy) — core team
Super Good Software (USA) — Solidus experts
Blue Stout (USA) — e-commerce agency
Stembolt (Canada) — original creators

Rates: $80-150/hour depending on region and experience.

Training:

Official guides — free at solidus.io
Drifting Ruby — video tutorials
GoRails — Rails screencasts including Solidus
GitHub discussions — community questions

Conclusion

Solidus is stable and flexible e-commerce platform on Ruby on Rails. Perfect for teams with Rails experience, business requiring custom logic, projects needing long-term stability and predictable upgrades.

Main advantages: production-ready code without experiments, simple migrations between versions, active community from real users, complete flexibility through Rails mechanisms, headless capabilities via API.

Having studied this guide you've gained: understanding of Solidus vs Spree differences, step-by-step Ubuntu installation with PostgreSQL, knowledge of hosting requirements, practical setup and scaling advice.

On THE.Hosting servers you can deploy Solidus in any of 50+ locations — choose closest to your audience: Netherlands (Meppel) for European e-commerce, Japan (Tokyo) for Asian market, USA (New Jersey) for American clients or Germany (Frankfurt) as European central point. All servers with NVMe disks, root access and 24/7 support in Russian and English.

Useful THE.Hosting Links

Products:

Support and Information:

For Partners:

Contacts:

  • Telegram: @thehosting
  • Email: support@the.hosting
  • Phone: +44 (204) 577-00-80

Additional Resources:

Other articles

16.03.2026
7
Knowledge base / Instructions / Review
nopCommerce on VPS: Powerful .NET Platform for E-commerce Stores of Any Scale
16.03.2026
5
Knowledge base / All about domains
.app Domain — Your Digital Home for Applications
16.03.2026
5
Knowledge base / All about domains
.camera Domain — Your View of the World Through the Lens