Повноцінний веб-проєкт портфоліо з публічним сайтом, адмін-панеллю, API, кешем, сесіями, завантаженням зображень, e-mail формою та метриками.
Puffinity Portfolio Platform — це контентно-керований сайт для презентації послуг розробника з окремою адмін-панеллю.
Проєкт закриває задачі:
- публічне відображення головної сторінки та сторінок сервісів;
- централізоване редагування контенту через адмінку;
- керування FAQ, відгуками, контактами, hero/галереями;
- безпечний вхід адміністратора через сесії;
- зберігання та віддача зображень;
- базова спостережуваність через
/metrics.
- фрилансеру або агенції для власного сайту-портфоліо;
- малим командам, яким потрібна проста CMS-подібна адмінка без важкого фреймворка;
- pet/commercial MVP, де важливі швидкий запуск і контроль контенту.
- Стек:
HTML + CSS + Vanilla JS + Bootstrap 5. - Працює через
Nginx. - Має публічні сторінки сервісів, головну, портфоліо, login, admin panel UI.
- Стек:
Node.js + Express + TypeScript. - База:
PostgreSQL. - Кеш/сесії/анті-брутфорс:
Redis. - Валідація:
Zod. - Upload:
Multer(до 2 МБ). - Логи:
Winston. - Метрики:
prom-client(/metrics). - Міграції: власний раннер (
backend/migration).
Docker + Docker Compose.- Ролі контейнерів:
frontend (nginx),backend (node),postgres,redis.
- Динамічна головна сторінка (
hero,services,pricing,about,testimonials,faq,contacts). - Окремі сторінки сервісів (
debug,turnkey,integrations). - Адмін-панель з авторизацією через сесію.
- Керування FAQ/відгуками/контактами.
- Керування галереями сервісів і ключовими фото.
- E-mail форма зворотного зв’язку.
- Роздача картинок через
/uploads. - Захищений доступ до
/adminPanelчерезauth_requestв Nginx.
GET /main— головна сторінка.GET /main/:path— дані сторінки сервісу.POST /work/testimonials— створення відгуку.POST /work/send-letter— відправка листа.
POST /admin/adminLog— вхід.POST /admin/adminLogout— вихід.GET /admin/check-session— перевірка сесії для фронтенду.GET /admin/check-session-for-nginx— перевірка сесії для Nginx.
GET /panel/categoryPOST /panel/mainPOST /panel/servicesPOST /panel/contactsGET /panel/testimonialsPOST /panel/turnOnTestimonialsPOST /panel/turnOffTestimonialsPOST /panel/deleteTestimonialsPOST /panel/sendFaqPOST /panel/createFaqPOST /panel/editFaqPOST /panel/deleteFaqPOST /panel/onFaqPOST /panel/offFaqPOST /panel/sendGalleryPOST /panel/save-gallery1POST /panel/save-gallery2POST /panel/save-gallery3POST /panel/save-main-galleryPOST /panel/save-aboutMe-gallery
GET /metrics
PortfolioProject/
├─ backend/
│ ├─ app.ts
│ ├─ server.ts
│ ├─ routes/
│ ├─ module/
│ ├─ helpers/
│ ├─ middlewares/
│ ├─ migration/
│ ├─ config/
│ └─ validator/
├─ frontend/
│ ├─ pages/
│ ├─ css/
│ ├─ js/
│ ├─ nginx.conf
│ └─ Dockerfile
└─ docker-compose.yml
Також у репозиторії є гілки з декомпозицією по доменах (backend/*, frontend/*) та агреговані (*/all-ready).
Node.js >= 20npm >= 10Docker+Docker Compose(рекомендовано)PostgreSQL 16Redis 7
git clone <URL_РЕПОЗИТОРІЮ>
cd PortfolioProjectРекомендовано працювати з гілками, де повний стек вже зібраний (
backend/all-ready,frontend/all-ready) або з вашою інтеграційною гілкою.
У проєкті повинно бути 3 env-файли:
backend/.env.postgresbackend/.env.dockerbackend/.env.local
Нижче вказані тільки назви полів (без значень).
POSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORD
NODE_ENVPORTHOSTCORS_ORIGINSSESSION_SECRETPG_HOSTPG_PORTPG_DATABASEPG_USERPG_PASSWORDPG_SSLPG_POOL_MAXPG_POOL_MINPG_CONN_TIMEOUT_MSPG_IDLE_TIMEOUT_MSPG_STATEMENT_TIMEOUT_MSPG_QUERY_TIMEOUT_MSAPP_NAMELOG_LEVELREDIS_PASSWORDREDIS_SESSION_HOSTREDIS_SESSION_PORTREDIS_SESSION_DBREDIS_SESSION_TTLREDIS_SESSION_TOUCHREDIS_CACHE_HOSTREDIS_CACHE_PORTREDIS_CACHE_DBREDIS_CACHE_TTLREDIS_CACHE_MAX_SIZEREDIS_CACHE_COMPRESSSMTP_HOSTSMTP_PORTSMTP_SECURERATE_LIMITSMTP_USERSMTP_PASSWORDSMTP_POOLSMTP_POOL_MAX_CONNECTIONSSMTP_POOL_MAX_MESSAGESSMTP_KEEP_ALIVESMTP_CONNECTION_TIMEOUT_MSSMTP_GREETING_TIMEOUT_MSSMTP_SOCKET_TIMEOUT_MSSMTP_TLS_REJECT_UNAUTHORIZEDMAIL_FROM
NODE_ENVPORTHOSTCORS_ORIGINSPG_HOSTPG_PORTPG_DATABASEPG_USERPG_PASSWORDPG_SSLPG_POOL_MAXPG_POOL_MINPG_CONN_TIMEOUT_MSPG_IDLE_TIMEOUT_MSPG_STATEMENT_TIMEOUT_MSPG_QUERY_TIMEOUT_MSAPP_NAMELOG_LEVELREDIS_PASSWORDREDIS_SESSION_HOSTREDIS_SESSION_PORTREDIS_SESSION_DBREDIS_SESSION_TTLREDIS_SESSION_TOUCHREDIS_CACHE_HOSTREDIS_CACHE_PORTREDIS_CACHE_DBREDIS_CACHE_TTLREDIS_CACHE_MAX_SIZEREDIS_CACHE_COMPRESSSMTP_HOSTSMTP_PORTSMTP_SECURERATE_LIMITSMTP_USERSMTP_PASSWORDSMTP_POOLSMTP_POOL_MAX_CONNECTIONSSMTP_POOL_MAX_MESSAGESSMTP_KEEP_ALIVESMTP_CONNECTION_TIMEOUT_MSSMTP_GREETING_TIMEOUT_MSSMTP_SOCKET_TIMEOUT_MSSMTP_TLS_REJECT_UNAUTHORIZEDMAIL_FROM
docker compose up --build -dПісля старту:
- Frontend:
http://localhost:8080/main - Login:
http://localhost:8080/login - Admin Panel:
http://localhost:8080/adminPanel - Backend API:
http://localhost:3000 - Metrics:
http://localhost:3000/metrics
Запускати з каталогу backend:
npm install
npm run build
npm run migrateСтворити адміністратора:
npm run create -- <login> <password>Додатково:
npm run ifExist -- <login>
npm run delete -- <login>
npm run status
npm run rollback- Підняти окремо
PostgreSQLіRedis. - Налаштувати
backend/.env.local. - Запустити backend:
cd backend
npm install
npm run start- Віддати frontend через будь-який статичний сервер (наприклад nginx або
npx serve) на порт8080.
Для галерей/фото дозволені:
image/jpegimage/pngimage/webpimage/gif
Ліміт файлу: 2MB (Multer).
helmet,cors,hpp,rate-limit.- Сесії в Redis (
connect-redis). - Захист адмінки через Nginx
auth_request. - Валідація payload через
zod.
- Логін через
/login. - Перехід в
/adminPanel. - Редагування потрібної секції.
- Збереження даних або окремих галерейних блоків.
- Перевірка змін на публічних сторінках.
500приdocker compose build(auth.docker.io): перевірити мережу/VPN та зробити повтор збірки.- Якщо
/adminPanelперекидає на/login: перевірити cookie/session,SESSION_SECRET, Redis і/_auth_admin. - Якщо не грузяться картинки: перевірити volume
upload-imagesі доступність/uploads/*. - Якщо не приходять листи: перевірити SMTP конфіг (
SMTP_*) і логи backend.
MIT License
Puffinity Portfolio Platform is a full-stack portfolio website with a public frontend, admin panel, API, caching, session-based authentication, image uploads, contact e-mail flow, and metrics.
The project is designed to:
- present services and portfolio pages publicly;
- let admins manage content from a dedicated admin panel;
- support FAQ, testimonials, contacts, hero blocks, and galleries;
- provide secure admin login/logout with Redis-backed sessions;
- serve uploaded images through Nginx;
- expose operational metrics via
/metrics.
- The entire project is written in Ukrainian.
- All code comments are written in Ukrainian.
- UI labels and domain terminology are Ukrainian-first.
- Frontend:
HTML,CSS,Vanilla JS,Bootstrap 5,Nginx - Backend:
Node.js,Express,TypeScript - Database:
PostgreSQL - Cache/Sessions:
Redis - Validation:
Zod - Uploads:
Multer - Logging:
Winston - Metrics:
prom-client - Orchestration:
Docker Compose
git clone <REPOSITORY_URL>
cd PortfolioProject
docker compose up --build -dMain URLs:
- Frontend:
http://localhost:8080/main - Login:
http://localhost:8080/login - Admin panel:
http://localhost:8080/adminPanel - Backend API:
http://localhost:3000 - Metrics:
http://localhost:3000/metrics
POST /admin/adminLog— loginPOST /admin/adminLogout— logoutGET /admin/check-session— frontend session checkGET /admin/check-session-for-nginx— Nginx auth check for protected admin route
Allowed image MIME types:
image/jpegimage/pngimage/webpimage/gif
Max file size: 2MB.