Lalabase
티켓·문서·근무시간·고객대화를 한 곳에 모아 KI로 검색, 소프트웨어 기업 고객 프로젝트용, 오픈소스로 자체 서버·독일 클라우드에 배포
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기**Direct Hire** helps businesses find reliable long-term employees. We source, screen, and present qualified candidates who match your company’s needs, saving you time and reducing hiring risks. You choose the right worker and hire them directly as part of your team.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗directhire-v2/
├── backend/ Express API server → http://localhost:4000
├── frontend/ Next.js website → http://localhost:3000
└── package.json Root (runs both together)
Install these before starting:
| Tool | Download | Check installed |
|---|---|---|
| Node.js 18+ | nodejs.org | node -v |
| PostgreSQL 14+ | postgresql.org | psql --version |
| npm 9+ | Comes with Node | npm -v |
# Windows (PowerShell or CMD)
cd directhire-v2
npm install
# Mac / Linux
cd directhire-v2
npm install
# Windows
cd backend
copy .env.example .env
notepad .env
# Mac / Linux
cd backend
cp .env.example .env
nano .env
Generate secrets and paste them into the .env file:
# Windows PowerShell — run each line separately
node -e "console.log('JWT_ACCESS_SECRET=' + require('crypto').randomBytes(64).toString('base64'))"
node -e "console.log('JWT_REFRESH_SECRET=' + require('crypto').randomBytes(64).toString('base64'))"
node -e "console.log('ENCRYPTION_KEY=' + require('crypto').randomBytes(32).toString('hex'))"
node -e "console.log('CRON_SECRET=' + require('crypto').randomBytes(32).toString('base64'))"
The minimum you must set in backend/.env:
DATABASE_URL="postgresql://postgres:YOUR_PASSWORD@localhost:5432/directhire?schema=public"
JWT_ACCESS_SECRET=paste_first_output_here
JWT_REFRESH_SECRET=paste_second_output_here
ENCRYPTION_KEY=paste_third_output_here
CRON_SECRET=paste_fourth_output_here
Leave everything else at default for local development.
# Windows — open psql as postgres user
psql -U postgres
# Then run inside psql:
CREATE DATABASE directhire;
\q
# Windows (from directhire-v2/backend/)
cd backend
npx prisma migrate dev --name init
npm run db:seed
cd ..
# Mac / Linux
cd backend
npm run db:migrate
npm run db:seed
cd ..
# Windows
cd frontend
copy .env.local.example .env.local
# Mac / Linux
cd frontend
cp .env.local.example .env.local
cd ..
.env.local just needs:
NEXT_PUBLIC_API_URL=http://localhost:4000
NEXT_PUBLIC_APP_URL=http://localhost:3000
# From directhire-v2/ root
npm run dev
This starts both servers at once using concurrently:
Terminal 1 — Backend:
cd directhire-v2/backend
npm run dev
Terminal 2 — Frontend:
cd directhire-v2/frontend
npm run dev
| Role | Password | |
|---|---|---|
| Admin | [email protected] | Admin123!Local |
| Worker | [email protected] | Worker123! |
| Employer | [email protected] | Employer123! |
Browser → http://localhost:3000 (Next.js frontend)
│
│ /api/* requests
▼
next.config.js rewrite proxy
│
▼
http://localhost:4000 (Express backend)
│
├── /api/auth/*
├── /api/onboarding/*
├── /api/uploads/*
├── /api/user/*
├── /api/admin/*
└── /api/cron/*
The Next.js next.config.js rewrites all /api/* requests to the backend.
This means cookies are always sent to the same origin (localhost:3000),
which avoids all cross-origin cookie issues during development.
In production, you point both to the same domain with a reverse proxy (Nginx/Caddy) or deploy behind a single host (Railway, Render etc.).
directhire-v2/
│
├── package.json Root scripts (dev, build, db:*)
│
├── backend/
│ ├── .env.example Copy to .env and fill in
│ ├── package.json
│ ├── tsconfig.json
│ ├── prisma/
│ │ └── schema.prisma Database schema (21 models)
│ ├── scripts/
│ │ └── seed.ts Demo data seeder
│ └── src/
│ ├── server.ts Express app entry point
│ ├── lib/
│ │ ├── prisma.ts DB client singleton
│ │ ├── auth.ts JWT sign/verify + cookie helpers
│ │ ├── response.ts ok(), err(), paginated() helpers
│ │ └── encrypt.ts AES-256-GCM field encryption
│ ├── middleware/
│ │ ├── auth.middleware.ts requireAuth(), requireAdmin()
│ │ ├── error.middleware.ts Global error handler
│ │ └── ratelimit.middleware.ts
│ ├── routes/
│ │ ├── auth.routes.ts
│ │ ├── onboarding.routes.ts
│ │ ├── uploads.routes.ts
│ │ ├── user.routes.ts
│ │ ├── admin.routes.ts
│ │ └── cron.routes.ts
│ ├── controllers/
│ │ ├── auth.controller.ts
│ │ ├── onboarding.controller.ts
│ │ ├── uploads.controller.ts
│ │ ├── user.controller.ts
│ │ └── admin.controller.ts
│ ├── services/
│ │ ├── email/ Multi-provider email service
│ │ ├── storage/ Local + Supabase file storage
│ │ └── queue/ BullMQ + inline job runner
│ └── types/
│ └── index.ts
│
└── frontend/
├── .env.local.example Copy to .env.local
├── package.json
├── tsconfig.json
├── tailwind.config.ts
├── next.config.js /api/* proxy to backend
└── src/
├── middleware.ts Route protection (JWT cookie check)
├── app/
│ ├── layout.tsx
│ ├── globals.css
│ ├── (auth)/ Public auth pages
│ │ ├── login/
│ │ ├── register/
│ │ ├── forgot-password/
│ │ └── reset-password/
│ └── (app)/ Protected app pages
│ ├── worker/
│ │ ├── dashboard/
│ │ └── onboarding/
│ ├── employer/
│ │ ├── dashboard/
│ │ └── onboarding/
│ └── admin/
│ ├── dashboard/
│ └── approvals/
├── lib/
│ ├── api-client.ts Typed fetch wrapper → /api/*
│ └── stores/
│ └── onboarding.store.ts Zustand (autosave, uploads)
└── components/ (shared UI components)
POST /api/auth/register
POST /api/auth/login
POST /api/auth/logout
POST /api/auth/refresh
POST /api/auth/forgot-password
POST /api/auth/reset-password
POST /api/auth/verify-email
GET /api/onboarding/progress
POST /api/onboarding/save-step
POST /api/onboarding/submit
POST /api/uploads
GET /api/uploads
DELETE /api/uploads/:id
GET /api/user/profile
PATCH /api/user/profile
GET /api/user/notifications
PATCH /api/user/notifications/:id/read
GET /api/admin/stats
GET /api/admin/submissions
POST /api/admin/review
GET /api/admin/jobs
PATCH /api/admin/jobs/:id/status
PATCH /api/admin/documents/:id/review
GET /api/admin/audit-log
GET /api/admin/users
PATCH /api/admin/users/:id/suspend
PATCH /api/admin/users/:id/activate
GET /api/jobs
GET /api/jobs/countries
GET /api/jobs/filter-options
POST /api/jobs/:id/save
DELETE /api/saved-jobs/:jobId
GET /api/saved-jobs
POST /api/jobs/:id/apply
GET /api/applications/mine
GET /api/employer/candidates
GET /api/employer/jobs
POST /api/employer/jobs
GET /api/employer/applications
PATCH /api/employer/applications/:id/status
GET /api/employer/locks
PATCH /api/employer/locks/:id/release
GET /api/employer/billing
GET /api/cron (requires X-Cron-Secret header)
GET /health
psql not found:
Add PostgreSQL to your PATH. Default location:
C:\Program Files\PostgreSQL\16\bin
Add this to System Environment Variables → Path.
Port already in use:
# Find and kill process on port 4000
netstat -ano | findstr :4000
taskkill /PID <PID_NUMBER> /F
node_modules issues:
# Delete and reinstall
rmdir /s /q node_modules
rmdir /s /q backend\node_modules
rmdir /s /q frontend\node_modules
npm install
Prisma client not generated:
cd backend
npx prisma generate