PaynEat POS설치 안내

PaynEat POS로 매장을 여는 네 가지 방법

맞는 방법을 골라 한 단계씩 따라 하세요. 가입도 비용도 없고, 매장 데이터는 사장님 기기에 그대로 있습니다.

  • 무료 · Apache 2.0
  • 가입 불필요
  • 가지고 계신 기기 그대로
먼저

무엇을 하고 싶으세요?

아직 모르겠다면 첫 번째부터 — 충분히 눌러 보신 뒤에 실제로 설치하셔도 됩니다.

  • 브라우저에서 체험

    소요 시간
    바로
    필요한 것
    브라우저만 있으면 됩니다
    이런 분께
    결정 전에 화면을 보고 직접 눌러 보고 싶은 분
    데모 열기
  • 추천

    Windows 한 줄 설치

    소요 시간
    3~5분
    필요한 것
    Windows + Docker Desktop
    이런 분께
    내 PC에서 실제 시스템을 써 보고 싶은 사장님
    설치 방법 보기
  • Docker로 모든 기기 연결

    소요 시간
    처음 10~15분
    필요한 것
    Docker Desktop (Windows / Mac / Linux)
    이런 분께
    휴대폰·태블릿·주방 화면이 한 서버를 함께 쓰는 매장
    설치 방법 보기
  • 소스에서 실행

    소요 시간
    약 5분
    필요한 것
    Node.js 22 + Flutter 3.35
    이런 분께
    고치거나 확장하고 싶은 개발자
    실행 방법 보기
방법 2 · 사장님께 추천

Windows에 한 줄로 설치

서버, 창 사이 실시간 반영, 가상 저울, PDF 영수증까지 갖춘 실제 시스템을 코드 다운로드나 빌드 없이 — 설치 프로그램이 미리 빌드된 이미지를 받아 옵니다.

소요 시간
3~5분 (처음에 약 200MB 다운로드)
필요한 것
64비트 Windows + Docker Desktop
결과
이 PC의 http://localhost:8080 에서 PaynEat 실행
  1. Docker Desktop 설치 후 실행

    없으시면 docker.com에서 받아 설치하고 실행하세요. 왼쪽 아래에 Engine running이 뜰 때까지 기다립니다.

  2. PowerShell 열기

    Windows 키를 누르고 PowerShell을 입력한 뒤 Enter를 누르세요.

  3. 이 한 줄을 붙여 넣고 Enter

    상자 모서리의 복사를 누르고, PowerShell 창에서 마우스 오른쪽 버튼으로 붙여 넣으세요.

    PowerShell
    [Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object Net.WebClient).DownloadString('https://github.com/SuruchBoss/PaynEat/releases/download/demo/install-demo.ps1'))
  4. 잠시 기다린 뒤 로그인

    브라우저가 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

방법 3 · 매장의 모든 기기

Docker로 실행해 모든 기기 연결하기

서버는 매장 컴퓨터 한 대에 두고, 직원 휴대폰·캐셔 태블릿·주방 화면은 브라우저로 엽니다. 한 기기에서 넣은 주문이 다른 기기의 주방 화면에 바로 뜹니다.

