{"id":26898171,"url":"https://github.com/safinn/birdie-stack","last_synced_at":"2025-07-30T06:04:48.995Z","repository":{"id":181468923,"uuid":"634521748","full_name":"safinn/birdie-stack","owner":"safinn","description":"Deploy Remix applications to AWS servers (not serverless) using containers on ECS.","archived":false,"fork":false,"pushed_at":"2023-10-24T08:28:03.000Z","size":57,"stargazers_count":14,"open_issues_count":5,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-02T13:54:26.106Z","etag":null,"topics":["remix-stack"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/safinn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-04-30T12:02:29.000Z","updated_at":"2024-11-11T20:54:11.000Z","dependencies_parsed_at":"2025-06-02T05:14:10.115Z","dependency_job_id":"6e480315-7f09-4041-9b79-c533823c3b03","html_url":"https://github.com/safinn/birdie-stack","commit_stats":null,"previous_names":["safinn/birdie-stack"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/safinn/birdie-stack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/safinn%2Fbirdie-stack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/safinn%2Fbirdie-stack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/safinn%2Fbirdie-stack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/safinn%2Fbirdie-stack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/safinn","download_url":"https://codeload.github.com/safinn/birdie-stack/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/safinn%2Fbirdie-stack/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267820214,"owners_count":24149282,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-30T02:00:09.044Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["remix-stack"],"created_at":"2025-04-01T05:16:13.190Z","updated_at":"2025-07-30T06:04:48.871Z","avatar_url":"https://github.com/safinn.png","language":"TypeScript","readme":"\u003ch1 align=\"center\"\u003eBirdie Stack\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://makeapullrequest.com/\"\u003e\n    \u003cimg alt=\"PRs Welcome\" src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/safinn/birdie-stack/blob/main/LICENSE\"\u003e\n    \u003cimg alt=\"GitHub\" src=\"https://img.shields.io/github/license/safinn/birdie-stack?style=flat\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr/\u003e\n\n\u003cdiv align=\"center\"\u003e\n  The \u003ca href=\"https://github.com/safinn/birdie-stack\"\u003eBirdie Stack\u003c/a\u003e is focused on hosting a \u003ca href=\"https://github.com/remix-run/remix\"\u003eRemix\u003c/a\u003e application on \u003ca href=\"aws.com\"\u003eAWS\u003c/a\u003e \u003cem\u003e(\u003cstrong\u003eA\u003c/strong\u003emazon \u003cstrong\u003eW\u003c/strong\u003eeb \u003cstrong\u003eS\u003c/strong\u003eervices)\u003c/em\u003e with minimal cost.\n\u003c/div\u003e\n\n\u003cbr/\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Logo\" src=\"https://user-images.githubusercontent.com/4719461/236650539-e4c8d380-8078-4d79-b3e8-66db1be95b55.png\"\u003e\n\u003c/div\u003e\n\n\u003cbr/\u003e\n\n\u003c!-- The following toc is generated with the Markdown All in One VSCode extension (https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one) --\u003e\n\n## Table of contents \u003c!-- omit from toc --\u003e\n\n- [Features](#features)\n- [Getting Started](#getting-started)\n- [Infrastructure](#infrastructure)\n  - [Remote State](#remote-state)\n    - [OpenID Connect Provider](#openid-connect-provider)\n  - [Application Environment](#application-environment)\n- [Setup](#setup)\n  - [Migrations](#migrations)\n    - [Basti](#basti)\n    - [Drizzle](#drizzle)\n  - [GitHub Actions](#github-actions)\n- [Development](#development)\n- [Deployment](#deployment)\n\n\u003cbr/\u003e\n\n## Features\n\n- Deploy using containers to AWS ECS with the choice of:\n  - _Simple_ mode for cheap single instance deployments ideal for hobby projects (default).\n  - _Production_ deployment that can scale instances across the region (`simple=false`) in private subnets for stronger security.\n- PostgreSQL RDS instance in a private subnet.\n\n## Getting Started\n\n```sh\npnpm create remix@latest --template safinn/birdie-stack\n```\n\n- [Terraform](https://www.terraform.io) is required to manage and deploy the infrastructure-as-code with configured AWS credentials.\n- [Basti](https://github.com/BohdanPetryshyn/basti) is used to setup the bastion server giving access to the private RDS instance.\n\nHaving all these tools installed and ready to go will get you started fast.\n\n## Infrastructure\n\n### Remote State\n\nThis module creates the S3 bucket and DynamoDB table to remotely manage the terraform state for the application.\n\n1. Update the `reponame` and `domain` variables in the [./infra/prod/terraform.tfvars](./infra/prod/terraform.tfvars) file.\n2. From the application root:\n\n```sh\ncd ./infra/remote-state \u0026\u0026 \\\nterraform init \u0026\u0026 \\\nterraform apply --var-file ../prod/terraform.tfvars\n```\n\n#### OpenID Connect Provider\n\nThis module also sets up the GitHub OpenID connect provider so GitHub action workflows can assume a AWS IAM role and obtain short-lived credentials to manage resources on AWS.\n\n### Application Environment\n\nThis module sets up all the infrastructure required for the application.\n\n```sh\ncd ../prod \u0026\u0026 \\\nterraform init \u0026\u0026 \\\nterraform apply\n```\n\n## Setup\n\n### Migrations\n\n#### Basti\n\nAccess to the RDS instance in the private subnet is allowed via [Basti](https://github.com/BohdanPetryshyn/basti)\n\n```sh\npnpm install --global basti\n```\n\n```sh\nbasti init\n```\n\nAfter a few minutes the infrastructure should be ready to connect to with:\n\n```sh\nbasti connect\n```\n\n#### Drizzle\n\nGenerate your migration files from the schema using the command:\n\n```sh\npnpm generate\n```\n\nApply migrations making sure to use the correct connection string. The `password` can be taken from AWS Secrets Manager once access is gained to the private RDS instance using [Basti](#basti). Run the command:\n\n```sh\npnpm migrate 'postgres://birdie-stack:password@localhost:port/birdie-stack'\n```\n\n### GitHub Actions\n\nUpdate the `deploy` workflows in the `.github/workflows/` directory by changing the role arn provided to `role-to-assume` in all the `Configure AWS Credentials` steps to the arn of the role named `github-actions-role` in AWS IAM.\n\n## Development\n\nFrom your terminal:\n\n```sh\npnpm dev\n```\n\nThis starts your app in development mode, rebuilding assets on file changes.\n\n## Deployment\n\nA GitHub action is included that will build the application on push using AWS CodeBuild for ARM and generate and push a docker image to ECR which will then be deployed to the ECS cluster.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsafinn%2Fbirdie-stack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsafinn%2Fbirdie-stack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsafinn%2Fbirdie-stack/lists"}