diff --git a/.github/workflows/terraform_apply.yml b/.github/workflows/terraform_apply.yml new file mode 100644 index 0000000..0730a89 --- /dev/null +++ b/.github/workflows/terraform_apply.yml @@ -0,0 +1,40 @@ +name: Terraform apply + +on: + push: + branches: + - main + + paths: + - 'terraform/**' + + workflow_dispatch: + +jobs: + apply: + runs-on: ubuntu-latest + + defaults: + run: + working-directory: terraform + + steps: + - uses: actions/checkout@v4 + + - uses: hashicorp/setup-terraform@v3 + + - name: Create tfvars file + run: echo "cloudflare_api_token = \"${{ secrets.CLOUDFLARE_API_TOKEN }}\"" > terraform.tfvars + + - name: Create tfbackend file + run: | + cat << EOF > config.s3.tfbackend + access_key = "${{ secrets.CLOUDFLARE_R2_ACCESS_KEY }}" + secret_key = "${{ secrets.CLOUDFLARE_R2_SECRET_KEY }}" + EOF + + - name: Initialize Terraform + run: terraform init -backend-config=config.s3.tfbackend + + - name: Execute Terraform apply + run: terraform apply -auto-approve diff --git a/.github/workflows/terraform_plan.yml b/.github/workflows/terraform_plan.yml new file mode 100644 index 0000000..030ca1d --- /dev/null +++ b/.github/workflows/terraform_plan.yml @@ -0,0 +1,51 @@ +name: Terraform plan + +on: + pull_request: + paths: + - 'terraform/**' + + workflow_dispatch: + +jobs: + plan: + runs-on: ubuntu-latest + + defaults: + run: + working-directory: terraform + + permissions: + contents: read + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - uses: hashicorp/setup-terraform@v3 + + - name: Create tfvars file + run: echo "cloudflare_api_token = \"${{ secrets.CLOUDFLARE_API_TOKEN }}\"" > terraform.tfvars + + - name: Create tfbackend file + run: | + cat << EOF > config.s3.tfbackend + access_key = "${{ secrets.CLOUDFLARE_R2_ACCESS_KEY }}" + secret_key = "${{ secrets.CLOUDFLARE_R2_SECRET_KEY }}" + EOF + + - name: Initialize Terraform + run: terraform init -backend-config=config.s3.tfbackend + + - name: Execute Terraform plan + run: terraform plan -out=plan.tfplan + + - uses: reproio/terraform-j2md@92a5431c6a32baf8321bc57c9408f3972b161a77 # v0.0.9 + + - name: Convert plan to Markdown + run: terraform show -json plan.tfplan | terraform-j2md > plan.md + + - name: Comment on PR + run: gh pr comment ${{ github.event.number }} --body-file plan.md + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..771dfd5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.terraform/ + +*.tfbackend +terraform.tfstate* +terraform.tfvars diff --git a/terraform/.terraform.lock.hcl b/terraform/.terraform.lock.hcl new file mode 100644 index 0000000..cd82a94 --- /dev/null +++ b/terraform/.terraform.lock.hcl @@ -0,0 +1,24 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/cloudflare/cloudflare" { + version = "4.45.0" + hashes = [ + "h1:8Wu1D7ZwbLGdHakLRAzoAJ5VqZ8I14qzkPv1OGNfIlg=", + "zh:00be2a6adc76615a368491c7a026098103b6286deb31e3cfb037365dd39f095f", + "zh:05bd072e6119f7a5abff05c6064001f745473119a956586cf77ae843cf55d666", + "zh:228bbe61345c4e8e0bc6b698b4b9652abff65662ee72ede2aecb4c3efb91b243", + "zh:2948aeefe71ba041c94082cf931ecc95510d93af0a61d0a287880f5b9d24b11a", + "zh:5dfc2c5e95843ca54957212ee3ecb7ff06f2cf60bfd6ca278b5249fd70ac18f5", + "zh:69922cb45559b0b0544b9c2d31ed2d0fac9121faa75bc2f523484785b45d8e2b", + "zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f", + "zh:9d83a0cbf72327286f7dbd63cd4af89059c648163fe6ed21b1df768e0518d445", + "zh:a8e1982945822c7d7aaa6ba8602c7247d1a3fad15d612f30eb323491a637bf8d", + "zh:c6d41ebd69ddb23e3dad49a0ebf1da5a9c7d8706a4f55d953115d371f407928b", + "zh:d03e5442b12846c2737f099d30cd23d9f85a0c6d65437ccb44819f9a6c4e1d7f", + "zh:d446f2e1186b35037aea03b0e27d8b032d2f069f194f84b3f0e2907b3a79a955", + "zh:e4d7549a4c856524e01f3dd4d69f57119ea205f7a0fa38dcfe154475b4ae9258", + "zh:e64b8915cb9686f85e77115bd674f2faf4f29880688067d7d0f1376566fdb3b0", + "zh:f046efdc55e6385cdd69baaa06a929bef9fe6809d373b0d2d6c7df8f8c23eddc", + ] +} diff --git a/terraform/cloudflare_bucket.tf b/terraform/cloudflare_bucket.tf new file mode 100644 index 0000000..ad803b1 --- /dev/null +++ b/terraform/cloudflare_bucket.tf @@ -0,0 +1,4 @@ +resource "cloudflare_r2_bucket" "terraform_state" { + account_id = var.cloudflare_account_id + name = "terraform-state" +} diff --git a/terraform/cloudflare_pages.tf b/terraform/cloudflare_pages.tf new file mode 100644 index 0000000..a1ffe22 --- /dev/null +++ b/terraform/cloudflare_pages.tf @@ -0,0 +1,24 @@ +resource "cloudflare_pages_domain" "pages_domain" { + account_id = var.cloudflare_account_id + domain = "akimo.dev" + project_name = "akimon658" +} + +resource "cloudflare_pages_project" "deployment_config" { + account_id = var.cloudflare_account_id + name = "akimon658" + production_branch = "main" + + source { + type = "github" + config { + owner = "akimon658" + repo_name = "akimo.dev" + production_branch = "main" + pr_comments_enabled = true + deployments_enabled = false + production_deployment_enabled = false + preview_branch_excludes = ["main"] + } + } +} diff --git a/terraform/cloudflare_record.tf b/terraform/cloudflare_record.tf new file mode 100644 index 0000000..b53a6dc --- /dev/null +++ b/terraform/cloudflare_record.tf @@ -0,0 +1,26 @@ +resource "cloudflare_record" "pages_domain" { + content = "akimon658.pages.dev" + name = "akimo.dev" + proxied = true + ttl = 1 + type = "CNAME" + zone_id = var.cloudflare_zone_id +} + +resource "cloudflare_record" "terraform_managed_resource_2bc5568896dac5340e9121dacae14598" { + content = "akimo.dev" + name = "www" + proxied = true + ttl = 1 + type = "CNAME" + zone_id = var.cloudflare_zone_id +} + +resource "cloudflare_record" "terraform_managed_resource_a639226e6e030c6b56787dffc348b994" { + content = "google-site-verification=NZm4LJP7C09-hxzsLIPCw7BTOr5Q0xAigmD4FRoBpKg" + name = "akimo.dev" + proxied = false + ttl = 3600 + type = "TXT" + zone_id = var.cloudflare_zone_id +} diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 0000000..4bbeed5 --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,39 @@ +terraform { + backend "s3" { + bucket = "terraform-state" + key = "terraform.tfstate" + region = "auto" + skip_credentials_validation = true + skip_metadata_api_check = true + skip_region_validation = true + skip_requesting_account_id = true + skip_s3_checksum = true + use_path_style = true + endpoints = { + s3 = "https://831106c4d239c1e8968fbfb28a1c9c05.r2.cloudflarestorage.com" + } + } + required_providers { + cloudflare = { + source = "cloudflare/cloudflare" + } + } +} + +variable "cloudflare_account_id" { + type = string + default = "831106c4d239c1e8968fbfb28a1c9c05" +} + +variable "cloudflare_api_token" { + type = string +} + +variable "cloudflare_zone_id" { + type = string + default = "39789e3a9e22c3a798baae245274330e" +} + +provider "cloudflare" { + api_token = var.cloudflare_api_token +}