Brick

Brick

파일만 올리면 돌아갑니다. 속은 현대적으로.
Docker 한 줄, 또는 FTP 업로드로 설치하는 오픈소스 CMS.

Next.js · NestJS · PostgreSQL · TypeScript

# Docker — 명령 세 줄
curl -O https://raw.githubusercontent.com/bonjin-app/brick/main/docker-compose.yml
echo "BRICK_SECRET=$(openssl rand -base64 32)" > .env
docker compose up -d

# 또는 FTP 업로드 — 빌드 불필요
# 배포본을 올리고 실행하면 브라우저에서 설치
node server.js

# → 사이트에 접속하면 설치 화면
2,479E2E 검증 항목 · 전부 통과
8동봉 플러그인
77기록된 설계 결정(ADR)
MIT라이선스
설치하면 이미 사이트

빈 화면이 아니라, 돌아가는 사이트로 시작합니다

설치할 때 사이트 유형을 고르면 홈·페이지·게시판·메뉴가 통째로 만들어집니다. 할 일은 내용을 자기 것으로 바꾸는 것뿐입니다.

mysite.com
📌최신글 모아보기 3단

커뮤니티

게시판 3개 + 최신글 홈 + 메뉴가 연결된 채로 시작

myshop.com
🛍️새로 나온 상품 4단
📢공지사항 5건

쇼핑몰

상품 목록 홈 + 교환·반품 안내의 뼈대까지 함께

company.com
💬1:1 문의 접수 화면

회사 홈페이지

소개·서비스·공지·1:1 문의가 메뉴로 연결된 채로

만들어진 것은 전부 일반 페이지·게시판·메뉴입니다 — 페이지 빌더에서 그대로 수정합니다. 직접 만들고 싶다면 빈 사이트를 고르면 됩니다.

실제 화면

설치 5분 뒤의 모습입니다

아래는 쇼핑몰 스타터로 설치한 직후, 상품 네 개를 등록한 실제 화면입니다. 꾸민 목업이 아니라 그대로의 스크린샷입니다.

공개 홈 — 상품 그리드와 공지사항
공개 사이트 홈 — 스타터가 만든 페이지에 상품·공지가 자동으로 흐릅니다
상품 상세 — 가격·재고·후기·문의
상품 상세 — 할인 표시 · 재고 · 장바구니 · 후기/문의 탭까지 기본
관리자 대시보드 — 오늘의 방문자·주문·글·문의 카드
관리자 첫 화면 — 오늘의 방문자·주문·글·문의를 플러그인이 카드로 올립니다
페이지 빌더 편집 화면
페이지 빌더 — 블록을 쌓아 페이지를 만들고 SEO까지 한 화면에서
한국에서 운영해도 안전하게

법을 시스템이 지킵니다

한국에서 사이트·쇼핑몰을 운영하면 지켜야 하는 것들이 있습니다. Brick은 운영자가 실수로도 어길 수 없게 만들었습니다.

📜

약관 · 개인정보 동의

가입 시 필수 동의, 개정 시 재동의, 동의 이력 보존. IP는 해시로만 저장합니다.

↩️

청약철회 7일 · 반품

사유별 반송비 부담(불량은 사업자 — 고객 청구는 위법), 물건을 받기 전에는 환불되지 않습니다.

📧

광고 메일 규정

광고는 동의자에게만 — 끌 수 없는 조건입니다. (광고) 표기 강제, 로그인 없는 수신거부, 발송 직전 동의 재확인.

🧾

현금영수증 · 세금계산서

카드 결제 이중 발급 거부, 면세 상품 금액 분해, 반품 시 증빙 자동 취소, 부가세 신고 자료.

🗑️

회원 탈퇴 = 파기

개인정보는 파기하고 법정 보존 의무가 있는 주문 기록만 작성자를 끊고 남깁니다.

🏢

사업자정보 표시

사업자등록번호 체크섬을 실제로 검증하고 테마가 자동으로 렌더합니다.

왜 만들었나

PHP CMS의 장점은 언어가 아니라 배포 편의성이었다

오래 살아남은 CMS 들의 공통점은 언어가 좋아서가 아니라, 파일을 올리면 그냥 돌아갔기 때문입니다. 현대 스택은 강력하지만 설치가 어려워졌습니다. Brick은 그 편의성을 되찾는 프로젝트입니다.

📦

설치 방법이 두 가지

