cfsa-antigravity 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.mjs +324 -0
- package/package.json +34 -0
- package/template/.agent/instructions/commands.md +48 -0
- package/template/.agent/instructions/patterns.md +61 -0
- package/template/.agent/instructions/structure.md +29 -0
- package/template/.agent/instructions/tech-stack.md +43 -0
- package/template/.agent/instructions/workflow.md +41 -0
- package/template/.agent/kit-sync.md +15 -0
- package/template/.agent/rules/boundary-not-placeholder.md +146 -0
- package/template/.agent/rules/completion-checklist.md +48 -0
- package/template/.agent/rules/decision-classification.md +103 -0
- package/template/.agent/rules/extensibility.md +47 -0
- package/template/.agent/rules/question-vs-command.md +81 -0
- package/template/.agent/rules/security-first.md +43 -0
- package/template/.agent/rules/specificity-standards.md +54 -0
- package/template/.agent/rules/tdd-contract-first.md +57 -0
- package/template/.agent/rules/vertical-slices.md +42 -0
- package/template/.agent/skill-library/MANIFEST.md +480 -0
- package/template/.agent/skill-library/README.md +38 -0
- package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
- package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
- package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
- package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
- package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
- package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
- package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
- package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
- package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
- package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
- package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
- package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
- package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
- package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
- package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
- package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
- package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
- package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
- package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
- package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
- package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
- package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
- package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
- package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
- package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
- package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
- package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
- package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
- package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
- package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
- package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
- package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
- package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
- package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
- package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
- package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
- package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
- package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
- package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
- package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
- package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
- package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
- package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
- package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
- package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
- package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
- package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
- package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
- package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
- package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
- package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
- package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
- package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
- package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
- package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
- package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
- package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
- package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
- package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
- package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
- package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
- package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
- package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
- package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
- package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
- package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
- package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
- package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
- package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
- package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
- package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
- package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
- package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
- package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
- package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
- package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
- package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
- package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
- package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
- package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
- package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
- package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
- package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
- package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
- package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
- package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
- package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
- package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
- package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
- package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
- package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
- package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
- package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
- package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
- package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
- package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
- package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
- package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
- package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
- package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
- package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
- package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
- package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
- package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
- package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
- package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
- package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
- package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
- package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
- package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
- package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
- package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
- package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
- package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
- package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
- package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
- package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
- package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
- package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
- package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
- package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
- package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
- package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
- package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
- package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
- package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
- package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
- package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
- package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
- package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
- package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
- package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
- package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
- package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
- package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
- package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
- package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
- package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
- package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
- package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
- package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
- package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
- package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
- package/template/.agent/skills/accessibility/SKILL.md +522 -0
- package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
- package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
- package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
- package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
- package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
- package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/template/.agent/skills/api-versioning/SKILL.md +420 -0
- package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
- package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
- package/template/.agent/skills/brainstorming/SKILL.md +236 -0
- package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
- package/template/.agent/skills/clean-code/SKILL.md +94 -0
- package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
- package/template/.agent/skills/concise-planning/SKILL.md +68 -0
- package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
- package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
- package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
- package/template/.agent/skills/design-direction/SKILL.md +45 -0
- package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
- package/template/.agent/skills/find-skills/SKILL.md +145 -0
- package/template/.agent/skills/git-advanced/SKILL.md +972 -0
- package/template/.agent/skills/git-workflow/SKILL.md +420 -0
- package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
- package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
- package/template/.agent/skills/migration-management/SKILL.md +384 -0
- package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
- package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
- package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
- package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
- package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
- package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
- package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
- package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
- package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
- package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
- package/template/.agent/skills/prd-templates/SKILL.md +88 -0
- package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
- package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
- package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
- package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
- package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
- package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
- package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
- package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
- package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
- package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
- package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
- package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
- package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
- package/template/.agent/skills/prompt-engineer/README.md +659 -0
- package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
- package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
- package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
- package/template/.agent/skills/session-continuity/SKILL.md +730 -0
- package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
- package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
- package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
- package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
- package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
- package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
- package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
- package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
- package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
- package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
- package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
- package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agent/skills/skill-creator/README.md +270 -0
- package/template/.agent/skills/skill-creator/SKILL.md +590 -0
- package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
- package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
- package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
- package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
- package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/template/.agent/skills/spec-writing/SKILL.md +110 -0
- package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
- package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
- package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
- package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
- package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
- package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
- package/template/.agent/skills/technical-writer/SKILL.md +242 -0
- package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
- package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
- package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
- package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
- package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
- package/template/.agent/workflows/audit-ambiguity.md +64 -0
- package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
- package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
- package/template/.agent/workflows/bootstrap-agents.md +66 -0
- package/template/.agent/workflows/create-prd-architecture.md +119 -0
- package/template/.agent/workflows/create-prd-compile.md +138 -0
- package/template/.agent/workflows/create-prd-design-system.md +135 -0
- package/template/.agent/workflows/create-prd-security.md +113 -0
- package/template/.agent/workflows/create-prd-stack.md +91 -0
- package/template/.agent/workflows/create-prd.md +168 -0
- package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
- package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
- package/template/.agent/workflows/decompose-architecture.md +111 -0
- package/template/.agent/workflows/evolve-contract.md +98 -0
- package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
- package/template/.agent/workflows/evolve-feature-classify.md +116 -0
- package/template/.agent/workflows/evolve-feature.md +56 -0
- package/template/.agent/workflows/ideate-discover.md +144 -0
- package/template/.agent/workflows/ideate-extract.md +129 -0
- package/template/.agent/workflows/ideate-validate.md +117 -0
- package/template/.agent/workflows/ideate.md +113 -0
- package/template/.agent/workflows/implement-slice-setup.md +113 -0
- package/template/.agent/workflows/implement-slice-tdd.md +198 -0
- package/template/.agent/workflows/implement-slice.md +50 -0
- package/template/.agent/workflows/plan-phase.md +202 -0
- package/template/.agent/workflows/propagate-decision-apply.md +135 -0
- package/template/.agent/workflows/propagate-decision-scan.md +147 -0
- package/template/.agent/workflows/propagate-decision.md +56 -0
- package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
- package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
- package/template/.agent/workflows/remediate-pipeline.md +55 -0
- package/template/.agent/workflows/resolve-ambiguity.md +82 -0
- package/template/.agent/workflows/sync-kit.md +209 -0
- package/template/.agent/workflows/update-architecture-map.md +74 -0
- package/template/.agent/workflows/validate-phase.md +219 -0
- package/template/.agent/workflows/verify-infrastructure.md +207 -0
- package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
- package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
- package/template/.agent/workflows/write-architecture-spec.md +63 -0
- package/template/.agent/workflows/write-be-spec-classify.md +165 -0
- package/template/.agent/workflows/write-be-spec-write.md +98 -0
- package/template/.agent/workflows/write-be-spec.md +76 -0
- package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
- package/template/.agent/workflows/write-fe-spec-write.md +94 -0
- package/template/.agent/workflows/write-fe-spec.md +71 -0
- package/template/AGENTS.md +176 -0
- package/template/GEMINI.md +177 -0
- package/template/docs/README.md +187 -0
- package/template/docs/audits/.gitkeep +0 -0
- package/template/docs/audits/README.md +10 -0
- package/template/docs/plans/.gitkeep +0 -0
- package/template/docs/plans/README.md +21 -0
- package/template/docs/plans/be/.gitkeep +0 -0
- package/template/docs/plans/be/README.md +11 -0
- package/template/docs/plans/fe/.gitkeep +0 -0
- package/template/docs/plans/fe/README.md +11 -0
- package/template/docs/plans/ia/.gitkeep +0 -0
- package/template/docs/plans/ia/README.md +17 -0
- package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
- package/template/docs/plans/ia/deep-dives/README.md +5 -0
- package/template/docs/plans/phases/.gitkeep +0 -0
- package/template/docs/plans/phases/README.md +11 -0
|
@@ -0,0 +1,841 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nginx
|
|
3
|
+
description: "Comprehensive Nginx configuration guide covering server blocks, location matching, reverse proxy, SSL/TLS, load balancing, caching, compression, rate limiting, security headers, access control, logging, HTTP/2 and HTTP/3, rewrites, try_files, API gateway patterns, and performance tuning. Use when configuring Nginx as a web server, reverse proxy, load balancer, or API gateway."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Nginx
|
|
8
|
+
|
|
9
|
+
## 1. Philosophy
|
|
10
|
+
|
|
11
|
+
Nginx is an **event-driven, non-blocking web server** that excels at serving static content, reverse proxying, load balancing, and acting as an API gateway. Its configuration is declarative -- you describe the desired behavior, and Nginx handles the event loop.
|
|
12
|
+
|
|
13
|
+
**Key principles**:
|
|
14
|
+
- Configuration is hierarchical. Directives inherit from outer blocks to inner blocks.
|
|
15
|
+
- Location matching has specific precedence rules. Know them or debug endlessly.
|
|
16
|
+
- Upstream blocks handle backend pools. Never hardcode backend addresses in location blocks.
|
|
17
|
+
- Security headers are not optional. Every response must include them.
|
|
18
|
+
- Test before reload. Always run `nginx -t` before applying configuration changes.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 2. Server Blocks (Virtual Hosts)
|
|
23
|
+
|
|
24
|
+
### Basic Server Block
|
|
25
|
+
|
|
26
|
+
```nginx
|
|
27
|
+
server {
|
|
28
|
+
listen 80;
|
|
29
|
+
listen [::]:80;
|
|
30
|
+
server_name example.com www.example.com;
|
|
31
|
+
|
|
32
|
+
# Redirect HTTP to HTTPS
|
|
33
|
+
return 301 https://$host$request_uri;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
server {
|
|
37
|
+
listen 443 ssl http2;
|
|
38
|
+
listen [::]:443 ssl http2;
|
|
39
|
+
server_name example.com www.example.com;
|
|
40
|
+
|
|
41
|
+
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
|
|
42
|
+
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
|
|
43
|
+
|
|
44
|
+
root /var/www/example.com/public;
|
|
45
|
+
index index.html;
|
|
46
|
+
|
|
47
|
+
location / {
|
|
48
|
+
try_files $uri $uri/ =404;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Multiple Domains
|
|
54
|
+
|
|
55
|
+
```nginx
|
|
56
|
+
# Catch-all for undefined domains
|
|
57
|
+
server {
|
|
58
|
+
listen 80 default_server;
|
|
59
|
+
server_name _;
|
|
60
|
+
return 444; # Close connection without response
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
# Application domain
|
|
64
|
+
server {
|
|
65
|
+
listen 80;
|
|
66
|
+
server_name app.example.com;
|
|
67
|
+
# ...
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# API domain
|
|
71
|
+
server {
|
|
72
|
+
listen 80;
|
|
73
|
+
server_name api.example.com;
|
|
74
|
+
# ...
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 3. Location Matching
|
|
81
|
+
|
|
82
|
+
Nginx processes location blocks in a specific precedence order. Understanding this order prevents subtle routing bugs.
|
|
83
|
+
|
|
84
|
+
### Matching Precedence (Highest to Lowest)
|
|
85
|
+
|
|
86
|
+
```nginx
|
|
87
|
+
# 1. Exact match (highest priority)
|
|
88
|
+
location = /health {
|
|
89
|
+
return 200 "OK";
|
|
90
|
+
add_header Content-Type text/plain;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# 2. Preferential prefix match (stops searching)
|
|
94
|
+
location ^~ /static/ {
|
|
95
|
+
root /var/www;
|
|
96
|
+
expires 30d;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
# 3. Regular expression match (first match wins, case-sensitive)
|
|
100
|
+
location ~ \.php$ {
|
|
101
|
+
fastcgi_pass unix:/run/php/php-fpm.sock;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
# 4. Regular expression match (case-insensitive)
|
|
105
|
+
location ~* \.(jpg|jpeg|png|gif|ico|svg|webp)$ {
|
|
106
|
+
expires 365d;
|
|
107
|
+
add_header Cache-Control "public, immutable";
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
# 5. Prefix match (longest match wins)
|
|
111
|
+
location /api/ {
|
|
112
|
+
proxy_pass http://backend;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
# 6. Default prefix match
|
|
116
|
+
location / {
|
|
117
|
+
try_files $uri $uri/ /index.html;
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Common Mistake
|
|
122
|
+
|
|
123
|
+
```nginx
|
|
124
|
+
# BAD: regex location takes precedence over prefix
|
|
125
|
+
location /api/ {
|
|
126
|
+
proxy_pass http://backend;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
location ~ ^/api/internal {
|
|
130
|
+
return 403; # This OVERRIDES the /api/ prefix above
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
# GOOD: Use ^~ to prevent regex override
|
|
134
|
+
location ^~ /api/internal {
|
|
135
|
+
return 403;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
location /api/ {
|
|
139
|
+
proxy_pass http://backend;
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 4. Reverse Proxy
|
|
146
|
+
|
|
147
|
+
### Basic Proxy
|
|
148
|
+
|
|
149
|
+
```nginx
|
|
150
|
+
upstream backend {
|
|
151
|
+
server 127.0.0.1:3000;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
server {
|
|
155
|
+
listen 80;
|
|
156
|
+
server_name app.example.com;
|
|
157
|
+
|
|
158
|
+
location / {
|
|
159
|
+
proxy_pass http://backend;
|
|
160
|
+
|
|
161
|
+
# Pass original client information
|
|
162
|
+
proxy_set_header Host $host;
|
|
163
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
164
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
165
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
166
|
+
|
|
167
|
+
# Timeouts
|
|
168
|
+
proxy_connect_timeout 5s;
|
|
169
|
+
proxy_send_timeout 30s;
|
|
170
|
+
proxy_read_timeout 30s;
|
|
171
|
+
|
|
172
|
+
# Buffering
|
|
173
|
+
proxy_buffering on;
|
|
174
|
+
proxy_buffer_size 4k;
|
|
175
|
+
proxy_buffers 8 4k;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### WebSocket Proxy
|
|
181
|
+
|
|
182
|
+
```nginx
|
|
183
|
+
location /ws {
|
|
184
|
+
proxy_pass http://backend;
|
|
185
|
+
proxy_http_version 1.1;
|
|
186
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
187
|
+
proxy_set_header Connection "upgrade";
|
|
188
|
+
proxy_set_header Host $host;
|
|
189
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
190
|
+
|
|
191
|
+
# Prevent WebSocket timeout
|
|
192
|
+
proxy_read_timeout 86400s;
|
|
193
|
+
proxy_send_timeout 86400s;
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Trailing Slash Behavior
|
|
198
|
+
|
|
199
|
+
```nginx
|
|
200
|
+
# With trailing slash: /api/ -> http://backend/
|
|
201
|
+
# Strips the matched prefix
|
|
202
|
+
location /api/ {
|
|
203
|
+
proxy_pass http://backend/;
|
|
204
|
+
}
|
|
205
|
+
# Request: /api/users -> proxied as /users
|
|
206
|
+
|
|
207
|
+
# Without trailing slash: /api/ -> http://backend/api/
|
|
208
|
+
# Preserves the full URI
|
|
209
|
+
location /api/ {
|
|
210
|
+
proxy_pass http://backend;
|
|
211
|
+
}
|
|
212
|
+
# Request: /api/users -> proxied as /api/users
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 5. SSL/TLS
|
|
218
|
+
|
|
219
|
+
### Modern TLS Configuration
|
|
220
|
+
|
|
221
|
+
```nginx
|
|
222
|
+
server {
|
|
223
|
+
listen 443 ssl http2;
|
|
224
|
+
server_name example.com;
|
|
225
|
+
|
|
226
|
+
# Certificates
|
|
227
|
+
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
|
|
228
|
+
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
|
|
229
|
+
|
|
230
|
+
# Protocol versions -- TLS 1.2 and 1.3 only
|
|
231
|
+
ssl_protocols TLSv1.2 TLSv1.3;
|
|
232
|
+
|
|
233
|
+
# Cipher suites
|
|
234
|
+
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
|
|
235
|
+
ssl_prefer_server_ciphers off;
|
|
236
|
+
|
|
237
|
+
# OCSP Stapling -- faster TLS handshake
|
|
238
|
+
ssl_stapling on;
|
|
239
|
+
ssl_stapling_verify on;
|
|
240
|
+
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
|
|
241
|
+
resolver 1.1.1.1 8.8.8.8 valid=300s;
|
|
242
|
+
resolver_timeout 5s;
|
|
243
|
+
|
|
244
|
+
# Session caching
|
|
245
|
+
ssl_session_cache shared:SSL:10m;
|
|
246
|
+
ssl_session_timeout 1d;
|
|
247
|
+
ssl_session_tickets off;
|
|
248
|
+
|
|
249
|
+
# HSTS -- force HTTPS for 2 years
|
|
250
|
+
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Let's Encrypt with Certbot
|
|
255
|
+
|
|
256
|
+
```nginx
|
|
257
|
+
# HTTP challenge location
|
|
258
|
+
server {
|
|
259
|
+
listen 80;
|
|
260
|
+
server_name example.com;
|
|
261
|
+
|
|
262
|
+
location /.well-known/acme-challenge/ {
|
|
263
|
+
root /var/www/certbot;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
location / {
|
|
267
|
+
return 301 https://$host$request_uri;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
# Obtain certificate
|
|
274
|
+
certbot certonly --webroot -w /var/www/certbot -d example.com -d www.example.com
|
|
275
|
+
|
|
276
|
+
# Auto-renewal (certbot installs a timer/cron by default)
|
|
277
|
+
certbot renew --dry-run
|
|
278
|
+
|
|
279
|
+
# Reload nginx after renewal
|
|
280
|
+
certbot renew --deploy-hook "systemctl reload nginx"
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## 6. Load Balancing
|
|
286
|
+
|
|
287
|
+
### Upstream Configuration
|
|
288
|
+
|
|
289
|
+
```nginx
|
|
290
|
+
upstream api_servers {
|
|
291
|
+
# Round-robin (default)
|
|
292
|
+
server 10.0.0.1:3000;
|
|
293
|
+
server 10.0.0.2:3000;
|
|
294
|
+
server 10.0.0.3:3000;
|
|
295
|
+
|
|
296
|
+
# Backup server -- only used when all others are down
|
|
297
|
+
server 10.0.0.4:3000 backup;
|
|
298
|
+
|
|
299
|
+
# Mark a server as permanently down
|
|
300
|
+
server 10.0.0.5:3000 down;
|
|
301
|
+
|
|
302
|
+
# Keepalive connections to backends
|
|
303
|
+
keepalive 32;
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Load Balancing Algorithms
|
|
308
|
+
|
|
309
|
+
```nginx
|
|
310
|
+
# Least connections -- send to the server with fewest active connections
|
|
311
|
+
upstream api_servers {
|
|
312
|
+
least_conn;
|
|
313
|
+
server 10.0.0.1:3000;
|
|
314
|
+
server 10.0.0.2:3000;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
# IP hash -- same client always goes to the same server (sticky sessions)
|
|
318
|
+
upstream api_servers {
|
|
319
|
+
ip_hash;
|
|
320
|
+
server 10.0.0.1:3000;
|
|
321
|
+
server 10.0.0.2:3000;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
# Weighted -- distribute based on server capacity
|
|
325
|
+
upstream api_servers {
|
|
326
|
+
server 10.0.0.1:3000 weight=3; # Gets 3x the traffic
|
|
327
|
+
server 10.0.0.2:3000 weight=1;
|
|
328
|
+
}
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Health Checks (Nginx Plus or OpenResty)
|
|
332
|
+
|
|
333
|
+
```nginx
|
|
334
|
+
# Passive health checks (open-source Nginx)
|
|
335
|
+
upstream api_servers {
|
|
336
|
+
server 10.0.0.1:3000 max_fails=3 fail_timeout=30s;
|
|
337
|
+
server 10.0.0.2:3000 max_fails=3 fail_timeout=30s;
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## 7. Caching
|
|
344
|
+
|
|
345
|
+
### Proxy Cache
|
|
346
|
+
|
|
347
|
+
```nginx
|
|
348
|
+
# Define cache zone in http block
|
|
349
|
+
proxy_cache_path /var/cache/nginx/api
|
|
350
|
+
levels=1:2
|
|
351
|
+
keys_zone=api_cache:10m # 10MB for keys (approx 80,000 keys)
|
|
352
|
+
max_size=1g # 1GB on disk
|
|
353
|
+
inactive=60m # Remove items unused for 60 minutes
|
|
354
|
+
use_temp_path=off;
|
|
355
|
+
|
|
356
|
+
server {
|
|
357
|
+
location /api/ {
|
|
358
|
+
proxy_pass http://backend;
|
|
359
|
+
proxy_cache api_cache;
|
|
360
|
+
proxy_cache_valid 200 10m; # Cache 200 responses for 10 minutes
|
|
361
|
+
proxy_cache_valid 404 1m; # Cache 404 responses for 1 minute
|
|
362
|
+
proxy_cache_use_stale error timeout updating http_500 http_502 http_503;
|
|
363
|
+
proxy_cache_lock on; # Only one request populates the cache
|
|
364
|
+
proxy_cache_key "$scheme$request_method$host$request_uri";
|
|
365
|
+
|
|
366
|
+
add_header X-Cache-Status $upstream_cache_status;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Static File Caching
|
|
372
|
+
|
|
373
|
+
```nginx
|
|
374
|
+
location /static/ {
|
|
375
|
+
root /var/www;
|
|
376
|
+
expires 365d;
|
|
377
|
+
add_header Cache-Control "public, immutable";
|
|
378
|
+
access_log off;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
# Hashed filenames (e.g., app.abc123.js) -- cache forever
|
|
382
|
+
location ~* \.[a-f0-9]{8,}\.(js|css|png|jpg|svg|woff2)$ {
|
|
383
|
+
root /var/www;
|
|
384
|
+
expires max;
|
|
385
|
+
add_header Cache-Control "public, immutable";
|
|
386
|
+
access_log off;
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## 8. Compression
|
|
393
|
+
|
|
394
|
+
```nginx
|
|
395
|
+
# Enable gzip in http block
|
|
396
|
+
gzip on;
|
|
397
|
+
gzip_vary on;
|
|
398
|
+
gzip_proxied any;
|
|
399
|
+
gzip_comp_level 5; # 1-9, balance between CPU and compression ratio
|
|
400
|
+
gzip_min_length 256; # Do not compress tiny responses
|
|
401
|
+
gzip_types
|
|
402
|
+
text/plain
|
|
403
|
+
text/css
|
|
404
|
+
text/xml
|
|
405
|
+
text/javascript
|
|
406
|
+
application/javascript
|
|
407
|
+
application/json
|
|
408
|
+
application/xml
|
|
409
|
+
application/rss+xml
|
|
410
|
+
image/svg+xml;
|
|
411
|
+
|
|
412
|
+
# Brotli (requires ngx_brotli module)
|
|
413
|
+
brotli on;
|
|
414
|
+
brotli_comp_level 6;
|
|
415
|
+
brotli_types
|
|
416
|
+
text/plain
|
|
417
|
+
text/css
|
|
418
|
+
text/xml
|
|
419
|
+
text/javascript
|
|
420
|
+
application/javascript
|
|
421
|
+
application/json
|
|
422
|
+
application/xml
|
|
423
|
+
image/svg+xml;
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## 9. Rate Limiting
|
|
429
|
+
|
|
430
|
+
```nginx
|
|
431
|
+
# Define rate limit zones in http block
|
|
432
|
+
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
|
|
433
|
+
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;
|
|
434
|
+
|
|
435
|
+
server {
|
|
436
|
+
# API rate limiting -- allow burst of 20 with no delay for first 10
|
|
437
|
+
location /api/ {
|
|
438
|
+
limit_req zone=api_limit burst=20 nodelay;
|
|
439
|
+
limit_req_status 429;
|
|
440
|
+
proxy_pass http://backend;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
# Strict rate limiting on login endpoint
|
|
444
|
+
location /api/auth/login {
|
|
445
|
+
limit_req zone=login_limit burst=5;
|
|
446
|
+
limit_req_status 429;
|
|
447
|
+
proxy_pass http://backend;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Connection Limiting
|
|
453
|
+
|
|
454
|
+
```nginx
|
|
455
|
+
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
|
|
456
|
+
|
|
457
|
+
server {
|
|
458
|
+
location /downloads/ {
|
|
459
|
+
limit_conn conn_limit 5; # Max 5 concurrent connections per IP
|
|
460
|
+
limit_rate 500k; # Limit bandwidth to 500KB/s per connection
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
---
|
|
466
|
+
|
|
467
|
+
## 10. Security Headers
|
|
468
|
+
|
|
469
|
+
```nginx
|
|
470
|
+
# Add to every server block (or http block for global)
|
|
471
|
+
add_header X-Content-Type-Options "nosniff" always;
|
|
472
|
+
add_header X-Frame-Options "DENY" always;
|
|
473
|
+
add_header X-XSS-Protection "0" always;
|
|
474
|
+
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
|
475
|
+
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
|
|
476
|
+
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; connect-src 'self' https://api.example.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self';" always;
|
|
477
|
+
|
|
478
|
+
# HSTS (only on HTTPS server blocks)
|
|
479
|
+
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
## 11. Access Control
|
|
485
|
+
|
|
486
|
+
```nginx
|
|
487
|
+
# IP-based access control
|
|
488
|
+
location /admin/ {
|
|
489
|
+
allow 10.0.0.0/8;
|
|
490
|
+
allow 192.168.1.0/24;
|
|
491
|
+
deny all;
|
|
492
|
+
proxy_pass http://admin_backend;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
# Basic authentication
|
|
496
|
+
location /staging/ {
|
|
497
|
+
auth_basic "Staging Environment";
|
|
498
|
+
auth_basic_user_file /etc/nginx/.htpasswd;
|
|
499
|
+
proxy_pass http://staging_backend;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
# Block specific user agents
|
|
503
|
+
if ($http_user_agent ~* (bot|crawler|spider)) {
|
|
504
|
+
return 403;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
# Block access to hidden files
|
|
508
|
+
location ~ /\. {
|
|
509
|
+
deny all;
|
|
510
|
+
access_log off;
|
|
511
|
+
log_not_found off;
|
|
512
|
+
}
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
```bash
|
|
516
|
+
# Create htpasswd file
|
|
517
|
+
# Install: apt install apache2-utils
|
|
518
|
+
htpasswd -c /etc/nginx/.htpasswd admin
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
---
|
|
522
|
+
|
|
523
|
+
## 12. Logging
|
|
524
|
+
|
|
525
|
+
### Custom Log Formats
|
|
526
|
+
|
|
527
|
+
```nginx
|
|
528
|
+
# Define in http block
|
|
529
|
+
log_format main '$remote_addr - $remote_user [$time_local] '
|
|
530
|
+
'"$request" $status $body_bytes_sent '
|
|
531
|
+
'"$http_referer" "$http_user_agent"';
|
|
532
|
+
|
|
533
|
+
log_format json escape=json '{'
|
|
534
|
+
'"time": "$time_iso8601",'
|
|
535
|
+
'"remote_addr": "$remote_addr",'
|
|
536
|
+
'"request_method": "$request_method",'
|
|
537
|
+
'"request_uri": "$request_uri",'
|
|
538
|
+
'"status": $status,'
|
|
539
|
+
'"body_bytes_sent": $body_bytes_sent,'
|
|
540
|
+
'"request_time": $request_time,'
|
|
541
|
+
'"upstream_response_time": "$upstream_response_time",'
|
|
542
|
+
'"http_user_agent": "$http_user_agent",'
|
|
543
|
+
'"http_referer": "$http_referer"'
|
|
544
|
+
'}';
|
|
545
|
+
|
|
546
|
+
access_log /var/log/nginx/access.log json;
|
|
547
|
+
error_log /var/log/nginx/error.log warn;
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### Conditional Logging
|
|
551
|
+
|
|
552
|
+
```nginx
|
|
553
|
+
# Do not log health checks
|
|
554
|
+
map $request_uri $loggable {
|
|
555
|
+
~*^/health 0;
|
|
556
|
+
~*^/ready 0;
|
|
557
|
+
default 1;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
access_log /var/log/nginx/access.log main if=$loggable;
|
|
561
|
+
|
|
562
|
+
# Do not log static file access
|
|
563
|
+
location /static/ {
|
|
564
|
+
access_log off;
|
|
565
|
+
}
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
## 13. HTTP/2 and HTTP/3
|
|
571
|
+
|
|
572
|
+
```nginx
|
|
573
|
+
# HTTP/2 (widely supported)
|
|
574
|
+
server {
|
|
575
|
+
listen 443 ssl http2;
|
|
576
|
+
listen [::]:443 ssl http2;
|
|
577
|
+
# ...
|
|
578
|
+
|
|
579
|
+
# HTTP/2 push (deprecated in most browsers, avoid)
|
|
580
|
+
# Use 103 Early Hints instead
|
|
581
|
+
location / {
|
|
582
|
+
add_header Link "</style.css>; rel=preload; as=style";
|
|
583
|
+
proxy_pass http://backend;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
# HTTP/3 (QUIC -- requires Nginx 1.25+ with quic module)
|
|
588
|
+
server {
|
|
589
|
+
listen 443 ssl;
|
|
590
|
+
listen 443 quic reuseport;
|
|
591
|
+
|
|
592
|
+
http2 on;
|
|
593
|
+
http3 on;
|
|
594
|
+
|
|
595
|
+
# Advertise HTTP/3 support
|
|
596
|
+
add_header Alt-Svc 'h3=":443"; ma=86400' always;
|
|
597
|
+
|
|
598
|
+
ssl_certificate /etc/ssl/certs/example.com.crt;
|
|
599
|
+
ssl_certificate_key /etc/ssl/private/example.com.key;
|
|
600
|
+
|
|
601
|
+
# Required for QUIC
|
|
602
|
+
ssl_early_data on;
|
|
603
|
+
}
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
---
|
|
607
|
+
|
|
608
|
+
## 14. Rewrites and Redirects
|
|
609
|
+
|
|
610
|
+
```nginx
|
|
611
|
+
# Permanent redirect (301)
|
|
612
|
+
location /old-page {
|
|
613
|
+
return 301 /new-page;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
# Redirect with query string preservation
|
|
617
|
+
location /search {
|
|
618
|
+
return 301 /find$is_args$args;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
# Rewrite (internal -- URL changes but client does not see it)
|
|
622
|
+
rewrite ^/blog/(\d{4})/(\d{2})/(.+)$ /posts?year=$1&month=$2&slug=$3 last;
|
|
623
|
+
|
|
624
|
+
# Rewrite with redirect
|
|
625
|
+
rewrite ^/legacy/(.*)$ /modern/$1 permanent; # 301
|
|
626
|
+
rewrite ^/temp/(.*)$ /current/$1 redirect; # 302
|
|
627
|
+
|
|
628
|
+
# Canonical domain redirect
|
|
629
|
+
server {
|
|
630
|
+
listen 80;
|
|
631
|
+
server_name www.example.com;
|
|
632
|
+
return 301 https://example.com$request_uri;
|
|
633
|
+
}
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
---
|
|
637
|
+
|
|
638
|
+
## 15. try_files
|
|
639
|
+
|
|
640
|
+
```nginx
|
|
641
|
+
# Single Page Application (SPA) -- serve index.html for all routes
|
|
642
|
+
location / {
|
|
643
|
+
root /var/www/app;
|
|
644
|
+
try_files $uri $uri/ /index.html;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
# Static files first, then proxy to backend
|
|
648
|
+
location / {
|
|
649
|
+
root /var/www/public;
|
|
650
|
+
try_files $uri @backend;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
location @backend {
|
|
654
|
+
proxy_pass http://app_server;
|
|
655
|
+
proxy_set_header Host $host;
|
|
656
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
# Custom 404 page
|
|
660
|
+
location / {
|
|
661
|
+
root /var/www;
|
|
662
|
+
try_files $uri $uri/ =404;
|
|
663
|
+
error_page 404 /404.html;
|
|
664
|
+
}
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
---
|
|
668
|
+
|
|
669
|
+
## 16. Nginx as API Gateway
|
|
670
|
+
|
|
671
|
+
```nginx
|
|
672
|
+
# Rate limiting, authentication, and routing in one place
|
|
673
|
+
upstream auth_service {
|
|
674
|
+
server 127.0.0.1:4000;
|
|
675
|
+
keepalive 16;
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
upstream user_service {
|
|
679
|
+
server 127.0.0.1:4001;
|
|
680
|
+
keepalive 16;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
upstream order_service {
|
|
684
|
+
server 127.0.0.1:4002;
|
|
685
|
+
keepalive 16;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
server {
|
|
689
|
+
listen 443 ssl http2;
|
|
690
|
+
server_name api.example.com;
|
|
691
|
+
|
|
692
|
+
# Global rate limit
|
|
693
|
+
limit_req zone=api_limit burst=50 nodelay;
|
|
694
|
+
|
|
695
|
+
# CORS headers
|
|
696
|
+
add_header Access-Control-Allow-Origin "https://app.example.com" always;
|
|
697
|
+
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always;
|
|
698
|
+
add_header Access-Control-Allow-Headers "Authorization, Content-Type" always;
|
|
699
|
+
|
|
700
|
+
# Preflight requests
|
|
701
|
+
if ($request_method = OPTIONS) {
|
|
702
|
+
add_header Access-Control-Allow-Origin "https://app.example.com";
|
|
703
|
+
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
|
|
704
|
+
add_header Access-Control-Allow-Headers "Authorization, Content-Type";
|
|
705
|
+
add_header Access-Control-Max-Age 86400;
|
|
706
|
+
return 204;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
# Route to microservices
|
|
710
|
+
location /api/v1/auth/ {
|
|
711
|
+
proxy_pass http://auth_service/;
|
|
712
|
+
proxy_set_header Host $host;
|
|
713
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
location /api/v1/users/ {
|
|
717
|
+
proxy_pass http://user_service/;
|
|
718
|
+
proxy_set_header Host $host;
|
|
719
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
location /api/v1/orders/ {
|
|
723
|
+
proxy_pass http://order_service/;
|
|
724
|
+
proxy_set_header Host $host;
|
|
725
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
# Request size limit for file uploads
|
|
729
|
+
location /api/v1/uploads/ {
|
|
730
|
+
client_max_body_size 50m;
|
|
731
|
+
proxy_pass http://user_service/uploads/;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
---
|
|
737
|
+
|
|
738
|
+
## 17. Performance Tuning
|
|
739
|
+
|
|
740
|
+
```nginx
|
|
741
|
+
# nginx.conf -- main context
|
|
742
|
+
worker_processes auto; # One worker per CPU core
|
|
743
|
+
worker_rlimit_nofile 65535; # Max open files per worker
|
|
744
|
+
|
|
745
|
+
events {
|
|
746
|
+
worker_connections 4096; # Max connections per worker
|
|
747
|
+
multi_accept on; # Accept multiple connections at once
|
|
748
|
+
use epoll; # Linux optimal event method
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
http {
|
|
752
|
+
# Sendfile -- bypass user space for static files
|
|
753
|
+
sendfile on;
|
|
754
|
+
tcp_nopush on; # Send headers and file in one packet
|
|
755
|
+
tcp_nodelay on; # Disable Nagle's algorithm for small packets
|
|
756
|
+
|
|
757
|
+
# Timeouts
|
|
758
|
+
keepalive_timeout 65;
|
|
759
|
+
keepalive_requests 1000;
|
|
760
|
+
client_body_timeout 12;
|
|
761
|
+
client_header_timeout 12;
|
|
762
|
+
send_timeout 10;
|
|
763
|
+
|
|
764
|
+
# Buffers
|
|
765
|
+
client_body_buffer_size 16k;
|
|
766
|
+
client_header_buffer_size 1k;
|
|
767
|
+
client_max_body_size 8m;
|
|
768
|
+
large_client_header_buffers 4 8k;
|
|
769
|
+
|
|
770
|
+
# File descriptor cache
|
|
771
|
+
open_file_cache max=1000 inactive=20s;
|
|
772
|
+
open_file_cache_valid 30s;
|
|
773
|
+
open_file_cache_min_uses 2;
|
|
774
|
+
open_file_cache_errors on;
|
|
775
|
+
|
|
776
|
+
# MIME types
|
|
777
|
+
include /etc/nginx/mime.types;
|
|
778
|
+
default_type application/octet-stream;
|
|
779
|
+
|
|
780
|
+
# Logging
|
|
781
|
+
access_log /var/log/nginx/access.log main buffer=16k flush=5s;
|
|
782
|
+
error_log /var/log/nginx/error.log warn;
|
|
783
|
+
}
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
---
|
|
787
|
+
|
|
788
|
+
## 18. Anti-Patterns
|
|
789
|
+
|
|
790
|
+
### NEVER
|
|
791
|
+
|
|
792
|
+
- Edit configuration without running `nginx -t` before reloading
|
|
793
|
+
- Use `if` blocks in location context for anything other than `return` or `rewrite` -- it causes subtle bugs
|
|
794
|
+
- Hardcode backend addresses in location blocks -- use upstream blocks
|
|
795
|
+
- Serve static files through a proxy when Nginx can serve them directly
|
|
796
|
+
- Disable access logging in production -- you need it for debugging
|
|
797
|
+
- Use `ssl on` (deprecated) -- use `listen 443 ssl` instead
|
|
798
|
+
- Run Nginx as root for worker processes -- only the master process needs root
|
|
799
|
+
- Skip security headers -- add them in every server block
|
|
800
|
+
- Use self-signed certificates in production -- use Let's Encrypt
|
|
801
|
+
- Ignore the `always` parameter on `add_header` -- without it, headers are not added to error responses
|
|
802
|
+
|
|
803
|
+
### ALWAYS
|
|
804
|
+
|
|
805
|
+
- Run `nginx -t` before `nginx -s reload`
|
|
806
|
+
- Use `upstream` blocks for backend servers
|
|
807
|
+
- Enable gzip/brotli compression for text-based content
|
|
808
|
+
- Set appropriate `client_max_body_size` for each endpoint
|
|
809
|
+
- Use `try_files` for SPA routing instead of nested if/rewrite blocks
|
|
810
|
+
- Set `keepalive` connections to upstream backends
|
|
811
|
+
- Include security headers on every response
|
|
812
|
+
- Log in structured JSON format for production
|
|
813
|
+
- Configure SSL with modern cipher suites and TLS 1.2+
|
|
814
|
+
- Monitor error logs and upstream response times
|
|
815
|
+
|
|
816
|
+
---
|
|
817
|
+
|
|
818
|
+
## 19. Quick Reference
|
|
819
|
+
|
|
820
|
+
```bash
|
|
821
|
+
# Test configuration
|
|
822
|
+
nginx -t
|
|
823
|
+
|
|
824
|
+
# Reload configuration (graceful -- no downtime)
|
|
825
|
+
nginx -s reload
|
|
826
|
+
|
|
827
|
+
# Stop (graceful)
|
|
828
|
+
nginx -s quit
|
|
829
|
+
|
|
830
|
+
# Stop (immediate)
|
|
831
|
+
nginx -s stop
|
|
832
|
+
|
|
833
|
+
# Show compiled modules
|
|
834
|
+
nginx -V
|
|
835
|
+
|
|
836
|
+
# Show active configuration
|
|
837
|
+
nginx -T
|
|
838
|
+
|
|
839
|
+
# Check which process is listening
|
|
840
|
+
ss -tlnp | grep :80
|
|
841
|
+
```
|