No description
  • HTML 45.7%
  • Python 32.9%
  • CSS 13.9%
  • JavaScript 6.7%
  • Dockerfile 0.5%
  • Other 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
elirtf 2ff1857c99
Some checks failed
CI / lint-and-test (push) Has been cancelled
CI / image (push) Has been cancelled
CI / deploy (push) Has been cancelled
Merge pull request 'dev' (#22) from dev into main
Reviewed-on: #22
2026-09-14 20:06:31 +00:00
.forgejo/workflows ci: deploy from the production host after a green main 2026-08-15 17:20:05 -05:00
.scratch docs(seo): mark build tickets 05-07 done (copy pending owner sign-off) 2026-07-21 15:37:19 -05:00
backend security: OWASP hardening pass 2026-09-14 14:52:11 -05:00
ci docs(ci): build the CI runner as a Proxmox VM 2026-08-15 17:50:10 -05:00
docs docs(ci): build the CI runner as a Proxmox VM 2026-08-15 17:50:10 -05:00
.env.example feat(contact): validate Free Assessment submissions and rate-limit them 2026-08-15 16:30:10 -05:00
.gitignore chore: ignore local skills tooling (.agents/, skills-lock.json) 2026-07-23 13:23:23 -05:00
Caddyfile security(caddy): send security headers on redirect responses too 2026-09-14 14:53:41 -05:00
CLAUDE.md ci: run lint, tests, and an image build on every push 2026-08-15 16:41:16 -05:00
CONTEXT.md docs: grilling context, no-fabrication ADR, and conversion-flow-seo spec + tickets 2026-07-17 16:09:52 -05:00
docker-compose.prod.yml fix(deploy): pin the address Caddy publishes 80/443 on 2026-08-15 16:29:57 -05:00
docker-compose.yml security: OWASP hardening pass 2026-09-14 14:52:11 -05:00
LICENSE Initial commit 2026-06-10 14:48:55 -05:00
README.md ci: run lint, tests, and an image build on every push 2026-08-15 16:41:16 -05:00
ruff.toml ci: run lint, tests, and an image build on every push 2026-08-15 16:41:16 -05:00

Avian Technologies Group — marketing site

A single-page marketing website built with FastAPI + Jinja2, served behind a Caddy reverse proxy via Docker Compose. It renders the home page and handles a contact form that emails submissions over SMTP. No database, no login, no persistent state.


Architecture

Internet → :8080 → Caddy (reverse proxy) → backend:8000 → FastAPI / Jinja2
  • Caddy — TLS termination and reverse proxy to the backend
  • Backend — FastAPI app rendering the home page and a POST /api/contact endpoint
  • Static assets — served by FastAPI via a StaticFiles mount at /static

Routes: / (home), /api/contact, /robots.txt, /sitemap.xml, /favicon.ico. Everything else returns the styled 404 page.


Quick start (Docker Compose)

Prerequisites: Docker + Docker Compose v2.

cp .env.example .env      # optional — defaults work out of the box
docker compose up -d --build
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8080/   # → 200

The site is at http://localhost:8080.

Production (automatic HTTPS)

Point the Caddyfile at your domain:

your-domain.com {
	reverse_proxy backend:8000
}

Then launch with the production overlay (publishes 80/443, persists certs):

docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build

Set SITE_BASE_URL=https://your-domain.com in .env so sitemap.xml and robots.txt emit the right URLs.


Configuration

All settings are environment variables (see .env.example); all are optional with sensible defaults.

Variable Purpose
SITE_BASE_URL Public base URL used in sitemap.xml / robots.txt
CONTACT_EMAIL / CONTACT_PHONE / CONTACT_LOCATION Contact details shown on the site
AFTER_HOURS_PHONE Optional after-hours number
NOTIFY_TO Where contact-form submissions are emailed
SMTP_HOST / SMTP_PORT / SMTP_USER / SMTP_PASS / SMTP_FROM SMTP delivery for the contact form

If SMTP isn't configured, contact submissions are logged to the container output instead of emailed — the form still returns success to the visitor.


Local development

cd backend
pip install -r requirements.txt
TEMPLATES_DIR=templates STATIC_DIR=static uvicorn main:app --reload --port 8000

Tests and lint:

pytest backend/tests
ruff check backend

CI

Pushes to main/dev and every pull request run lint, the test suite, a docker build of the backend image, and a compose-file validation. The workflow is .forgejo/workflows/ci.yml; it needs a Forgejo Actions runner, which ci/docker-compose.yml provides. See docs/ci.md for registration and the one-liner that runs the same checks locally.