Dockerdocker compose up -d 한 줄. FTP는 파일을 올리고 브라우저에서 DB 정보만 입력하면 됩니다.

🔄

마이그레이션은 자동

docker compose pull && up -d 또는 파일 덮어쓰기 후 재시작. DB 스키마는 부팅할 때 스스로 최신으로 맞춥니다.

🧩

ZIP 업로드로 확장

워드프레스와 똑같습니다. 관리자에서 plugin.zip / theme.zip을 올리면 설치됩니다. 서버에서 빌드하지 않습니다.

🎨

테마는 빌드가 없다

테마는 런타임 템플릿(HTML)입니다. React를 몰라도 만들 수 있고, 업로드하면 즉시 반영됩니다.

PostgreSQL 하나면 충분

Redis 없이 동작합니다. 캐시·큐·락을 PostgreSQL로 구현하고, Redis는 규모가 커질 때 켜는 선택지입니다.

🔍

SEO는 설계 전제

테마가 문서 전체를 소유하는 SSR입니다. 검색엔진은 완성된 HTML을 그대로 받습니다.

🧪

실제 서버로 검증

E2E 스모크 2,479개가 실제 PostgreSQL과 실제 서버 프로세스를 띄워 돕니다. 재고 동시성·금액 위조·저장형 XSS·로그인 CSRF처럼 틀리면 돈이나 계정을 잃는 경로를 항목으로 못박아 두었습니다.

📐

결정의 이유가 남아 있다

설계 결정 77건을 ADR로 기록했습니다. "왜 이렇게 되어 있나"에 답할 수 있는 코드가 오래 삽니다.

비교

설치형 CMS로서 무엇을 지키고 무엇을 바꿨는지.

항목기존 PHP 게시판WordPressBrick
언어PHPPHPTypeScript
DBMySQLMySQLPostgreSQL
설치FTP 업로드FTP 업로드Docker 한 줄 · 또는 FTP 업로드
업데이트파일 수동 교체관리자 클릭파일 교체 + 자동 마이그레이션
플러그인제한적ZIP 업로드ZIP 업로드
테마스킨(PHP)테마(PHP)런타임 템플릿(빌드 없음)
페이지 빌더없음Gutenberg코어 기본 제공
게시판핵심 기능플러그인첨부 · 권한 · 답변형 · 비밀글
쇼핑몰별도 설치WooCommerce플러그인 기본 동봉
상품 후기쇼핑몰 패키지에 포함플러그인구매 검증 · 판매자 답변
포인트 · 적립금둘로 나뉘어 있음플러그인한 원장에서 · 만료 · FIFO
소셜 로그인플러그인플러그인코어 내장 (5종 + 사내 SSO)
방문자 집계있음 (IP 원문 저장)플러그인있음 (IP를 해시로만 저장)
약관 동의·이력있음플러그인개정 시 재동의 · IP는 해시로만
회원 탈퇴있음있음파기 + 주문은 법정 보존(5년)
1:1 문의있음 (게시판 기반)플러그인전용 · 기본이 비공개
FAQ있음플러그인검색 · 조회수 · 유용성 평가
설문조사있음플러그인IP를 해시로만 · 결과 공개 시점 선택
사업자정보 표시있음플러그인사업자번호 체크섬 검증 · 테마 자동 렌더
위시리스트보관함플러그인비회원도 사용 · 로그인 시 이어받기
지역별 배송비있음플러그인우편번호 구간 (주소 문자열 아님)
주문 취소·반품·교환쇼핑몰 패키지에 포함WooCommerce상품 단위 · 할인 안분 · 청약철회 7일
기존 사이트 데이터 이전회원·게시글·상품·주문 · 비밀번호 보존
sitemap.xml별도 플러그인플러그인(Yoast 등)코어 내장 · 플러그인이 URL 제공
SSR / SEO기본기본Next.js SSR + ISR
타입 안전성없음없음전 구간 strict
API제한적RESTREST · OpenAPI 자동 생성 (라우트에서)
다국어언어팩 부분 지원기본ko/en — 공개 · 관리 · 플러그인 전부
관리자 대시보드있음있음오늘 방문자·주문·글·문의 — 플러그인이 카드 등록

