Self-Host and Install Canvas LMS on Ubuntu Server

This guide helps you install Canvas LMS on an Ubuntu 22.04 LTS server using Apache and SSL. Only proceed if you have sudo access.

System Requirements

Step 0: Create a User

sudo adduser canvas
sudo usermod -aG sudo canvas
su - canvas

Step 1: Setup PostgreSQL

sudo apt-get install wget ca-certificates -y
wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
  sudo tee /etc/apt/trusted.gpg.d/postgresql.asc

echo "deb http://apt.postgresql.org/pub/repos/apt/ \
  $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list

sudo apt-get update
sudo apt-get install postgresql-17

sudo -u postgres createuser canvas --no-createdb --no-superuser --no-createrole --pwprompt
sudo -u postgres createdb canvas_production --owner=canvas
sudo -u postgres createdb canvas_development --owner=canvas
sudo -u postgres createuser $USER
sudo -u postgres psql -c "alter user $USER with superuser" postgres

Set password for canvas user:

ALTER USER canvas WITH PASSWORD 'your_secure_password';

Step 2: Install Git, Ruby, Node.js, and Yarn

sudo apt-get install git-core software-properties-common
sudo add-apt-repository ppa:instructure/ruby
sudo apt-get update
sudo apt-get install ruby3.3 ruby3.3-dev zlib1g-dev libxml2-dev \
libsqlite3-dev postgresql libpq-dev libxmlsec1-dev libidn11-dev \
curl make g++

curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
source ~/.bashrc
nvm install 20.9.0

curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.19.1
export PATH="$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH"

Step 3: Clone Canvas LMS

cd /var
sudo git clone https://github.com/instructure/canvas-lms.git canvas
sudo chown -R $(whoami):$(whoami) /var/canvas
cd canvas
git checkout prod
for config in amazon_s3 database delayed_jobs vault_contents domain file_store outgoing_mail security external_migration; \
do cp config/$config.yml.example config/$config.yml; done

Step 4: Configure Files

Step 5: Install Dependencies

sudo apt-get install libyaml-dev cmdtest
sudo gem install bundler --version 2.5.10
bundle config set --local path vendor/bundle
bundle install
sudo gem update strscan
sudo gem uninstall stringio && sudo gem install stringio -v 3.1.1
sudo gem uninstall base64 && sudo gem install base64 -v 0.2.0
yarn install
yarn gulp rev
RAILS_ENV=production bundle exec rake db:initial_setup
RAILS_ENV=production bundle exec rake db:migrate
mkdir -p log tmp/pids public/assets app/stylesheets/brandable_css_brands
touch app/stylesheets/_brandable_variables_defaults_autogenerated.scss Gemfile.lock log/production.log
RAILS_ENV=production bundle exec rake canvas:compile_assets

Step 6: Install Apache & Passenger

sudo apt-get install apache2 libapache2-mod-passenger
sudo a2enmod rewrite passenger ssl
sudo vi /etc/apache2/mods-available/passenger.conf

Add:

PassengerDefaultUser canvas
PassengerStartTimeout 180
PassengerPreloadBundler On
PassengerFriendlyErrorPages On

Step 7: SSL with Let's Encrypt

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Apache Virtual Host Example

<VirtualHost *:80>
ServerName your_domain
DocumentRoot /var/canvas/public
PassengerRuby /usr/bin/ruby
PassengerAppEnv production
RailsEnv production
<Directory /var/canvas/public>
AllowOverride all
Options -MultiViews
Require all granted
</Directory>
</VirtualHost>

Run:

sudo a2ensite canvas.conf
sudo certbot --apache

Enable Redis

sudo apt install redis-server
sudo systemctl enable redis-server
sudo cp config/cache_store.yml.example config/cache_store.yml
sudo vi config/cache_store.yml

Rich Content Editor

git clone https://github.com/instructure/canvas-rce-api.git
cd canvas-rce-api
npm install --production
npm audit fix
cp .env.example .env
vi .env

Final Steps

sudo ln -s /var/canvas/script/canvas_init /etc/init.d/canvas_init
sudo update-rc.d canvas_init defaults
sudo /etc/init.d/canvas_init start
sudo ufw allow ssh http https 5432 6379 3000 3001 8000/tcp
sudo ufw enable
sudo ufw reload

Canvas LMS should now be available on your domain with SSL enabled!