name | description | languages | products | page_type | urlFragment | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Azure Rails Starter |
Sample Rails application deployed through Azure Developer CLI (azd) on Azure Container App and Azure Database for PostgreSQL |
|
|
sample |
azure-rails-starter |
This is a starter blueprint for getting your Rails application up and running on Azure using Azure Developer CLI (azd). The Rails application is deployed in an Azure Container App and uses an Azure Postgresql database. The starter uses Infrastructure as Code assets in Bicep to get your application up and running quickly.
The following assets have been provided:
- Infrastructure-as-code (IaC) Bicep files under the
infra
folder that demonstrate how to provision resources and setup resource tagging for azd. - A dev container configuration file under the
.devcontainer
directory that installs infrastructure tooling by default. This can be readily used to create cloud-hosted developer environments such as GitHub Codespaces.- Ruby 3.3.0
- GitHub Copilot
- Postgresql running in a container (for development)
- Redis running in a container (for development)
- Continuous deployment workflows for CI providers such as GitHub Actions under the
.github
directory, and Azure Pipelines under the.azdo
directory that work for most use-cases. - A freshly created Rails 7.1.3 application under directory
src
.
Just run azd up
to run the end-to-end infrastructure provisioning (azd provision
) and deployment (azd deploy
) flow. Visit the service endpoint listed to see your application up-and-running!
Quick start:
SECRET_KEY_BASE="$(src/bin/rails secret)" \
RAILS_MASTER_KEY="$(cat src/config/master.key)" \
azd up
The following section examines different concepts that help tie in application and infrastructure.
It is recommended to have application settings managed in Azure, separating configuration from code. Typically, the service host allows for application settings to be defined.
- Application settings should be defined on the Bicep resource for the Azure Container App. See main.bicep for an example setting environment variables and using secrets stored in Azure Key Vault.
- Environment variables for your developer environment (Dev Containers or Codespaces) can be defined in .decontainer/Dockerfile.
Managed identities allows you to secure communication between services. This is done without having the need for you to manage any credentials. It is used between Azure Container Apps and Azure Key Vault to automatically retrieve secrets.s
Azure Key Vault allows you to store secrets securely. Your application can access these secrets securely through the use of managed identities.
When changes are made, use azd to validate and apply your changes in Azure, to ensure that they are working as expected:
- Run
azd up
to validate both infrastructure and application code changes. - Run
azd deploy
to validate application code changes only.
Move to the src
directory:
cd src
Run the Rails server:
bin/rails server
Run the Rails console:
bin/rails console
Run the Rails migration command:
bin/rails db:migrate
psql $DATABASE_URL
The rails application has been created by running the following command:
rails new --database=postgresql --name=azure-rails-starter src
rm -rf src/.git
cd src
sed -i '' 's/# root.*$/root "home#index"/' config/routes.rb
sed -i '' '/azure_rails_starter_production$/,/DATABASE_PASSWORD/c\
url: <%= ENV["DATABASE_URL"] %>
' config/database.yml
cat > app/controllers/home_controller.rb <<EOF
class HomeController < ApplicationController
def index
render plain: 'Hello World!'
end
end
EOF
. ./.env
az containerapp exec --name $SERVICE_RAILS_NAME --resource-group $AZURE_RESOURCE_GROUP_NAME
This can be useful to apply bin/rails db:migrate
commands or access the Rails console through bin/rails console
. Note that the default bin/docker-entrypoint
already runs bin/rails db:prepare
.
azd down
If you want to make sure you can recreate the same environment, KeyVault needs to be purged:
azd down --purge
In this repository src/config/master.key
has been committed to simplify deployment of the sample application. If you plan on building from the sample app please delete config/master.key
and config/credentials.yml.enc
. Commit the changes. Then run bin/rails credentials:edit
.
Sometimes deployment fails because the PostgreSQL resource is still busy and extensions cannot yet be applied. In a case like that just re-run the deployment.
If you're working with this project and running into issues, please post an Issue by clicking on the link above.