PaynEat POS설치 안내
PaynEat POS로 매장을 여는 네 가지 방법
맞는 방법을 골라 한 단계씩 따라 하세요. 가입도 비용도 없고, 매장 데이터는 사장님 기기에 그대로 있습니다.
- 무료 · Apache 2.0
- 가입 불필요
- 가지고 계신 기기 그대로
Windows에 한 줄로 설치
서버, 창 사이 실시간 반영, 가상 저울, PDF 영수증까지 갖춘 실제 시스템을 코드 다운로드나 빌드 없이 — 설치 프로그램이 미리 빌드된 이미지를 받아 옵니다.
- 소요 시간
- 3~5분 (처음에 약 200MB 다운로드)
- 필요한 것
- 64비트 Windows + Docker Desktop
- 결과
- 이 PC의 http://localhost:8080 에서 PaynEat 실행
Docker Desktop 설치 후 실행
없으시면 docker.com에서 받아 설치하고 실행하세요. 왼쪽 아래에 Engine running이 뜰 때까지 기다립니다.
PowerShell 열기
Windows 키를 누르고 PowerShell을 입력한 뒤 Enter를 누르세요.
이 한 줄을 붙여 넣고 Enter
상자 모서리의 복사를 누르고, PowerShell 창에서 마우스 오른쪽 버튼으로 붙여 넣으세요.
PowerShell[Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object Net.WebClient).DownloadString('https://github.com/SuruchBoss/PaynEat/releases/download/demo/install-demo.ps1'))잠시 기다린 뒤 로그인
브라우저가 http://localhost:8080 을 알아서 엽니다.
admin/admin123으로 로그인하거나 로그인 화면의 데모 계정 버튼을 누르세요.
✅PowerShell에 초록색으로 PaynEat is ready: http://localhost:8080이 나오고 브라우저에 로그인 화면이 뜨면 성공입니다.
매일 쓰실 때
- 시작 / 중지 / 초기화
- 사용자 폴더의 PaynEat-Demo에 더블클릭 파일 Start, Stop, Reset PaynEat data가 있습니다 (Reset은 체험한 계산서를 모두 지우고 예시 데이터로 되돌립니다).
- PC를 다시 켰을 때
- Docker Desktop을 열면 PaynEat이 저절로 올라옵니다.
- 최신 버전으로 업데이트
- 같은 한 줄을 다시 붙여 넣으세요. 데이터는 그대로 남습니다.
⚠️ 체험용 설정입니다 (데모 계정, 가상 저울, 실제로 보내지지 않는 이메일). 또한 이 PC에서만 열립니다 — 매장의 휴대폰과 태블릿까지 연결하시려면 방법 3을 쓰세요. 붙여 넣기 전에 스크립트 내용을 보시려면: install-demo.ps1
Docker로 실행해 모든 기기 연결하기
서버는 매장 컴퓨터 한 대에 두고, 직원 휴대폰·캐셔 태블릿·주방 화면은 브라우저로 엽니다. 한 기기에서 넣은 주문이 다른 기기의 주방 화면에 바로 뜹니다.
- 소요 시간
- 처음 10~15분 (그다음부터는 1분 이내)
- 필요한 것
- Windows, Mac 또는 Linux의 Docker Desktop
- 결과
- 같은 와이파이의 모든 기기에서 http://<이 컴퓨터 IP>:8080
코드 내려받기
가장 쉬운 방법: ZIP 파일 내려받기 후 압축을 풀면
PaynEat-main폴더가 생깁니다. git이 있으시면 이렇게 하셔도 됩니다:Terminalgit clone https://github.com/SuruchBoss/PaynEat.git이 컴퓨터의 IP 찾기
Windows: PowerShell에서
ipconfig를 입력하고 IPv4 Address를 보세요. Mac/Linux:ifconfig | grep inet.192.168.1.15같은 모양입니다.서버 비밀 값 설정
코드 폴더(
docker-compose.yml옆)에.env파일을 만들고JWT_SECRET=뒤에 매장 고유의 무작위 값을 넣으세요. 이 줄이 없으면 시스템이 시작되지 않고 설정 방법을 안내합니다. Mac/Linux는 아래 명령을, Windows PowerShell은("JWT_SECRET=" + [guid]::NewGuid().ToString("N") + [guid]::NewGuid().ToString("N")) | Out-File -Encoding ascii .env를 사용하세요.Terminal (Mac/Linux)echo "JWT_SECRET=$(openssl rand -hex 32)" > .env앱에 서버 위치 알려 주기
같은
.env파일에 이 줄을 추가하세요. 숫자는 사장님 IP로 바꿉니다. 이 컴퓨터에서만 쓰실 거라면 건너뛰셔도 됩니다..envAPI_BASE_URL=http://192.168.1.15:3000시작하기
코드 폴더에서 터미널(Windows는 PowerShell)을 열고 실행하세요. 처음에는 앱을 빌드하느라 5~10분 걸립니다.
Terminaldocker compose up --build모든 기기에서 열기
같은 와이파이에서 휴대폰·태블릿·주방 화면으로 http://192.168.1.15:8080 (사장님 IP)을 여세요. 서버 컴퓨터에서는 http://localhost:8080 도 됩니다.
✅터미널에 payneat-api와 payneat-web이 보이고 http://localhost:3000/health 가 응답하면 성공입니다.
매일 쓰실 때
- 중지
- 터미널에서 Ctrl+C를 누른 뒤
docker compose down을 실행하세요. - 데이터를 처음부터
docker compose down -v(계산서와 모든 데이터가 지워집니다)- 가상 저울과 테스트 이메일 켜기
- 같은
.env파일에SCALE_DRIVER=simulator와MAIL_TRANSPORT=json을 추가하고docker compose up --build를 다시 실행하세요. 실제 매장에서는 simulator를 쓰지 마세요.
💡 다른 기기에서 안 열리면: 같은 와이파이인지, 서버 컴퓨터 방화벽이 8080과 3000 포트를 허용하는지 확인하세요. 직원이 실제로 쓰기 전에 운영 전 체크리스트를 모두 마쳐 주세요.
소스에서 직접 실행
코드를 고치거나, 요청마다 로그를 보거나, Flutter로 실제 휴대폰에서 돌려 볼 때.
- 소요 시간
- 약 5분
- 필요한 것
- Node.js 20 이상(22 권장) + Flutter 3.35 이상
- 결과
- http://localhost:3000 의 API와 Chrome의 앱
코드 받기
Terminalgit clone https://github.com/SuruchBoss/PaynEat.git cd PaynEat창 1 — 서버
.env에는 로컬용JWT_SECRET이 들어 있고, 없으면 서버가 시작되지 않습니다 (Windows는cp대신copy). 데이터베이스와 예시 데이터는 자동으로 만들어집니다.Terminal 1cd backend npm install cp .env.example .env npm run dev창 2 — 앱
새 창을 여세요. 첫 번째 창은 닫지 마세요.
Terminal 2cd app flutter pub get flutter run -d chrome
✅창 1에 PaynEat POS API listening on http://localhost:3000 줄이 나오고 Chrome에 로그인 화면이 뜨면 성공입니다.
자주 쓰는 방법
- 서버 없이 앱만
flutter run -d chrome --dart-define=DEMO_MODE=true(브라우저 안의 예시 데이터, 새로고침하면 초기화)- 같은 와이파이의 실제 휴대폰
flutter run --dart-define=API_BASE_URL=http://<컴퓨터 IP>:3000- Android 에뮬레이터
10.0.2.2:3000을 자동으로 사용합니다. 설정할 것이 없습니다.- 테스트 실행
cd backend && npm test·cd app && flutter test
구조, API, 모든 테스트는 README (영문)에 있습니다.
백업과 복원
매장의 모든 데이터는 서버의 파일 하나에 있습니다. PaynEat이 교대 마감 후, 데이터가 바뀐 경우 6시간마다, 그리고 업데이트 전에 자동으로 백업합니다. 상태는 관리자 설정 화면에서 볼 수 있고, 26시간 넘게 백업에 성공하지 못하면 매장 주인과 매니저의 홈 화면에 경고가 뜹니다.
- 보관 위치
- 데이터베이스 옆 data/backups와 직접 지정한 두 번째 위치
- 보관 기간
- 48시간 동안 모든 파일, 그 뒤 30일 동안 하루 한 개
- 복원 방법
- 서버에서 명령어 실행 (앱에는 복원 버튼이 없음)

