From cda7a876bced7d8db7bfbf99a81dab4476543361 Mon Sep 17 00:00:00 2001 From: Markos Gogoulos Date: Wed, 21 Jan 2026 16:00:49 +0200 Subject: [PATCH] feat: bootstrap Talos 1.12.1 cluster --- .github/README.md | 55 -- .github/workflows/test-template.yaml | 129 ---- README.md | 130 ++++ copier.yml | 30 - issues.md | 54 -- nextjs-django-github.test-data.yml | 21 - .github/scaf-logo.png => scaf-logo.png | Bin template/.envrc | 27 - template/.github/dependabot.yml | 14 - .../workflows/infrastructure-validation.yaml | 186 +++++ template/.github/workflows/main.yaml | 229 ------ .../.github/workflows/semantic-release.yaml | 35 - template/.pre-commit-config.yaml | 29 +- template/Makefile | 172 +---- template/README.md | 25 +- template/Taskfile.yml | 45 +- template/Tiltfile | 63 -- template/argocd/base/argocd/app.yaml | 33 - .../argocd/base/argocd/kustomization.yaml | 5 - template/argocd/base/cert-manager/app.yaml | 33 - .../base/cert-manager/kustomization.yaml | 5 - template/argocd/base/cloudnative-pg/app.yaml | 33 - .../base/cloudnative-pg/kustomization.yaml | 5 - template/argocd/base/ingress/app.yaml | 28 - .../argocd/base/ingress/kustomization.yaml | 5 - .../base/kube-prometheus-stack/app.yaml | 62 -- .../kube-prometheus-stack/kustomization.yaml | 5 - .../local-path-provisioner/kustomization.yaml | 36 - template/argocd/base/reflector/app.yaml | 28 - .../argocd/base/reflector/kustomization.yaml | 5 - template/argocd/base/sealed-secrets/app.yaml | 31 - .../base/sealed-secrets/kustomization.yaml | 5 - template/argocd/base/traefik/app.yaml | 37 - .../argocd/base/traefik/kustomization.yaml | 5 - .../base/{{ copier__project_slug }}/app.yaml | 26 - .../cloudfront-invalidation-hook.yaml | 40 - .../kustomization.yaml | 8 - template/argocd/prod/apps/kustomization.yaml | 25 - .../argocd/prod/ingress/kustomization.yaml | 35 - .../argocd/sandbox/apps/kustomization.yaml | 40 - .../sandbox/ingress/cert-manager-issuer.yaml | 33 - .../argocd/sandbox/ingress/certificates.yaml | 15 - template/argocd/sandbox/ingress/ingress.yaml | 59 -- .../argocd/sandbox/ingress/kustomization.yaml | 6 - template/backend/Dockerfile | 103 --- template/backend/config/__init__.py | 7 - template/backend/config/asgi.py | 16 - template/backend/config/schema.py | 13 - template/backend/config/settings/__init__.py | 0 template/backend/config/settings/base.py | 336 --------- template/backend/config/settings/local.py | 73 -- .../backend/config/settings/production.py | 193 ----- template/backend/config/settings/test.py | 48 -- template/backend/config/urls.py | 63 -- template/backend/config/wsgi.py | 38 - template/backend/env.example | 21 - template/backend/manage.py | 23 - template/backend/requirements/base.in | 29 - template/backend/requirements/local.in | 9 - template/backend/requirements/production.in | 20 - template/backend/requirements/tests.in | 15 - .../{{copier__project_slug}}/__init__.py | 7 - .../{{copier__project_slug}}/celery.py | 17 - .../{{copier__project_slug}}/conftest.py | 24 - .../contrib/__init__.py | 0 .../contrib/sites/__init__.py | 0 .../contrib/sites/migrations/0001_initial.py | 41 -- .../migrations/0002_alter_domain_unique.py | 19 - .../0003_set_site_domain_and_name.py | 28 - .../contrib/sites/migrations/__init__.py | 0 .../static/css/project.css | 13 - .../static/fonts/.gitkeep | 0 .../static/images/favicons/favicon.ico | Bin 8348 -> 0 bytes .../static/js/project.js | 1 - .../static/sass/project.scss | 35 - .../templates/403.html | 9 - .../templates/404.html | 9 - .../templates/500.html | 13 - .../templates/account/account_inactive.html | 12 - .../templates/account/base.html | 11 - .../templates/account/email.html | 80 -- .../templates/account/email_confirm.html | 32 - .../templates/account/login.html | 48 -- .../templates/account/logout.html | 22 - .../templates/account/password_change.html | 17 - .../templates/account/password_reset.html | 26 - .../account/password_reset_done.html | 17 - .../account/password_reset_from_key.html | 25 - .../account/password_reset_from_key_done.html | 10 - .../templates/account/password_set.html | 17 - .../templates/account/signup.html | 23 - .../templates/account/signup_closed.html | 12 - .../templates/account/verification_sent.html | 13 - .../account/verified_email_required.html | 24 - .../templates/base.html | 106 --- .../templates/pages/about.html | 1 - .../templates/pages/home.html | 1 - .../templates/users/user_detail.html | 36 - .../templates/users/user_form.html | 17 - .../users/__init__.py | 0 .../users/adapters.py | 16 - .../{{copier__project_slug}}/users/admin.py | 22 - .../{{copier__project_slug}}/users/apps.py | 13 - .../{{copier__project_slug}}/users/forms.py | 29 - .../users/migrations/0001_initial.py | 131 ---- .../users/migrations/__init__.py | 0 .../{{copier__project_slug}}/users/models.py | 13 - .../users/mutations.py | 35 - .../{{copier__project_slug}}/users/queries.py | 13 - .../{{copier__project_slug}}/users/tasks.py | 11 - .../users/tests/__init__.py | 0 .../users/tests/factories.py | 32 - .../users/tests/test_forms.py | 40 - .../users/tests/test_graphql_views.py | 117 --- .../users/tests/test_models.py | 9 - .../users/tests/test_tasks.py | 16 - .../users/tests/test_urls.py | 24 - .../users/tests/test_views.py | 75 -- .../{{copier__project_slug}}/users/types.py | 19 - .../{{copier__project_slug}}/users/urls.py | 9 - .../{{copier__project_slug}}/users/views.py | 47 -- .../utils/__init__.py | 1 - .../utils/cloud_storage.py | 10 - .../utils/context_processors.py | 5 - .../utils/debugger.py | 21 - .../utils/healthcheck.py | 67 -- template/bitbucket-pipelines.yml | 62 -- template/bootstrap-cluster/.env | 7 +- template/bootstrap-cluster/README.md | 238 ++---- template/bootstrap-cluster/Taskfile.yml | 8 +- template/bootstrap-cluster/argocd.yaml | 180 ----- template/bootstrap-cluster/k3s.yaml | 247 ------- template/bootstrap-cluster/production/.env | 2 +- .../bootstrap-cluster/root-app.template.yaml | 27 - template/bootstrap-cluster/talos.yaml | 63 +- template/docs/README.md | 50 +- template/docs/architecture.md | 466 +++++------- template/docs/dataflow.md | 695 ------------------ template/docs/debug.md | 29 - template/docs/deployment.md | 374 +++++++++- template/docs/development.md | 98 --- template/docs/monitoring.md | 91 --- template/docs/project-overview.md | 146 ++-- template/docs/qa.md | 3 - template/docs/secrets.md | 326 +++++++- template/docs/sentry.md | 51 -- template/flake.nix | 1 - template/frontend/.dockerignore | 11 - template/frontend/.env.local.example | 3 - template/frontend/.gitignore | 38 - template/frontend/.husky/pre-push | 9 - template/frontend/.prettierignore | 5 - template/frontend/.prettierrc | 13 - template/frontend/Dockerfile | 17 - template/frontend/README.md | 39 - .../__generated__/fragment-masking.ts | 87 --- template/frontend/__generated__/gql.ts | 42 -- template/frontend/__generated__/graphql.ts | 110 --- template/frontend/__generated__/index.ts | 2 - template/frontend/__tests__/about.test.tsx | 25 - template/frontend/codegen.ts | 19 - .../frontend/components/ErrorBoundary.tsx | 48 -- template/frontend/components/Footer.tsx | 24 - template/frontend/components/Layout.tsx | 19 - template/frontend/components/NavBar.tsx | 17 - template/frontend/dependencies-dev-init.txt | 26 - template/frontend/dependencies-init.txt | 11 - template/frontend/eslint.config.mjs | 112 --- template/frontend/lib/apolloClient.ts | 82 --- template/frontend/next.config.mjs | 13 - template/frontend/package.json | 19 - template/frontend/pages/404.tsx | 8 - template/frontend/pages/500.tsx | 3 - template/frontend/pages/_app.tsx | 21 - template/frontend/pages/_document.tsx | 13 - template/frontend/pages/about.tsx | 31 - template/frontend/pages/api/hello.ts | 10 - template/frontend/pages/index.tsx | 25 - template/frontend/postcss.config.mjs | 5 - template/frontend/public/favicon.ico | Bin 25931 -> 0 bytes template/frontend/public/scaf-logo.png | Bin 47188 -> 0 bytes template/frontend/styles/globals.css | 2 - template/frontend/tsconfig.json | 34 - template/frontend/utils/test-utils.tsx | 18 - template/frontend/vitest.config.ts | 17 - template/frontend/vitest.setup.ts | 3 - .../k8s/_monitoring/django-logs-table.yaml | 190 ----- .../k8s/_monitoring/loki-stack-values.yaml | 34 - template/k8s/argocd/README.md | 46 -- template/k8s/base/app.configmap.yaml | 41 -- template/k8s/base/celery.yaml | 77 -- template/k8s/base/django.yaml | 90 --- template/k8s/base/flower.yaml | 32 - template/k8s/base/frontend.yaml | 54 -- template/k8s/base/ingress.yaml | 65 -- template/k8s/base/kustomization.yaml | 13 - template/k8s/base/pod-disruption-budgets.yaml | 53 -- template/k8s/base/pod-priority.yaml | 25 - template/k8s/base/redis.yaml | 37 - template/k8s/local/kustomization.yaml | 34 - template/k8s/local/postgres.yaml | 89 --- template/k8s/local/secrets.yaml | 9 - template/k8s/mailhog/kustomization.yaml | 5 - template/k8s/mailhog/mailhog.yaml | 42 -- template/k8s/prod/kustomization.yaml | 78 -- template/k8s/sandbox/certificate.yaml | 13 - template/k8s/sandbox/ingress-route.yaml | 84 --- template/k8s/sandbox/kustomization.yaml | 139 ---- template/k8s/sandbox/postgres.cnpg.yaml | 69 -- template/k8s/templates/secrets.yaml.template | 15 - template/tasks.py | 33 +- template/terraform/README.md | 25 +- template/terraform/modules/base/Makefile | 4 +- template/terraform/modules/base/ecr.tf | 57 -- .../terraform/modules/base/github-iam-role.tf | 43 -- template/terraform/modules/base/outputs.tf | 5 - template/terraform/modules/base/route53.tf | 60 -- .../terraform/modules/base/security_groups.tf | 10 - template/terraform/modules/base/variables.tf | 50 +- template/terraform/production/cluster.tf | 15 +- template/terraform/sandbox/cluster.tf | 15 +- template/terraform/staging/cluster.tf | 15 +- 222 files changed, 1442 insertions(+), 8809 deletions(-) delete mode 100644 .github/README.md delete mode 100644 .github/workflows/test-template.yaml create mode 100644 README.md delete mode 100644 issues.md delete mode 100644 nextjs-django-github.test-data.yml rename .github/scaf-logo.png => scaf-logo.png (100%) delete mode 100644 template/.envrc delete mode 100644 template/.github/dependabot.yml create mode 100644 template/.github/workflows/infrastructure-validation.yaml delete mode 100644 template/.github/workflows/main.yaml delete mode 100644 template/.github/workflows/semantic-release.yaml delete mode 100644 template/Tiltfile delete mode 100644 template/argocd/base/argocd/app.yaml delete mode 100644 template/argocd/base/argocd/kustomization.yaml delete mode 100644 template/argocd/base/cert-manager/app.yaml delete mode 100644 template/argocd/base/cert-manager/kustomization.yaml delete mode 100644 template/argocd/base/cloudnative-pg/app.yaml delete mode 100644 template/argocd/base/cloudnative-pg/kustomization.yaml delete mode 100644 template/argocd/base/ingress/app.yaml delete mode 100644 template/argocd/base/ingress/kustomization.yaml delete mode 100644 template/argocd/base/kube-prometheus-stack/app.yaml delete mode 100644 template/argocd/base/kube-prometheus-stack/kustomization.yaml delete mode 100644 template/argocd/base/local-path-provisioner/kustomization.yaml delete mode 100644 template/argocd/base/reflector/app.yaml delete mode 100644 template/argocd/base/reflector/kustomization.yaml delete mode 100644 template/argocd/base/sealed-secrets/app.yaml delete mode 100644 template/argocd/base/sealed-secrets/kustomization.yaml delete mode 100644 template/argocd/base/traefik/app.yaml delete mode 100644 template/argocd/base/traefik/kustomization.yaml delete mode 100644 template/argocd/base/{{ copier__project_slug }}/app.yaml delete mode 100644 template/argocd/base/{{ copier__project_slug }}/cloudfront-invalidation-hook.yaml delete mode 100644 template/argocd/base/{{ copier__project_slug }}/kustomization.yaml delete mode 100644 template/argocd/prod/apps/kustomization.yaml delete mode 100644 template/argocd/prod/ingress/kustomization.yaml delete mode 100644 template/argocd/sandbox/apps/kustomization.yaml delete mode 100644 template/argocd/sandbox/ingress/cert-manager-issuer.yaml delete mode 100644 template/argocd/sandbox/ingress/certificates.yaml delete mode 100644 template/argocd/sandbox/ingress/ingress.yaml delete mode 100644 template/argocd/sandbox/ingress/kustomization.yaml delete mode 100644 template/backend/Dockerfile delete mode 100644 template/backend/config/__init__.py delete mode 100644 template/backend/config/asgi.py delete mode 100644 template/backend/config/schema.py delete mode 100644 template/backend/config/settings/__init__.py delete mode 100644 template/backend/config/settings/base.py delete mode 100644 template/backend/config/settings/local.py delete mode 100644 template/backend/config/settings/production.py delete mode 100644 template/backend/config/settings/test.py delete mode 100644 template/backend/config/urls.py delete mode 100644 template/backend/config/wsgi.py delete mode 100644 template/backend/env.example delete mode 100755 template/backend/manage.py delete mode 100644 template/backend/requirements/base.in delete mode 100644 template/backend/requirements/local.in delete mode 100644 template/backend/requirements/production.in delete mode 100644 template/backend/requirements/tests.in delete mode 100644 template/backend/{{copier__project_slug}}/__init__.py delete mode 100644 template/backend/{{copier__project_slug}}/celery.py delete mode 100644 template/backend/{{copier__project_slug}}/conftest.py delete mode 100644 template/backend/{{copier__project_slug}}/contrib/__init__.py delete mode 100644 template/backend/{{copier__project_slug}}/contrib/sites/__init__.py delete mode 100644 template/backend/{{copier__project_slug}}/contrib/sites/migrations/0001_initial.py delete mode 100644 template/backend/{{copier__project_slug}}/contrib/sites/migrations/0002_alter_domain_unique.py delete mode 100644 template/backend/{{copier__project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py delete mode 100644 template/backend/{{copier__project_slug}}/contrib/sites/migrations/__init__.py delete mode 100644 template/backend/{{copier__project_slug}}/static/css/project.css delete mode 100644 template/backend/{{copier__project_slug}}/static/fonts/.gitkeep delete mode 100644 template/backend/{{copier__project_slug}}/static/images/favicons/favicon.ico delete mode 100644 template/backend/{{copier__project_slug}}/static/js/project.js delete mode 100644 template/backend/{{copier__project_slug}}/static/sass/project.scss delete mode 100644 template/backend/{{copier__project_slug}}/templates/403.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/404.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/500.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/account_inactive.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/base.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/email.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/email_confirm.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/login.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/logout.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/password_change.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/password_reset.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/password_reset_done.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/password_reset_from_key.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/password_reset_from_key_done.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/password_set.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/signup.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/signup_closed.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/verification_sent.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/account/verified_email_required.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/base.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/pages/about.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/pages/home.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/users/user_detail.html delete mode 100644 template/backend/{{copier__project_slug}}/templates/users/user_form.html delete mode 100644 template/backend/{{copier__project_slug}}/users/__init__.py delete mode 100644 template/backend/{{copier__project_slug}}/users/adapters.py delete mode 100644 template/backend/{{copier__project_slug}}/users/admin.py delete mode 100644 template/backend/{{copier__project_slug}}/users/apps.py delete mode 100644 template/backend/{{copier__project_slug}}/users/forms.py delete mode 100644 template/backend/{{copier__project_slug}}/users/migrations/0001_initial.py delete mode 100644 template/backend/{{copier__project_slug}}/users/migrations/__init__.py delete mode 100644 template/backend/{{copier__project_slug}}/users/models.py delete mode 100644 template/backend/{{copier__project_slug}}/users/mutations.py delete mode 100644 template/backend/{{copier__project_slug}}/users/queries.py delete mode 100644 template/backend/{{copier__project_slug}}/users/tasks.py delete mode 100644 template/backend/{{copier__project_slug}}/users/tests/__init__.py delete mode 100644 template/backend/{{copier__project_slug}}/users/tests/factories.py delete mode 100644 template/backend/{{copier__project_slug}}/users/tests/test_forms.py delete mode 100644 template/backend/{{copier__project_slug}}/users/tests/test_graphql_views.py delete mode 100644 template/backend/{{copier__project_slug}}/users/tests/test_models.py delete mode 100644 template/backend/{{copier__project_slug}}/users/tests/test_tasks.py delete mode 100644 template/backend/{{copier__project_slug}}/users/tests/test_urls.py delete mode 100644 template/backend/{{copier__project_slug}}/users/tests/test_views.py delete mode 100644 template/backend/{{copier__project_slug}}/users/types.py delete mode 100644 template/backend/{{copier__project_slug}}/users/urls.py delete mode 100644 template/backend/{{copier__project_slug}}/users/views.py delete mode 100644 template/backend/{{copier__project_slug}}/utils/__init__.py delete mode 100644 template/backend/{{copier__project_slug}}/utils/cloud_storage.py delete mode 100644 template/backend/{{copier__project_slug}}/utils/context_processors.py delete mode 100644 template/backend/{{copier__project_slug}}/utils/debugger.py delete mode 100644 template/backend/{{copier__project_slug}}/utils/healthcheck.py delete mode 100644 template/bitbucket-pipelines.yml delete mode 100644 template/bootstrap-cluster/argocd.yaml delete mode 100644 template/bootstrap-cluster/k3s.yaml delete mode 100644 template/bootstrap-cluster/root-app.template.yaml delete mode 100644 template/docs/dataflow.md delete mode 100644 template/docs/debug.md delete mode 100644 template/docs/development.md delete mode 100644 template/docs/monitoring.md delete mode 100644 template/docs/qa.md delete mode 100644 template/docs/sentry.md delete mode 100644 template/frontend/.dockerignore delete mode 100644 template/frontend/.env.local.example delete mode 100644 template/frontend/.gitignore delete mode 100644 template/frontend/.husky/pre-push delete mode 100644 template/frontend/.prettierignore delete mode 100644 template/frontend/.prettierrc delete mode 100644 template/frontend/Dockerfile delete mode 100644 template/frontend/README.md delete mode 100644 template/frontend/__generated__/fragment-masking.ts delete mode 100644 template/frontend/__generated__/gql.ts delete mode 100644 template/frontend/__generated__/graphql.ts delete mode 100644 template/frontend/__generated__/index.ts delete mode 100644 template/frontend/__tests__/about.test.tsx delete mode 100644 template/frontend/codegen.ts delete mode 100644 template/frontend/components/ErrorBoundary.tsx delete mode 100644 template/frontend/components/Footer.tsx delete mode 100644 template/frontend/components/Layout.tsx delete mode 100644 template/frontend/components/NavBar.tsx delete mode 100644 template/frontend/dependencies-dev-init.txt delete mode 100644 template/frontend/dependencies-init.txt delete mode 100644 template/frontend/eslint.config.mjs delete mode 100644 template/frontend/lib/apolloClient.ts delete mode 100644 template/frontend/next.config.mjs delete mode 100644 template/frontend/package.json delete mode 100644 template/frontend/pages/404.tsx delete mode 100644 template/frontend/pages/500.tsx delete mode 100644 template/frontend/pages/_app.tsx delete mode 100644 template/frontend/pages/_document.tsx delete mode 100644 template/frontend/pages/about.tsx delete mode 100644 template/frontend/pages/api/hello.ts delete mode 100644 template/frontend/pages/index.tsx delete mode 100644 template/frontend/postcss.config.mjs delete mode 100644 template/frontend/public/favicon.ico delete mode 100644 template/frontend/public/scaf-logo.png delete mode 100644 template/frontend/styles/globals.css delete mode 100644 template/frontend/tsconfig.json delete mode 100644 template/frontend/utils/test-utils.tsx delete mode 100644 template/frontend/vitest.config.ts delete mode 100644 template/frontend/vitest.setup.ts delete mode 100644 template/k8s/_monitoring/django-logs-table.yaml delete mode 100644 template/k8s/_monitoring/loki-stack-values.yaml delete mode 100644 template/k8s/argocd/README.md delete mode 100644 template/k8s/base/app.configmap.yaml delete mode 100644 template/k8s/base/celery.yaml delete mode 100644 template/k8s/base/django.yaml delete mode 100644 template/k8s/base/flower.yaml delete mode 100644 template/k8s/base/frontend.yaml delete mode 100644 template/k8s/base/ingress.yaml delete mode 100644 template/k8s/base/kustomization.yaml delete mode 100644 template/k8s/base/pod-disruption-budgets.yaml delete mode 100644 template/k8s/base/pod-priority.yaml delete mode 100644 template/k8s/base/redis.yaml delete mode 100644 template/k8s/local/kustomization.yaml delete mode 100644 template/k8s/local/postgres.yaml delete mode 100644 template/k8s/local/secrets.yaml delete mode 100644 template/k8s/mailhog/kustomization.yaml delete mode 100644 template/k8s/mailhog/mailhog.yaml delete mode 100644 template/k8s/prod/kustomization.yaml delete mode 100644 template/k8s/sandbox/certificate.yaml delete mode 100644 template/k8s/sandbox/ingress-route.yaml delete mode 100644 template/k8s/sandbox/kustomization.yaml delete mode 100644 template/k8s/sandbox/postgres.cnpg.yaml delete mode 100644 template/k8s/templates/secrets.yaml.template delete mode 100644 template/terraform/modules/base/ecr.tf delete mode 100644 template/terraform/modules/base/github-iam-role.tf diff --git a/.github/README.md b/.github/README.md deleted file mode 100644 index a4e3244..0000000 --- a/.github/README.md +++ /dev/null @@ -1,55 +0,0 @@ -

- -

- -**scaf fullstack template** provides developers and DevOps engineers with a -complete blueprint for a new project and streamlines the development experience -with Tilt. - -**scaf fullstack template** generates a new project structure with Kubernetes -manifests in three Kustomize layers for dev, sandbox, and production. A new -project contains the following: - -- Django backend -- Celery (optional) -- Next.js frontend (optional) - - Strawberry GraphQL (if frontend is chosen) - - Apollo Client (if frontend is chosen) - - _TODO: REST alternative to GraphQL_ -- Postgres database for local development -- CloudNativePG deployment for production -- Redis -- Mailhog -- ArgoCD -- Traefik -- Certmanger -- Certificates and Ingress Routes -- Kube Prometheus Stack -- Grafana Loki -- GitHub pipelines to build and push images, run security, formatting and - linting checks -- Terraform config to set up a k3s or Talos cluster on AWS -- Sentry (optional) - -## Installation - -To create a new project using this template, you first need to install `scaf`: - -``` -curl -sSL https://raw.githubusercontent.com/sixfeetup/scaf/main/install.sh | bash -``` - -The installation script will install kubectl, kind, and Tilt if it can't -be found on your system. - -## Creating a new project using this template - -NB: Before you continue, make sure that you have at least 5 to 10 GB of free -space available to Docker. Note that Docker Desktop on MacOS has its own -resource limits separate from the host. - -Run `scaf myproject https://github.com/getscaf/scaf-talos-template.git`, -answer all the questions, and you'll have your new project! - -Inside `myproject/README.md`, you will have more documentation explaining how to -use and configure your newly created project. diff --git a/.github/workflows/test-template.yaml b/.github/workflows/test-template.yaml deleted file mode 100644 index 9fa05bc..0000000 --- a/.github/workflows/test-template.yaml +++ /dev/null @@ -1,129 +0,0 @@ -name: Test template - -on: - pull_request: - schedule: - # Run daily at 2 AM UTC - - cron: '0 2 * * *' - workflow_dispatch: # Allow manual triggering - -jobs: - test-template: - runs-on: ubuntu-latest - environment: dev - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 'lts/*' - cache: 'npm' - cache-dependency-path: 'template/frontend/package*.json' - - - name: Install kind - shell: bash - run: | - curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64 - chmod +x ./kind - sudo mv ./kind /usr/local/bin/kind - - - name: Install Python dependencies - shell: bash - run: | - pip install copier black isort - - - name: Configure Git - shell: bash - run: | - git config --global user.email "test@example.com" - git config --global user.name "Template Test" - - - name: Test Template - shell: bash - env: - VCS_REF: ${{ github.head_ref || github.ref_name || github.sha }} - run: | - echo "Installing template from ${VCS_REF}" - copier copy \ - --trust \ - --defaults \ - --vcs-ref=${VCS_REF} \ - https://github.com/getscaf/scaf-talos-template.git test-project - - - name: Run lint and formatting checks - shell: bash - run: | - cd test-project - make check-lint-and-formatting - - - name: Run frontend lint and tests - shell: bash - run: | - cd test-project - make check-lint-and-test-frontend - - - name: Install Tilt - shell: bash - run: | - curl -fsSL https://raw.githubusercontent.com/tilt-dev/tilt/master/scripts/install.sh | bash - tilt version - - - name: Run Tilt CI - shell: bash - run: | - set -euo pipefail - cd test-project - tilt ci - - - name: Notify Slack on Success - if: success() && github.event_name == 'schedule' - uses: slackapi/slack-github-action@v2.1.1 - with: - webhook: ${{ secrets.SLACK_WEBHOOK_URL }} - webhook-type: incoming-webhook - payload: | - text: "Daily template test completed successfully! ✅" - blocks: - - type: "section" - text: - type: "mrkdwn" - text: "Daily template test completed successfully! ✅" - - type: "section" - fields: - - type: "mrkdwn" - text: "*Repository*: ${{ github.repository }}" - - type: "mrkdwn" - text: > - *Run Details*: - <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Logs> - - - name: Notify Slack on Failure - if: failure() && github.event_name == 'schedule' - uses: slackapi/slack-github-action@v2.1.1 - with: - webhook: ${{ secrets.SLACK_WEBHOOK_URL }} - webhook-type: incoming-webhook - payload: | - text: "Daily template test failed! ❌" - blocks: - - type: "section" - text: - type: "mrkdwn" - text: "Daily template test failed! ❌" - - type: "section" - text: - type: "mrkdwn" - text: "Please check the workflow logs for more information." - - type: "section" - fields: - - type: "mrkdwn" - text: "*Repository*: ${{ github.repository }}" - - type: "mrkdwn" - text: > - *Run Details*: - <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Logs> diff --git a/README.md b/README.md new file mode 100644 index 0000000..4320491 --- /dev/null +++ b/README.md @@ -0,0 +1,130 @@ +

+ +

+ +**scaf-talos-template** provides DevOps engineers and infrastructure teams with a complete blueprint for deploying production-ready Talos Linux Kubernetes clusters on AWS. + +This template generates infrastructure-as-code for a secure, immutable Kubernetes cluster using Talos Linux. A new project contains the following: + +- **Talos Linux v1.12.1** - Immutable, secure Kubernetes OS +- **Terraform/OpenTofu** - Infrastructure provisioning for AWS +- **AWS Infrastructure** - VPC, EC2, security groups, load balancers, Route53 +- **Multi-Environment Support** - Sandbox, staging, and production configurations +- **Bootstrap Scripts** - Automated Talos cluster initialization +- **GitHub Actions** - Infrastructure validation and security scanning +- **Comprehensive Documentation** - Deployment guides and architecture diagrams + +## What is Talos Linux? + +Talos Linux is a modern, minimal Linux distribution designed specifically for running Kubernetes: + +- **Immutable** - No SSH access, configuration via API only +- **Secure** - Minimal attack surface, all management via encrypted API +- **Kubernetes-Native** - Built exclusively for Kubernetes workloads +- **API-Driven** - All operations performed via declarative configuration + +## Installation + +To create a new project using this template, you first need to install `scaf`: + +```bash +curl -sSL https://raw.githubusercontent.com/sixfeetup/scaf/main/install.sh | bash +``` + +## Creating a new project using this template + +Run the following command to create a new project: + +```bash +# If you have the template checked out locally: +scaf myproject ./scaf-talos-template + +# Or use the GitHub URL directly: +scaf myproject https://github.com/getscaf/scaf-talos-template.git +``` + +Answer all the questions, and you'll have your new Talos cluster infrastructure project! + +After creating the project, you need to bootstrap the infrastructure. + +First, make sure you're logged in to AWS: + +```bash +export AWS_PROFILE=profile && aws sso login +``` + +Then proceed with the infrastructure setup: + +```bash +# 1. Create the S3 backend for Terraform state +cd myproject/terraform/bootstrap +tofu init && tofu plan -out=tfplan.out && tofu apply tfplan.out + +# 2. Deploy the infrastructure - sandbox environment +cd ../sandbox +tofu init && tofu plan -out=tfplan.out && tofu apply tfplan.out + +# 3. Bootstrap Talos cluster +cd ../../bootstrap-cluster +export ENV=sandbox +task talos:bootstrap + +# 4. Access your cluster +eval $(task talos:kubeconfig) +kubectl get nodes +``` + +**Note:** The sandbox environment creates a **1-node cluster** for development and testing. For staging and production environments with **3-node clusters**, use: + +```bash +# Deploy staging (3 nodes) +cd terraform/staging +tofu init && tofu plan -out=tfplan.out && tofu apply tfplan.out +cd ../../bootstrap-cluster +export ENV=staging +task talos:bootstrap + +# Deploy production (3 nodes) +cd ../terraform/production +tofu init && tofu plan -out=tfplan.out && tofu apply tfplan.out +cd ../../bootstrap-cluster +export ENV=production +task talos:bootstrap +``` + +Inside `myproject/docs/`, you will find comprehensive documentation for: +- Deploying infrastructure to AWS +- Bootstrapping the Talos cluster +- Managing cluster credentials +- Architecture diagrams + +## Requirements + +- AWS account with appropriate credentials +- Terraform/OpenTofu (v1.6+) +- talosctl CLI +- kubectl CLI +- Task runner + +See the generated documentation for detailed prerequisites. + +## Removing an Environment + +To completely remove an environment and all its resources: + + +```bash +# 1. Destroy the infrastructure +cd myproject/terraform/sandbox # or staging, production +tofu destroy + +# 2. Clean up local configuration files +cd ../../bootstrap-cluster/sandbox # or staging, production +rm -f talosconfig kubeconfig controlplane.yaml + +# 3. (Optional) Remove secrets from AWS Secrets Manager +aws secretsmanager delete-secret --secret-id sandbox_talosconfig_yaml --force-delete-without-recovery +aws secretsmanager delete-secret --secret-id sandbox_kubeconfig_yaml --force-delete-without-recovery +``` + +For complete removal instructions, including how to destroy the S3 backend, see the [Deployment Documentation](myproject/docs/deployment.md). diff --git a/copier.yml b/copier.yml index a614cbb..0988929 100644 --- a/copier.yml +++ b/copier.yml @@ -132,33 +132,3 @@ copier__aws_account_id: "AWS account ID cannot be empty." {% endif %} -copier__operating_system: - type: str - default: "talos" - choices: - talos: "talos" - help: "Deploy Kubernetes on Talos Linux?" - -copier__repo_url: - type: str - default: "git@github.com:organization_name/{{ copier__project_slug }}.git" - help: "The URL of the repository." - validator: >- - {% if not copier__repo_url.startswith("git@") or not ":" in copier__repo_url or not "/" in copier__repo_url.split(":")[1] or not ".git" in copier__repo_url %} - Value must follow the format git@provider:orgname/repo.git - {% endif %} - -copier__source_control_provider: - type: str - when: false - default: "{{ copier__repo_url.split('@')[1].split(':')[0] }}" - -copier__source_control_organization_slug: - type: str - when: false - default: "{{ copier__repo_url.split(':')[1].split('/')[0] }}" - -copier__repo_name: - type: str - when: false - default: "{{ copier__repo_url.split(':')[1].split('/')[1].replace('.git', '') }}" diff --git a/issues.md b/issues.md deleted file mode 100644 index 919cfc6..0000000 --- a/issues.md +++ /dev/null @@ -1,54 +0,0 @@ -# issue log -1. after `./scaf