Bops
A team of AI bots that runs your business ops: inbox, pipeline, invoices, reports. Each one has its own computer, email and phone number, and remembers everything.
회의실 등 교회 장소 예약 시스템
Translation pending
BusinessTypeScript · JavaScriptGitHub @Bethel-Church-of-OregonOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
교회 회의실 및 장소를 온라인으로 예약하고 관리할 수 있는 웹 애플리케이션입니다.Read the full README ↗
교회 회의실 및 장소를 온라인으로 예약하고 관리할 수 있는 웹 애플리케이션입니다.
예약·변경·취소가 일어나면 신청자에게 확인 메일이 가고, 담당자에게는 문자와 텔레그램이 함께 발송됩니다. 세 채널은 서로 독립적이라 하나가 설정되지 않았거나 실패해도 나머지는 정상 동작하며, 어느 쪽이 실패하든 예약 자체는 성공합니다.
전체는 1개월 전부터 보여줍니다고형석 청년부). 탭을 바꿔도 검색어가 유지됩니다예약 목록 탭에서 반복 예약은 1행으로 묶여 표시되고, 시리즈 취소 버튼으로 오늘 이후 회차를 한 번에 취소할 수 있습니다. 회차별 수정·삭제는 전체 탭에서 합니다| 항목 | 내용 |
|---|---|
| 프레임워크 | Next.js 14 (App Router) |
| 언어 | TypeScript |
| 스타일 | Tailwind CSS |
| 데이터베이스 | Vercel Postgres (Neon) |
| 이메일 | Nodemailer + Gmail SMTP |
| 문자 | Twilio |
| 텔레그램 | Telegram Bot API |
| 요청 제한 | Upstash Redis (선택) |
npm install
.env.local 파일을 만들어 설정합니다. Postgres 연결과 관리자 비밀번호만 있으면 앱이 동작하며, 나머지는 해당 기능만 건너뜁니다.
# ── 필수 ──────────────────────────────────────────────
# Vercel Marketplace에서 Neon 연동 시 자동 주입됩니다 (DATABASE_URL도 인식)
POSTGRES_URL=postgres://...
ADMIN_PASSWORD=원하는비밀번호
# ── 이메일 (미설정 시 메일만 건너뜀) ──────────────────
GMAIL_USER=보내는주소@gmail.com
GMAIL_APP_PASSWORD=앱비밀번호16자리
# ── 문자 (셋 중 하나라도 없으면 문자만 건너뜀) ────────
TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=
TWILIO_FROM_NUMBER=+15035551234
# ── 텔레그램 (둘 중 하나라도 없으면 텔레그램만 건너뜀) ─
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=-1001234567890
# ── 요청 제한 (미설정 시 제한 없음) ───────────────────
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=
# ── 자동 백업 (미설정 시 백업 라우트가 스스로 비활성화) ─
CRON_SECRET=
로컬 개발: Neon 대시보드 또는 Vercel 프로젝트 설정에서
POSTGRES_URL을 복사해 붙여넣으세요.
UPSTASH_*를 설정하지 않으면 요청 제한이 전혀 걸리지 않습니다. 관리자 로그인 시도와 예약·취소 요청이 무제한이 되므로, 프로덕션에서는 반드시 확인하세요.
GMAIL_APP_PASSWORD에 입력 (공백 없이)/newbot → 발급된 토큰을 TELEGRAM_BOT_TOKEN에 입력https://api.telegram.org/bot<토큰>/getUpdates 를 열어 chat.id 확인TELEGRAM_CHAT_ID에 입력 — 그룹은 -100…으로 시작하는 음수이며, 마이너스 기호를 빠뜨리면 chat not found가 납니다npm run dev
브라우저에서 http://localhost:8000 으로 접속합니다.
npm run build
npm start
POSTGRES_URL이 자동 주입됩니다Neon 무료 플랜은 시점 복구가 6시간뿐입니다. 월요일에 지운 데이터를 수요일에 알아차리면 복구할 수 없으므로, 파괴적인 작업을 하기 전에는 반드시 백업하세요.
npm run backup # backups/<타임스탬프>/ 로 내보내기
npm run restore -- backups/<폴더> # 미리보기 (아무것도 쓰지 않음)
npm run restore -- backups/<폴더> --yes # 실제 복원
npm run restore -- ~/받은메일/backup-2026-09-01.json --yes
vercel.json 크론). Vercel 함수에는 영구 저장소가 없어 메일 첨부를 쓰며, 받은편지함이 오프사이트 사본 역할을 합니다backup-<날짜>.json, 엑셀용 reservations-<날짜>.csvbackups/는 git 추적 대상이 아닙니다)/)/reserve)| 항목 | 필수 | 비고 |
|---|---|---|
| 제목 | ✅ | |
| 장소 | ✅ | |
| 날짜 | ✅ | 일반 사용자: 오늘부터 1달 이내 |
| 예약 시간 (15분 단위) | ✅ | |
| 담당자 | ✅ | |
| 이메일 | ✅ | 취소·변경 시 본인 확인에 쓰입니다 |
| 예약 코드 | — | 관리자가 코드를 설정한 경우에만 표시 |
| 반복 (없음/매일/매주/매월) | — | 관리자만 표시 |
| 반복 종료일 | — | 반복 선택 시 필수 (관리자 전용) |
| 기타 노트 | — |
신청 즉시 확정되며 입력한 이메일로 확인 메일이 발송됩니다.
/admin)비밀번호로 로그인합니다. 세션은 12시간 후 서버에서 만료되며, 브라우저를 닫으면 재접속 시 비밀번호를 다시 입력해야 합니다.
시리즈 취소 가능, 개별 건은 변경·삭제
전체탭이 1개월까지만 보여주므로, 더 오래된 예약은 관리자 화면에 나타나지 않습니다. 데이터는 그대로 남아 있으며 월간 백업 CSV에서 확인할 수 있습니다.
비전홀과 은혜성전 두 건물, 총 21개입니다. 이 중 2개(비전홀 유아부실·유치부실)는 은퇴 처리되어 일반 사용자에게는 보이지 않고 관리자만 선택할 수 있습니다. 기존 예약은 캘린더에 그대로 남습니다.
| # | 장소 | # | 장소 |
|---|---|---|---|
| 1 | 비전홀 대예배실 | 12 | 비전홀 2층 초등부 교사실 |
| 2 | 비전홀 새가족실 | 13 | 비전홀 2층 메자닌 |
| 3 | 비전홀 영아실(자모실) | 14 | 은혜성전 예배실 |
| 4 | 비전홀 유아부실 (숨김) | 15 | 은혜성전 친교실 |
| 5 | 비전홀 유치부실 (숨김) | 16 | 은혜성전 2층 교실 302 |
| 6 | 비전홀 찬양대실 | 17 | 은혜성전 2층 교실 303 |
| 7 | 비전홀 2층 교실 1 | 18 | 은혜성전 2층 교실 305 |
| 8 | 비전홀 2층 교실 2 | 19 | 은혜성전 2층 교실 306 |
| 9 | 비전홀 2층 교실 3 | 20 | 은혜성전 청년부실 |
| 10 | 비전홀 2층 교실 4 | 21 | 은혜성전 (구)부교역자실 |
| 11 | 비전홀 2층 올리브홀(초등부) |
표시 순서는 src/lib/db.ts의 ROOM_ORDER 배열이 정합니다.
rooms 테이블을 비울 필요는 거의 없습니다. 예약이 장소를 참조하므로 테이블을 비우면 예약까지 함께 사라집니다.
| 하려는 일 | 방법 |
|---|---|
| 이름 변경 | src/lib/db.ts에 마이그레이션 추가 → 기존 예약이 그대로 붙어 있습니다 |
| 순서 변경 | ROOM_ORDER 배열 수정 → 재시작하면 적용됩니다 |
| 은퇴(숨김) | Neon 콘솔에서 UPDATE rooms SET hidden = true WHERE name = '...' |
| 추가 | 시드 배열과 ROOM_ORDER에 함께 추가 |
영문 표시 이름은 src/lib/i18n.ts의 roomNameMap에도 함께 넣어야 합니다. 넣지 않으면 영어 모드에서 한국어 이름이 그대로 나옵니다.
전체 초기화가 정말 필요하다면 npm run backup을 먼저 실행하세요.