다른 디스크에 두 번째 위치 지정
첫 번째 백업은 데이터베이스와 같은 디스크에 있어 디스크가 고장 나면 둘 다 잃습니다. USB 드라이브를 꽂거나 매장 NAS의 폴더를 쓰고,
backend/.env에 아래 줄을 추가(폴더는 본인 것으로)한 뒤 서버를 다시 시작하세요backend/.env (코드에서 실행)BACKUP_COPY_DIR=E:\PaynEat-backupDocker: 두 번째 백업을 컨테이너 밖에 두기
docker-compose.yml의api아래volumes:에서- /mnt/usb-backup/payneat:/backup-copy줄의 주석을 풀고(:앞부분을 본인 폴더로, Linux에서는 uid 1000이 쓸 수 있게:sudo chown 1000:1000 /mnt/usb-backup/payneat).env에 아래 줄을 추가한 뒤docker compose up -d를 실행하세요.env (Docker)BACKUP_COPY_DIR=/backup-copy한 번 백업해서 확인
관리자로 로그인해 설정 → 백업에서 지금 백업을 누르세요. 두 위치 모두 초록색 체크가 떠야 합니다
복원: 먼저 서버 멈추기
서버가 켜져 있으면 복원 명령이 실행되지 않습니다 · 코드에서 실행: 서버 창에서 Ctrl+C · Docker: 코드 폴더에서 아래 명령 실행
Terminal (Docker)docker compose stop api복원할 파일 고르기
파일 이름에 시각과 이유가 있습니다. 예:
payneat-2026-09-29T221530+0700-shift-close.sqlite는 29일 22:15 교대 마감 후 파일입니다 · 코드에서 실행:backend/data/backups폴더 확인 · Docker: 아래 명령으로 목록 보기Terminal (Docker)docker compose run --rm api ls data/backups복원하기
코드에서 실행:
cd backend후npm run db:restore -- data/backups/<파일 이름>· Docker: 아래 명령 · PaynEat이 파일을 먼저 검사하고, 현재 데이터를 항상pre-restore파일로 남기므로 잘못 골라도 되돌릴 수 있습니다Terminal (Docker)docker compose run --rm api npm run db:restore -- data/backups/payneat-2026-09-29T221530+0700-shift-close.sqlite서버 다시 켜기
코드에서 실행:
npm start(또는npm run dev) · Docker: 아래 명령Terminal (Docker)docker compose start api
✅복원 명령이 pre-restore 파일 이름과 함께 Restored … from …을 출력하고, 변경 이력에 백업에서 복원 항목이 생깁니다
명령이 복원을 거부하면
- The PaynEat server is still running
- 먼저 서버를 멈추세요. 정전처럼 기계가 갑자기 꺼졌다면 30초 기다린 뒤 다시 시도하세요
- The backup file is damaged
- 이전 파일이나 두 번째 위치에 있는 같은 이름의 파일을 고르세요
- made by a newer PaynEat
- 더 새로운 PaynEat에서 만든 파일입니다. PaynEat을 먼저 업데이트한 뒤 다시 복원하세요
🔒 백업 파일에는 고객 전화번호와 직원 비밀번호 해시가 있습니다. USB 드라이브는 잠기는 곳에 두고, 공유하거나 클라우드에 올리지 마세요 · Windows 한 줄 설치(데모): PowerShell에서 같은 Docker 명령을 쓰되 docker compose 뒤에 -f "$env:USERPROFILE\PaynEat-Demo\docker-compose.yml"를 붙이세요
어떤 역할로든 로그인
로그인 화면에 모든 데모 계정 버튼이 있어 한 번 누르면 바로 들어갑니다. 입력하실 필요가 없습니다.
| 역할 | 아이디 | 비밀번호 | 볼 수 있는 것 |
|---|---|---|---|
| 관리자 | admin | admin123 | 전부 — 대시보드, 메뉴, 직원, 리포트, 설정 |
| 매니저 | manager | manager123 | 관리자와 같지만 계정 삭제는 불가 |
| 홀 직원 | waiter1 | waiter123 | 테이블 배치도, 주문, 주방 화면 |
| 주방 | kitchen | kitchen123 | 주방 화면만 |
| 캐셔 | cashier | cashier123 | 테이블 배치도, 주문, 리포트 |
| 홀 직원 (2개 지점) | waiter2 | waiter123 | waiter1과 같지만 지점 선택 가능 — 직접 입력, 실제 서버에서만 (방법 2~4) |
직원이 실제로 쓰기 전 체크리스트
위의 데모 계정과 비밀번호는 인터넷에 공개되어 있어서 시스템이 막아 두었습니다: 운영 모드에서 데모 비밀번호가 남아 있으면 서버가 아예 켜지지 않습니다.
항목별 자세한 내용과 취약점 신고 방법: SECURITY.md
JWT_SECRET을 매장 고유의 무작위 값으로 — 예:openssl rand -hex 32.NODE_ENV=production에서는 예시 값이나 32자보다 짧은 값이면 서버가 시작되지 않습니다.- 시작 계정 6개의 비밀번호를 모두 직접 정하거나(
SEED_ADMIN_PASSWORD…SEED_CASHIER_PASSWORD),AUTO_SEED를 끄고 실제 직원 계정을 직접 만드세요. CORS_ORIGIN을*대신 매장의 실제 주소로.- 데이터베이스 파일과
.env는 매장 기기에만 — 업로드하거나 공유하지 마세요.BACKUP_COPY_DIR를 다른 디스크로 지정하고 개점 전에 백업과 복원대로 한 번 복원해 보세요. - Windows 한 줄 설치는 실제 매장에 쓰지 마세요. 체험용 설정입니다.
- PaynEat ERP에 연결한다면
https://주소를 쓰세요. POS는 같은 기기가 아니면 자격 증명을http://로 보내지 않으며,ERP_ALLOW_INSECURE_HTTP는 닫힌 네트워크에서만 씁니다. ERP 인증서를 체인의 내부 CA가 발급했다면 문제 해결의 “PaynEat ERP의 HTTPS 인증서를 신뢰할 수 없습니다”를 보세요.
막히셨나요? 증상을 눌러 보세요
"port is already allocated"가 나와요
다른 프로그램이 3000 또는 8080 포트를 쓰고 있습니다. 그 프로그램(또는 켜 둔 PaynEat)을 닫고 다시 해 보세요.
"Docker Desktop is not running" 또는 "is not installed"가 나와요
필요하면 docker.com에서 Docker Desktop을 설치하고 실행한 뒤, 왼쪽 아래에 Engine running이 뜨면 한 줄을 다시 붙여 넣으세요.
"PaynEat started but is not answering yet"가 나와요
켜졌지만 응답이 늦는 중입니다. 잠시 뒤 http://localhost:8080 을 열어 보시고, 그래도 안 되면 Docker Desktop → Containers → payneat에서 원인을 확인하세요.
Docker가 Flutter 단계에서 오래 멈춰 있어요
처음에는 Flutter SDK 약 2GB를 받습니다. 5~10분 기다려 주세요. 다음부터는 캐시를 씁니다.
화면은 열리는데 로그인이 안 돼요
http://localhost:3000/health 를 열어 보세요. 응답이 없으면 서버가 아직 안 켜진 것입니다. API_BASE_URL을 설정하셨다면 IP를 확인하고, 바꾼 뒤 docker compose up --build를 다시 실행하세요.
휴대폰이나 태블릿이 연결되지 않아요
서버와 같은 와이파이여야 하고, localhost 대신 IP를 쓰고, 방화벽이 8080과 3000 포트를 허용해야 합니다.
Docker에 "required variable JWT_SECRET is missing a value"가 나와요
서버 비밀 값이 아직 없습니다. 방법 3의 "서버 비밀 값 설정" 단계대로 docker-compose.yml 옆에 .env를 만든 뒤 다시 실행하세요.
JWT_SECRET을 설정하라고 나와요
.env가 아직 없습니다. backend에서 cp .env.example .env (Windows: copy) 후 npm run dev를 다시 실행하세요.
설정 화면에 “PaynEat ERP 주소는 https://로 시작해야 합니다”가 나와요
POS는 자격 증명을 https://로만 보냅니다. ERP 관리자에게 ERP의 https:// 주소를 받으세요. http:// 주소는 같은 기기에서 도는 ERP(localhost)에만 쓸 수 있습니다. 업데이트 전에 http://로 연결했다면 POS가 자격 증명 전송을 멈췄으니, 설정에서 https:// 주소와 자격 증명을 다시 저장하세요.
설정 화면에 “PaynEat ERP의 HTTPS 인증서를 신뢰할 수 없습니다”가 나와요
POS 서버가 체인의 ERP 인증서를 발급한 CA를 아직 신뢰하지 않습니다. ERP 관리자에게 CA 파일(PEM)을 받아 먼저 확인하세요: curl --cacert chain-ca.pem https://ERP-주소/health가 "status":"ok"를 돌려줘야 합니다. 그다음 환경에 NODE_EXTRA_CA_CERTS=/경로/chain-ca.pem을 두고 POS 서버를 다시 시작하세요(backend/.env에 넣으면 효과가 없습니다 — Node가 그 파일보다 먼저, 시작할 때 읽습니다). Docker: CA 파일을 api 컨테이너에 마운트하고 docker-compose.override.yml에서 설정하세요. 인증서 검사는 절대 끄지 마세요.
npm install이 better-sqlite3에서 실패해요
빌드 도구가 없습니다. macOS: xcode-select --install · Linux: sudo apt install build-essential python3 · Windows: Visual Studio Build Tools 설치.
데이터를 처음부터 다시 하고 싶어요
방법 2: Reset PaynEat data 더블클릭 · 방법 3: docker compose down -v · 방법 4: cd backend && npm run db:reset
그래도 안 되나요?GitHub Issues 또는 LinkedIn으로 물어봐 주세요 — 쓰신 방법, 운영체제, 화면에 나온 메시지를 함께 알려 주세요.