Brick은 순수 PHP 호스팅(Node 없음)에서는 동작하지 않습니다 — Node 런타임이 필요합니다. Docker, 또는 Node.js를 지원하는 호스팅(cPanel/Plesk의 "Node.js App", VPS)이 필요합니다. 그 환경이라면 FTP로 올려서 브라우저에서 설치하는 방식이 동작합니다.

구조

사용자에게는 앱 컨테이너 하나와 PostgreSQL 하나로 보입니다.

              사용자 / 검색엔진
                     │  :3000  (유일한 공개 포트)
              ┌──────▼──────┐
              │   Next.js   │  SSR · ISR · 관리자 UI
              └──────┬──────┘
                     │  :3001  (내부 전용)
              ┌──────▼──────────────────────┐
              │      Brick Runtime          │
              │   NestJS · 단일 프로세스     │
              │  ┌───────────────────────┐  │
              │  │ Core    HookBus       │  │
              │  │ Plugins 동적 로드      │  │
              │  │ Themes  런타임 템플릿  │  │
              │  └───────────────────────┘  │
              └──────┬──────────────────────┘
                     │
                PostgreSQL     ← 유일한 필수 의존성
         (Redis · S3는 선택 — 없으면 PG 기반 기본 구현)

확장 만들기

플러그인은 사전 빌드된 JS, 테마는 HTML. 둘 다 ZIP으로 배포합니다.

  1. 템플릿으로 시작npm create brick-plugin my-plugin — 빈 껍데기가 아니라 동작하는 방명록이 나옵니다. 라우트·블록·관리 화면·마이그레이션·개인정보 파기까지 계약 전부를 한 번씩 씁니다.
  2. 플러그인 = 라우트 + 블록 + 훅definePlugin((ctx) => { ctx.registerRoute(...); ctx.registerBlock(...) }) 하나로 REST API와 페이지 빌더 블록을 등록합니다. 관리 화면은 선언 한 번으로 자동 생성됩니다.
  3. 자기 테이블을 소유한다플러그인에 migrations/*.sql을 담으면 활성화 시점에 자동 적용됩니다. 코어 스키마를 건드리지 않습니다.
  4. 테마는 템플릿 문법 4개면 끝{{ 변수 }}, {{{ HTML }}}, {{#if}}, {{#each}}. 로직이 필요하면 블록으로 만듭니다.
  5. 업로드하면 즉시 동작, 배포는 레지스트리로관리자에서 ZIP을 올리고 활성화만 누르면 됩니다. 레지스트리에 올리면 다른 사이트가 클릭으로 설치하고, Ed25519 서명과 키 고정이 위조 업데이트를 막습니다. API 전체는 /api/docs 에 자동 문서화됩니다.
개발 중

지금 상태

Brick은 초기 개발 단계입니다. 아래 기능은 동작하며, 프로덕션 사용 전 검토를 권합니다.

✅ 동작

설치 마법사(사이트 유형 스타터) · 회원(약관 동의 · 이메일 인증 · 탈퇴 · 휴면 · 2단계 인증 · 세션 관리 · 위험 작업 재인증 · 관리자 IP 제한) · 소셜 로그인 · 페이지 빌더 · 미디어 · 메뉴(연결 대상 선택) · 통합검색 · 검색 분석 · 게시판 · 쪽지 · 포인트 · 1:1 문의 · FAQ · 설문조사 · 방문자 집계 · 팝업/배너 · 단체메일 · 쇼핑몰(후기 · 옵션 · 취소/반품/교환 · 위시리스트 · 지역별 배송비 · 관련 상품 · 재입고 알림 · 기획전 · 회원 등급 · 쿠폰함 · 정기결제) · 결제(토스페이먼츠) · 개인결제 · 판매 리포트 · 현금영수증 · 세금계산서 · 부가세 자료 · 데이터 이전(이미지 주소 자동 변환) · 원클릭 업데이트(Ed25519 서명) · 플러그인 레지스트리 · OpenAPI 문서 · 개발 템플릿 · sitemap.xml · 감사 로그 · 자동 마이그레이션 · 백업 CLI

🚧 1.0 까지

완성형 정의 네 문장의 코드 요건은 전부 충족됐습니다. 다국어(i18n)까지 닫혔습니다. 남은 것: SDK npm 공개 · 첫 릴리스 — 완성형 정의와 로드맵

🤝 함께

설치가 안 되는 것이 가장 중요한 버그입니다. 버그 신고 · 기능 제안 · 기여 가이드. MIT 라이선스입니다.