Boilerplate for running Mastodon on AWS using Terraform and CircleCI.
┌---------------┐
| Web Browser |
└---------------┘
▲ ▲
| |
(HTTPS) (WSS)
| |
▼ |
┌------------┐ |
| CloudFront | |
└------------┘ |
▲ |
| |
(HTTP) |
| |
▼ ▼
┌---------------┐
| ALB |
└---------------┘
▲ ▲
| |
(HTTP) (WS)
| |
▼ ▼
┌------------------------┐
| ┌-Docker-┐ ┌-Docker--┐ |
| | Puma | | Express | |
| └--------┘ └---------┘ |
| ┌-Docker--┐ |
| | Sidekiq | EC2 |
| └---------┘ |
└------------------------┘
▲ ▲
| |
▼ ▼
┌----------------┐ ┌-------------┐
| ┌------------┐ | | ┌-------┐ |
| | PostgreSQL | | | | Redis | |
| └------------┘ | | └-------┘ |
| RDS | | Elasticache |
└----------------┘ └-------------┘
- Fork this repository
- Enable CircleCI integration
- Set environment variables on CircleCI
- Run CircleCI job to create resources on AWS
- Build and push mastodon docker image via mastodon-docker
- Run
rails db:setup
by running custom ECS task on AWS console
AWS IAM User access key ID for Terraform.
e.g. ABCDEFGHIJKLMNOPQRST
AWS region that the resources will be located in.
e.g. ap-northeast-1
AWS IAM User secret access key for Terraform.
e.g. abcdefghijklmnopqrstuvwxyz0123456789/+AB
The domain that your terraform state file will be stored. To run Terraform from CircleCI, you need to prepare a private AWS S3 bucket to store your terraform state file.
e.g. your-s3-bucket-name
Where to locate the terraform state file on the specified AWS S3 bucket.
e.g. terraform.tfstate
(recommended)
A valid S3 bucket name for uploading files (e.g. user profile images).
e.g. my-mastodon
The domain for the CloudFront distribution where uploaded files will be provided from.
e.g. cdn.example.com
Database password.
e.g. Generate a long random value like this:
ruby -r securerandom -e "puts SecureRandom.hex(64)"
Mastodon Docker image tag to detect which image to be deployed on ECS. If you are using mastodon-docker to build and push it to ECR, the CircleCI build number will be the Docker image tag.
e.g. 123
Note: this variable is not required at the 1st time because we need to create ECR repository before building Mastodon Docker image.
Mastodon Docker image tag to detect which image to be deployed on ECS for db:migrate
task.
Why this value exists is because sometimes you may want to apply database migration before deploying new revision of application.
e.g. 124
Note: this variable is not required at the 1st time because we need to create ECR repository before building Mastodon Docker image.
The domain that your Mastodon instance will run on.
e.g. mastodon.example.com
One-time password secret
e.g. Generate a long random value like this:
ruby -r securerandom -e "puts SecureRandom.hex(64)"
The secret key base.
e.g. Generate a long random value like this:
ruby -r securerandom -e "puts SecureRandom.hex(64)"
If you want to use HTTPS, create free SSL certificate for your domain on Amazon Certificate Manager on us-east-1 region, then set its ARN to this environment variable.
e.g. arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-567890abcdef
For using secure WebSocket connection, create free SSL certificate for your domain on Amazon Certificate Manager on your region, then set its ARN to this environment variable too.
e.g. arn:aws:acm:ap-northeast-1:123456789012:certificate/12345678-90ab-cdef-1234-567890abcdef
AWS RDS DB instance class.
default: db.t2.micro
FYI: http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.html.
Memory size for node_streaming ECS task.
default: 300
Memory size for rails_db_migration ECS task.
default: 300
Memory size for rails_db_set_up ECS task.
default: 300
Memory size for rails_mastodon_make_admin_memory ECS task.
default: 300
Memory size for rails_puma ECS task.
default: 300
Memory size for rails_sidekiq ECS task.
default: 300
AWS Elasticache Cluster node type.
default: cache.t2.micro
FYI: https://aws.amazon.com/jp/elasticache/pricing/.
AWS EC2 instance type.
default: t2.micro
FYI: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html.
Administrator user name for the mastodon_rails_mastodon_make_admin
ECS task.
AWS IAM user access key ID for Rails to access to AWS API.
AWS IAM user secret access key for Rails to access to AWS API.
DB name.
default: mastodon
DB user name.
default: root
Default locale.
default: en
Email domain blacklist.
Email domain whitelist.
The base URL of Streaming API endpoint.
e.g. https://mastodon-streaming.example.com:4000
default: 1
Should the instance run in single user mode? (Disable registrations, redirect to front page)
default: false
TF_VAR_mastodon_paperclip_root_path
TF_VAR_mastodon_paperclip_root_url
TF_VAR_mastodon_paperclip_secret
TF_VAR_mastodon_prepared_statements
TF_VAR_mastodon_smtp_auth_method
TF_VAR_mastodon_smtp_delivery_method
TF_VAR_mastodon_smtp_domain
TF_VAR_mastodon_smtp_enable_starttls_auto
TF_VAR_mastodon_smtp_from_address
TF_VAR_mastodon_smtp_login
TF_VAR_mastodon_smtp_openssl_verify_mode
TF_VAR_mastodon_smtp_password
TF_VAR_mastodon_smtp_port
TF_VAR_mastodon_smtp_server
This boilerplate will create the following resources:
- module.mastodon.aws_alb_listener.mastodon_node_streaming:
- module.mastodon.aws_alb_listener.mastodon_rails_puma:
- module.mastodon.aws_alb_target_group.mastodon_node_streaming:
- module.mastodon.aws_alb_target_group.mastodon_rails_puma:
- module.mastodon.aws_alb.mastodon:
- module.mastodon.aws_autoscaling_group.mastodon:
- module.mastodon.aws_cloudfront_distribution.mastodon:
- module.mastodon.aws_cloudwatch_log_group.mastodon:
- module.mastodon.aws_db_instance.mastodon:
- module.mastodon.aws_db_parameter_group.mastodon:
- module.mastodon.aws_db_subnet_group.mastodon:
- module.mastodon.aws_ecr_repository.mastodon:
- module.mastodon.aws_ecs_cluster.mastodon:
- module.mastodon.aws_ecs_service.mastodon_node_streaming:
- module.mastodon.aws_ecs_service.mastodon_rails_puma:
- module.mastodon.aws_ecs_service.mastodon_rails_sidekiq:
- module.mastodon.aws_ecs_task_definition.mastodon_node_streaming:
- module.mastodon.aws_ecs_task_definition.mastodon_rails_db_migration:
- module.mastodon.aws_ecs_task_definition.mastodon_rails_db_set_up:
- module.mastodon.aws_ecs_task_definition.mastodon_rails_puma:
- module.mastodon.aws_ecs_task_definition.mastodon_rails_sidekiq:
- module.mastodon.aws_elasticache_cluster.mastodon:
- module.mastodon.aws_elasticache_subnet_group.mastodon:
- module.mastodon.aws_iam_instance_profile.mastodon:
- module.mastodon.aws_iam_policy_attachment.mastodon_ecs_ec2_instance:
- module.mastodon.aws_iam_policy_attachment.mastodon_ecs_service:
- module.mastodon.aws_iam_role.mastodon_ec2:
- module.mastodon.aws_iam_role.mastodon_ecs:
- module.mastodon.aws_internet_gateway.mastodon:
- module.mastodon.aws_launch_configuration.mastodon:
- module.mastodon.aws_route_table_association.mastodon_a:
- module.mastodon.aws_route_table_association.mastodon_c:
- module.mastodon.aws_route_table.mastodon:
- module.mastodon.aws_security_group.mastodon_alb:
- module.mastodon.aws_security_group.mastodon_db:
- module.mastodon.aws_security_group.mastodon_elasticache:
- module.mastodon.aws_security_group.mastodon_web:
- module.mastodon.aws_subnet.mastodon_private_a:
- module.mastodon.aws_subnet.mastodon_private_c:
- module.mastodon.aws_subnet.mastodon_public_a:
- module.mastodon.aws_subnet.mastodon_public_c:
- module.mastodon.aws_vpc.mastodon:
Pull Requests are welcome if you found bugs or features you think are missing.