소요 시간
처음 10~15분 (그다음부터는 1분 이내)
필요한 것
Windows, Mac 또는 Linux의 Docker Desktop
결과
같은 와이파이의 모든 기기에서 http://<이 컴퓨터 IP>:8080
  1. 코드 내려받기

    가장 쉬운 방법: ZIP 파일 내려받기 후 압축을 풀면 PaynEat-main 폴더가 생깁니다. git이 있으시면 이렇게 하셔도 됩니다:

    Terminal
    git clone https://github.com/SuruchBoss/PaynEat.git
  2. 이 컴퓨터의 IP 찾기

    Windows: PowerShell에서 ipconfig를 입력하고 IPv4 Address를 보세요. Mac/Linux: ifconfig | grep inet. 192.168.1.15 같은 모양입니다.

  3. 서버 비밀 값 설정

    코드 폴더(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
  4. 앱에 서버 위치 알려 주기

    같은 .env 파일에 이 줄을 추가하세요. 숫자는 사장님 IP로 바꿉니다. 이 컴퓨터에서만 쓰실 거라면 건너뛰셔도 됩니다.

    .env
    API_BASE_URL=http://192.168.1.15:3000
  5. 시작하기

    코드 폴더에서 터미널(Windows는 PowerShell)을 열고 실행하세요. 처음에는 앱을 빌드하느라 5~10분 걸립니다.

    Terminal
    docker compose up --build
  6. 모든 기기에서 열기

    같은 와이파이에서 휴대폰·태블릿·주방 화면으로 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 포트를 허용하는지 확인하세요. 직원이 실제로 쓰기 전에 운영 전 체크리스트를 모두 마쳐 주세요.

방법 4 · 개발자용

소스에서 직접 실행

코드를 고치거나, 요청마다 로그를 보거나, Flutter로 실제 휴대폰에서 돌려 볼 때.

소요 시간
약 5분
필요한 것
Node.js 20 이상(22 권장) + Flutter 3.35 이상
결과
http://localhost:3000 의 API와 Chrome의 앱
  1. 코드 받기

    Terminal
    git clone https://github.com/SuruchBoss/PaynEat.git
    cd PaynEat
  2. 창 1 — 서버

    .env에는 로컬용 JWT_SECRET이 들어 있고, 없으면 서버가 시작되지 않습니다 (Windows는 cp 대신 copy). 데이터베이스와 예시 데이터는 자동으로 만들어집니다.

    Terminal 1
    cd backend
    npm install
    cp .env.example .env
    npm run dev
  3. 창 2 — 앱

    새 창을 여세요. 첫 번째 창은 닫지 마세요.

    Terminal 2
    cd 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일 동안 하루 한 개
복원 방법
서버에서 명령어 실행 (앱에는 복원 버튼이 없음)
설정의 백업 섹션: 마지막 백업 시각, 두 보관 위치, 지금 백업 버튼
관리자 → 설정 → 백업
  1. 다른 디스크에 두 번째 위치 지정

    첫 번째 백업은 데이터베이스와 같은 디스크에 있어 디스크가 고장 나면 둘 다 잃습니다. USB 드라이브를 꽂거나 매장 NAS의 폴더를 쓰고, backend/.env에 아래 줄을 추가(폴더는 본인 것으로)한 뒤 서버를 다시 시작하세요

    backend/.env (코드에서 실행)
    BACKUP_COPY_DIR=E:\PaynEat-backup
  2. Docker: 두 번째 백업을 컨테이너 밖에 두기

    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
  3. 한 번 백업해서 확인

    관리자로 로그인해 설정 → 백업에서 지금 백업을 누르세요. 두 위치 모두 초록색 체크가 떠야 합니다

  4. 복원: 먼저 서버 멈추기

    서버가 켜져 있으면 복원 명령이 실행되지 않습니다 · 코드에서 실행: 서버 창에서 Ctrl+C · Docker: 코드 폴더에서 아래 명령 실행

    Terminal (Docker)
    docker compose stop api
  5. 복원할 파일 고르기

    파일 이름에 시각과 이유가 있습니다. 예: 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
  6. 복원하기

    코드에서 실행: 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
  7. 서버 다시 켜기

    코드에서 실행: 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"를 붙이세요

데모 계정

어떤 역할로든 로그인

로그인 화면에 모든 데모 계정 버튼이 있어 한 번 누르면 바로 들어갑니다. 입력하실 필요가 없습니다.

역할아이디비밀번호볼 수 있는 것
관리자adminadmin123전부 — 대시보드, 메뉴, 직원, 리포트, 설정
매니저managermanager123관리자와 같지만 계정 삭제는 불가
홀 직원waiter1waiter123테이블 배치도, 주문, 주방 화면
주방kitchenkitchen123주방 화면만
캐셔cashiercashier123테이블 배치도, 주문, 리포트
홀 직원 (2개 지점)waiter2waiter123waiter1과 같지만 지점 선택 가능 — 직접 입력, 실제 서버에서만 (방법 2~4)
여러 기기로 함께 써 보기

브라우저 데모는 기기마다 데이터를 따로 저장합니다 — 휴대폰에서 주문해도 다른 태블릿의 주방 화면에는 나타나지 않습니다. 기기 사이로 주문이 오가는 걸 보시려면 방법 3을 쓰시거나, 방법 2의 PC 한 대에서 창을 여러 개 여세요. 오른쪽 위 지구본 버튼으로 로그인 전에도 ไทย / English / 한국어를 바꿀 수 있습니다.

운영 전 확인

직원이 실제로 쓰기 전 체크리스트

위의 데모 계정과 비밀번호는 인터넷에 공개되어 있어서 시스템이 막아 두었습니다: 운영 모드에서 데모 비밀번호가 남아 있으면 서버가 아예 켜지지 않습니다.

항목별 자세한 내용과 취약점 신고 방법: 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으로 물어봐 주세요 — 쓰신 방법, 운영체제, 화면에 나온 메시지를 함께 알려 주세요.