# 3 Musketeers
**Test, build, and deploy your apps from anywhere, the same way!** [![Build Status][linkGitHubActionsProjectBadge]][linkGitHubActionsProject] [![License][linkLicenseBadge]][linkLicense]
Table of Contents - [Overview](#overview) - [3 Musketeers website](#3-musketeers-website) - [Prerequisites](#prerequisites) - [Development](#development) - [Deployment](#deployment) - [0. Cloudflare account ID and API token](#0-cloudflare-account-id-and-api-token) - [1. Envfile](#1-envfile) - [2. Create](#2-create) - [3. Deploy](#3-deploy) - [4. Delete](#4-delete) - [CI/CD](#cicd) - [Visual elements](#visual-elements) - [Contributing](#contributing) - [License](#license)
## Overview The 3 Musketeers is a pattern for developing software in a repeatable and consistent manner. It leverages Make as an orchestration tool to test, build, run, and deploy applications using Docker and Docker Compose. The Make and Docker/Compose commands for each application are maintained as part of the application’s source code and are invoked in the same way whether run locally or on a CI/CD server. > [!NOTE] > To learn more, please visit the [official website][link3Musketeers]. ## 3 Musketeers website This repository is the [3 Musketeers website][link3Musketeers] built with [Astro Starlight][linkAstroStarlight]. This section explains how to develop, test, and deploy using the 3 Musketeers methodology. ### Prerequisites - [Docker](https://www.docker.com/) - [Compose](https://docs.docker.com/compose/) - [Make](https://www.gnu.org/software/make/) - [Cloudflare][linkCloudflarePages] account ### Development ```bash # Create a .env file make envfile ENVFILE=env.example # Install dependencies make deps copyDepsToHost # Format and check make fmt check # Start Astro server for local development make dev # Wait till the message 'dev-1 | 20:13:41 watching for file changes...' appears # Access the website in your browser at http://127.0.0.1:4321/ # \ to stop # Build static site make build # Serve static site for local development make previewDev # Access the website in your browser at http://127.0.0.1:4321/ # \ to stop # Serve static website in the background make preview # Test static website make testPreview # Clean make clean ``` ### Deployment The 3 Musketeers website is deployed to [Cloudflare Pages][linkCloudflarePages]. This section shows how to create, deploy, and delete a Pages project using [Wrangler CLI][linkCloudflareWranglerCLI]. This is handy for previewing new changes. Given build, test and deployment are going to be done with GitHub Actions, this section follows the [Direct Upload][linkCloudflareDirectUpload] and [Run Wrangler in CI/CD][linkCloudflareWranglerCICD] directives. > [!NOTE] > This section requires the static site to be have been generated with > `make build` #### 0. Cloudflare account ID and API token To interact with Cloudflare Pages with Wrangler CLI, Cloudflare account ID and API token are required. 1. Account ID: [Find account and zone IDs][linkCloudflareFindAccountAndZoneIDs] 1. API token 1. [Create API token][linkCloudflareCreateAPIToken] 1. Use `Edit Cloudflare Workers` template 1. Update the `Token name` 1. Permissions: 1. Account - Cloudflare Pages - Edit 1. Remove other permissions 1. Include your account 1. Set a short-lived TTL 1. Click `Continue to summary` 1. These values will be used in the following section `1. Envfile` #### 1. Envfile The following sections use the values from the file `.env`. Create file `.env` (based on `env.template`) with the correct values. Example: ```bash # .env ENV_CLOUDFLARE_BRANCH_NAME=main ENV_CLOUDFLARE_PROJECT_NAME=random-project-name ENV_SECRET_CLOUDFLARE_ACCOUNT_ID=id-from-previous-section ENV_SECRET_CLOUDFLARE_API_TOKEN=token-from-previous-section ``` Verify: ```bash make shell # Check the env vars are correctly set env | grep ENV_ # List current projects on CloudFlare deno task deploy:list exit ``` #### 2. Create This section creates a new Pages project. This step is only needed if `ENV_CLOUDFLARE_PROJECT_NAME` wasn't listed in step `1. Envfile`. ```bash make shell # Create a new project deno task deploy:create # The new project and its domain should be listed deno task deploy:list # Project is empty which should not be hosted curl -I https://${ENV_CLOUDFLARE_PROJECT_NAME}.pages.dev #HTTP/2 522 #... # Exit the container exit ``` #### 3. Deploy This section deploys the website to an existing Cloudflare Pages project. ```bash make shell # Deploy the files to the project deno task deploy # Project is no longer empty! curl -I https://${ENV_CLOUDFLARE_PROJECT_NAME}.pages.dev #HTTP/2 200 #... # Exit the container exit ``` Note: `make deploy` can also be used. #### 4. Delete This section shows how to delete a Cloudflare Pages project. ```bash make shell deno task deploy:delete #? Are you sure you want to delete ""? This action cannot be undone. › y # Check the project is no longer listed deno task deploy:list exit ``` > [!IMPORTANT] > The CloudFlare token created in section > `0. Cloudflare account ID and API token` can be deleted ### CI/CD [GitHub Actions][linkGitHubActions] is used to test PRs and deploy changes made to `main` branch to Cloudflare Pages. - A dedicated Cloudflare API token has been created for Github Actions - Environment variables required for deploying to Cloudflare Pages are set as [variables][linkGitHubActionsVariables] and [secrets][linkGitHubActionsSecrets] in GitHub Actions - The GitHub Actions workflows follow the 3 Musketeers pattern ### Visual elements - 3 Musketeers logo - Created by me with [Procreate][linkProcreate] and Vectornator - Neat tools used are `offset path` and `mask objects` - 2048px by 2048px SVG image - Images are in folder `./src/assets/logo/` - Favicon - Source image is an exported png format of the logo - Use the website [favicon.io][linkFaviconio] - The generated content is in `./public/favicon_io` - Instructions to copy HTML `` tags into the `` was set in `./astro.config.mjs` - Social media preview - This is for displaying preview of the website on Twitter, Facebook, GitHub, etc - Created a new vector image 1280x640px with the scale down logo at the center - The size is suggested by GitHub in General settings - According to [artegence article][linkArtegenceArticle], the ideal image that works on different social platforms - Is 1200x630px - Has the logo (630x630) centered - Use png format (very high quality and transparency) - Use jpg format (high quality and very good size compression) - The social image is also set in the general settings of the repository - Astro Startlight sets all of the `` tags in the `` section - Diagrams - [Mermaid][linkMermaid] is used to generate diagrams - All diagrams are in the directory [diagrams](diagrams) - The [demo][linkDemo] was generated by [charmbracelet/vhs][linkVHS] ## Contributing [CONTRIBUTING.md](CONTRIBUTING.md) Thanks goes to [contributors][linkContributors]. ## License [MIT][linkLicense] [link3Musketeers]: https://3musketeers.pages.dev [linkArtegenceArticle]: https://artegence.com/blog/social-media-tags-guide-part-2-preparing-a-perfect-image-for-the-ogimage-tag/ [linkAstroStarlight]: https://starlight.astro.build/ [linkCloudflareCreateAPIToken]: https://dash.cloudflare.com/profile/api-tokens [linkCloudflareDirectUpload]: https://developers.cloudflare.com/pages/get-started/direct-upload/ [linkCloudflareFindAccountAndZoneIDs]: https://developers.cloudflare.com/fundamentals/setup/find-account-and-zone-ids/ [linkCloudflarePages]: https://pages.cloudflare.com/ [linkCloudflareWranglerCICD]: https://developers.cloudflare.com/workers/wrangler/ci-cd/ [linkCloudflareWranglerCLI]: https://developers.cloudflare.com/workers/wrangler/ [linkCompose]: https://docs.docker.com/compose [linkContributors]: CONTRIBUTORS [linkDemo]: demo [linkDocker]: https://www.docker.com [linkFaviconio]: https://favicon.io [linkGitHubActions]: https://github.com/features/actions [linkGitHubActionsProject]: https://github.com/flemay/3musketeers/actions [linkGitHubActionsProjectBadge]: https://img.shields.io/github/actions/workflow/status/flemay/3musketeers/deploy.yml?style=for-the-badge&logo=github [linkGitHubActionsSecrets]: https://docs.github.com/en/actions/security-guides/encrypted-secrets [linkGitHubActionsVariables]: https://docs.github.com/en/actions/learn-github-actions/variables [linkLicense]: LICENSE [linkLicenseBadge]: https://img.shields.io/badge/License-MIT-green.svg?style=for-the-badge [linkMake]: https://www.gnu.org/software/make [linkMermaid]: https://mermaid.js.org/ [linkPatternOverview]: ./docs/guide/assets/diagrams-overview.svg [linkProcreate]: https://procreate.art/ [linkVHS]: https://github.com/charmbracelet/vhs