- mailer/: standalone Express+nodemailer service on port 3000 with
validation, honeypot (company field), per-IP rate limiting (5/min),
Fastmail SMTP. Returns 400 on bad input, 429 on rate limit, 502 on
SMTP failure, 200 {ok:true} on success or honeypot hit.
- Dockerfile: multi-stage nginx build for humanai-landing container.
- mailer/Dockerfile: node:22-alpine, no exposed host ports.
- deploy.sh: idempotent deploy of both containers to piha.local via
Docker context 'piha', with smoke tests (400 on empty body, 200 on
honeypot fill).
- src/i18n/: minimal pl/en translation files; useT() hook picks
language from navigator.language.
- CTASection: replaced dead onSubmit with fetch POST /api/contact,
added hidden honeypot field, success/error states using i18n strings.
- README: Mailer section with two manual steps (credentials + NPM proxy).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
||
|---|---|---|
| .junie/memory | ||
| mailer | ||
| src | ||
| .env.example | ||
| .gitignore | ||
| deploy.sh | ||
| Dockerfile | ||
| index.html | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.js | ||
| README.md | ||
| tailwind.config.js | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| vite.config.ts | ||
humanAI — landing page
React + Vite static site, served by nginx in the humanai-landing Docker container,
behind Nginx Proxy Manager on the nginxproxymanager_default network.
Development
npm install
npm run dev
Deploy
./deploy.sh
The script builds images locally, pushes them to piha.local via the piha Docker context,
and runs smoke tests against the mailer endpoint.
Mailer
The mailer/ directory contains a standalone Express microservice that handles the contact
form. It runs as humanai-mailer on the same Docker network as NPM so it can be proxied
without exposing any port to the host.
Manual steps required before first deploy
(a) Create a Fastmail app-password and write credentials to mailer.env on the deploy machine:
# mailer.env (never commit this file)
SMTP_USER=youruser@fastmail.com
SMTP_PASS=your-app-password
(b) In Nginx Proxy Manager → Proxy Host for gethumanai.pl → Custom Locations:
| Field | Value |
|---|---|
| location | /api |
| scheme | http |
| forward hostname | humanai-mailer |
| port | 3000 |