React SPA — portfolio and projects. Built with Vite, TanStack Router, Tailwind CSS. Theme follows system preference and is persisted in localStorage.
- React 19 + TypeScript
- Vite 7 — dev server and build
- TanStack Router — file-based routing
- Tailwind CSS 4 — styling
- i18next — i18n
Prerequisites: Node.js 22+ and npm.
npm install
npm run dev- App: http://localhost:5173
- Build:
npm run build - Preview build:
npm run preview - Lint:
npm run lint
Multi-stage build: Node builds the app, nginx serves static files.
Build and run:
docker compose up -d --buildThe app listens on port 80 inside the container. No port is published by default; it’s intended to sit behind a reverse proxy.
External network: Compose uses the proxy-net network. Create it once if it doesn’t exist:
docker network create proxy-net-
Build and run the portfolio on the server (e.g. in its own directory) with the same
docker-compose.yml, so theportfoliocontainer is onproxy-net. -
Reverse proxy: Nginx (or another proxy) must also be on
proxy-netand proxy tohttp://portfolio:80.A reference config for the proxy is in
deploy/mikyss.ru.conf. Copy it into your nginxconf.d(e.g./opt/nginx-proxy/conf.d/) and reload nginx. -
HTTPS: Certificates (e.g. Let’s Encrypt) are handled by the proxy; the container only serves HTTP.
src/
app/
routes/ # TanStack Router (index, portfolio, …)
main.tsx
components/
lib/
styles/
deploy/ # Nginx proxy configs for deployment
Dockerfile
nginx.conf # In-container nginx for SPA
docker-compose.yml