This guide provides instructions for deploying Canvas LMS using Docker Compose. Docker deployment offers a containerized approach that simplifies setup and management while ensuring consistency across environments.
For Docker installation, see Docker.
β οΈ Warning: Canvas LMS does not officially maintain regularly updated Docker images. The official images at
ghcr.io/canvas-lms/canvas-lmsmay not reflect the latest stable code. For production deployments, consider building your own Docker images from the stable branch or using the traditional installation method.
mkdir canvas-lms-docker
cd canvas-lms-docker
Create a docker-compose.yml file:
version: '3.8'
services:
postgres:
image: postgres:13
restart: unless-stopped
environment:
POSTGRES_USER: canvas
POSTGRES_DB: canvas_production
POSTGRES_PASSWORD: your_secure_postgres_password
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- canvas_network
redis:
image: redis:6-alpine
restart: unless-stopped
volumes:
- redis_data:/data
networks:
- canvas_network
canvas-lms:
image: ghcr.io/canvas-lms/canvas-lms:stable
restart: unless-stopped
ports:
- "8080:3000"
environment:
CANVAS_LMS_DOMAIN: your-domain.com
CANVAS_LMS_ADMIN_EMAIL: admin@your-domain.com
DATABASE_HOST: postgres
DATABASE_NAME: canvas_production
DATABASE_USERNAME: canvas
DATABASE_PASSWORD: your_secure_postgres_password
REDIS_URL: redis://redis:6379/0
SECRET_KEY_BASE: your_very_long_secret_key_here
volumes:
- canvas_files:/canvas/files
depends_on:
- postgres
- redis
networks:
- canvas_network
volumes:
postgres_data:
redis_data:
canvas_files:
networks:
canvas_network:
driver: bridge
docker compose up -d
git clone -b stable https://github.com/instructure/canvas-lms.git canvas-lms
cd canvas-lms
# Build the image (this may take considerable time)
docker build -t canvas-lms:latest .
Create a docker-compose-custom.yml file:
version: '3.8'
services:
postgres:
image: postgres:13
restart: unless-stopped
environment:
POSTGRES_USER: canvas
POSTGRES_DB: canvas_production
POSTGRES_PASSWORD: your_secure_postgres_password
volumes:
- ./init-db.sql:/docker-entrypoint-initdb.d/init.sql
- postgres_data:/var/lib/postgresql/data
networks:
- canvas_network
redis:
image: redis:6-alpine
restart: unless-stopped
volumes:
- redis_data:/data
networks:
- canvas_network
canvas-lms:
build: .
image: canvas-lms:latest
restart: unless-stopped
ports:
- "8080:3000"
environment:
CANVAS_LMS_DOMAIN: your-domain.com
CANVAS_LMS_ADMIN_EMAIL: admin@your-domain.com
DATABASE_HOST: postgres
DATABASE_NAME: canvas_production
DATABASE_USERNAME: canvas
DATABASE_PASSWORD: your_secure_postgres_password
REDIS_URL: redis://redis:6379/0
SECRET_KEY_BASE: your_very_long_secret_key_here
CANVAS_FILE_STORAGE: local
CANVAS_ATTACHMENT_STORAGE_PATH: /canvas/files
volumes:
- canvas_files:/canvas/files
- ./config:/canvas/config
depends_on:
- postgres
- redis
networks:
- canvas_network
volumes:
postgres_data:
redis_data:
canvas_files:
networks:
canvas_network:
driver: bridge
Create an init-db.sql file to initialize the database:
CREATE USER canvas WITH PASSWORD 'your_secure_postgres_password';
CREATE DATABASE canvas_production OWNER canvas;
GRANT ALL PRIVILEGES ON DATABASE canvas_production TO canvas;
docker compose -f docker-compose-custom.yml up -d
For production environments, consider using external PostgreSQL and Redis services:
version: '3.8'
services:
canvas-lms:
image: ghcr.io/canvas-lms/canvas-lms:stable
restart: unless-stopped
ports:
- "8080:3000"
environment:
CANVAS_LMS_DOMAIN: your-domain.com
CANVAS_LMS_ADMIN_EMAIL: admin@your-domain.com
DATABASE_HOST: your-postgres-server.com
DATABASE_NAME: canvas_production
DATABASE_USERNAME: canvas
DATABASE_PASSWORD: your_secure_postgres_password
REDIS_URL: redis://your-redis-server.com:6379/0
SECRET_KEY_BASE: your_very_long_secret_key_here
CANVAS_FILE_STORAGE: s3
AWS_S3_BUCKET: your-s3-bucket-name
AWS_ACCESS_KEY_ID: your-aws-access-key
AWS_SECRET_ACCESS_KEY: your-aws-secret-key
AWS_S3_REGION: us-east-1
volumes:
- ./config:/canvas/config
- ./logs:/canvas/log
networks:
- canvas_network
networks:
canvas_network:
driver: bridge
Key environment variables for Canvas LMS:
CANVAS_LMS_DOMAIN: Your domain name (comma-separated for multiple domains)CANVAS_LMS_ADMIN_EMAIL: Admin contact emailDATABASE_HOST: PostgreSQL hostDATABASE_NAME: Database nameDATABASE_USERNAME: Database usernameDATABASE_PASSWORD: Database passwordREDIS_URL: Redis connection URLSECRET_KEY_BASE: Random string for cryptographic operations (minimum 128 characters)CANVAS_FILE_STORAGE: Storage backend (local, s3, google_storage)CANVAS_ATTACHMENT_STORAGE_PATH: Path for file storage (when using local storage)After starting the containers, youβll need to run initial setup:
# Access the container
docker exec -it canvas-lms-canvas-lms-1 bash
# Run initial setup (inside container)
bundle exec rake db:initial_setup
# Backup database
docker exec canvas-lms-postgres-1 pg_dump -U canvas canvas_production > backup-$(date +%Y%m%d).sql
# Backup file storage
docker volume ls | grep canvas_files
docker run --rm -v canvas-lms_canvas_files:/data -v $(pwd):/backup alpine tar czf /backup/files-backup-$(date +%Y%m%d).tar.gz -C /data .
Monitor these key metrics:
docker logs canvas-lms-canvas-lms-1# View all containers
docker ps -a
# View logs
docker logs canvas-lms-canvas-lms-1
# Execute commands in container
docker exec -it canvas-lms-canvas-lms-1 bash
# Check resource usage
docker stats canvas-lms-canvas-lms-1
# Restart services
docker compose restart
# Update images
docker compose pull
docker compose up -d
stable tag for production deployments instead of latestAny questions?
Feel free to contact us. Find all contact information on our contact page.