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,963E2E 검증 항목 · 전부 통과
8동봉 플러그인
5동봉 테마
96기록된 설계 결정(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은 그 편의성을 되찾는 프로젝트입니다.

📦

설치 방법이 두 가지

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

🔄

마이그레이션은 자동

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

🧩

ZIP 업로드로 확장

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

🎨

테마 다섯 벌이 함께 옵니다

커뮤니티·신문·쇼핑몰(카페24식)·편집샵·기업 홈페이지. 같은 게시판·상품 화면이 다섯 인상으로 그려집니다. 적용 전에 내 사이트 내용으로 미리보기(폭 전환까지)를 볼 수 있고, 테마는 빌드 없는 런타임 템플릿(HTML)이라 React 를 몰라도 만들 수 있습니다.

🛍️

쇼핑몰이 처음부터 쇼핑몰답게

설치 때 쇼핑몰을 고르면 카페24식 3단 헤더 테마가 켜지고, 배너 슬라이드·상품 격자·인기 상품 진열이 있는 홈이 만들어집니다. NEW·BEST·할인율 뱃지, 퀵메뉴, 2단 카테고리 메뉴, 사이트 전체 띠배너까지 — 샘플 상품까지 들어 있어 첫 화면이 비어 있지 않습니다.

🖼️

올린 사진을 알아서 손질합니다

휴대폰 사진(4000px·4MB)을 그대로 두지 않습니다. 2400px 이내로 줄이고 목록용 썸네일을 만들며, EXIF 의 촬영 위치를 지웁니다 — 손님이 올린 사진에 집 주소가 붙어 공개되지 않게. 이미 쌓인 사진도 도구 한 번으로 채웁니다.

⚡

PostgreSQL 하나면 충분

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

🔍

SEO는 설계 전제

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

🧪

실제 서버로 검증

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

📐

결정의 이유가 남아 있다

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

비교

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

항목기존 PHP 게시판WordPressBrick
언어PHPPHPTypeScript
DBMySQLMySQLPostgreSQL
설치FTP 업로드FTP 업로드Docker 한 줄 · 또는 FTP 업로드
업데이트파일 수동 교체관리자 클릭파일 교체 + 자동 마이그레이션
플러그인제한적ZIP 업로드ZIP 업로드
테마스킨(PHP)테마(PHP)런타임 템플릿(빌드 없음) · 동봉 5벌 · 적용 전 미리보기
업로드 이미지썸네일(GD)썸네일축소 · 썸네일 · EXIF 위치 제거 · 기존 파일 백필
저장형 XSS 방어새니타이저새니타이저새니타이저 + CSP(외부 스크립트 차단, 확장이 출처를 선언)
페이지 빌더없음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 까지

완성형 정의 네 문장의 코드 요건은 전부 충족됐습니다. 최신 릴리스는 v0.3.0 — 배포본과 Docker 이미지(ghcr.io/bonjin-app/brick, amd64·arm64)가 태그마다 함께 나옵니다. npm 공개는 플러그인 SDK 에만 해당하며 보류 중(ADR-92) — 완성형 정의와 로드맵

🤝 함께

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