Crater는 Laravel과 Vue.js로 구축된 현대적인 오픈소스 인보이스 및 비용 관리 플랫폼입니다. 깔끔하고 직관적인 UI로 인보이스 생성, 결제 추적, 비용 관리, 예상 견적까지 소규모 비즈니스에 필요한 모든 재무 관리 기능을 제공합니다. iOS/Android 앱으로 어디서든 접근 가능하며, 완전한 데이터 소유권을 유지할 수 있습니다.
Crater 주요 특징
Crater는 심플하면서도 강력한 인보이스 솔루션을 제공합니다.
인보이스 관리
- 커스터마이즈 가능한 인보이스 템플릿
- PDF 생성 및 이메일 발송
- 반복 인보이스 자동화
- 다중 통화 지원
- 인보이스 상태 추적
결제 및 비용
- Stripe, PayPal, RazorPay 등 결제 게이트웨이
- 부분 결제 지원
- 비용 추적 및 카테고리 관리
- 세금 계산 자동화
- 결제 리마인더
견적 및 보고서
- 견적서 생성 및 발송
- 견적서 → 인보이스 변환
- 매출/비용 대시보드
- 재무 보고서 생성
- 고객별/기간별 분석
추가 기능
- 고객 포털 (클라이언트 로그인)
- iOS/Android 모바일 앱
- REST API
- 다국어 지원
- 커스텀 필드
사전 요구 사항
- Docker 및 Docker Compose 설치
- 최소 1GB RAM
- 5GB 이상 저장 공간
Docker Compose로 Crater 설치
공식 저장소 클론 방식
# 저장소 클론
git clone https://github.com/crater-invoice/crater.git
cd crater
# 환경 파일 생성
cp .env.example .env
# 컨테이너 빌드 및 실행
docker compose up -d
# 초기 설정 스크립트 실행
./docker-compose/setup.sh
# 브라우저에서 http://localhost 접속
커스텀 Docker Compose 설정
# docker-compose.yml
services:
app:
build:
context: ./
dockerfile: Dockerfile
container_name: crater-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- crater-net
depends_on:
- db
nginx:
image: nginx:1.21-alpine
container_name: crater-nginx
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
- crater-net
depends_on:
- app
db:
image: mysql:8.0
container_name: crater-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE:-crater}
MYSQL_USER: ${DB_USERNAME:-crater}
MYSQL_PASSWORD: ${DB_PASSWORD:-crater}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-root}
volumes:
- db-data:/var/lib/mysql
networks:
- crater-net
redis:
image: redis:alpine
container_name: crater-redis
restart: unless-stopped
networks:
- crater-net
volumes:
db-data:
networks:
crater-net:
driver: bridge
PostgreSQL 버전 Docker Compose
# docker-compose.yml
services:
app:
build:
context: ./
dockerfile: Dockerfile
container_name: crater-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- crater-net
depends_on:
- db
nginx:
image: nginx:1.21-alpine
container_name: crater-nginx
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
- crater-net
db:
image: postgres:14
container_name: crater-db
restart: unless-stopped
environment:
POSTGRES_DB: crater
POSTGRES_USER: crater
POSTGRES_PASSWORD: crater
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- crater-net
redis:
image: redis:alpine
container_name: crater-redis
restart: unless-stopped
networks:
- crater-net
volumes:
postgres-data:
networks:
crater-net:
driver: bridge
환경 변수 파일
# .env
APP_NAME=Crater
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://localhost:8080
# 데이터베이스 설정
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=crater
DB_USERNAME=crater
DB_PASSWORD=your_secure_password
DB_ROOT_PASSWORD=your_secure_root_password
# Redis 설정
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
# 세션/캐시
SESSION_DRIVER=redis
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
# 메일 설정
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=587
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@yourdomain.com
MAIL_FROM_NAME="${APP_NAME}"
# 도메인 설정 (세션용)
SANCTUM_STATEFUL_DOMAINS=localhost:8080
SESSION_DOMAIN=localhost
설치 및 실행
# 저장소 클론
git clone https://github.com/crater-invoice/crater.git
cd crater
# 환경 파일 생성
cp .env.example .env
# UID 확인 (docker-compose.yml에서 필요)
id -u
# 출력된 UID가 docker-compose.yml의 user 설정과 일치하는지 확인
# 컨테이너 빌드 및 실행
docker compose up -d
# 초기 설정 스크립트 실행
./docker-compose/setup.sh
# 또는 수동으로 설정
docker compose exec app composer install
docker compose exec app php artisan key:generate
docker compose exec app php artisan migrate
docker compose exec app php artisan db:seed
# 로그 확인
docker compose logs -f app
# 브라우저에서 접속
# http://localhost:8080
설치 마법사
첫 접속 시 설치 마법사가 나타납니다:
- 환경 체크: PHP 확장 및 디렉토리 권한 확인
- 데이터베이스 설정:
- Host:
db - Port:
3306(MySQL) 또는5432(PostgreSQL) - Database:
crater - Username:
crater - Password:
.env에서 설정한 값
- Host:
- 관리자 계정 생성: 이메일, 이름, 비밀번호 설정
- 회사 정보: 회사명, 주소, 로고 등 입력
고급 설정
Traefik 리버스 프록시 연동
# docker-compose.yml
services:
nginx:
labels:
- "traefik.enable=true"
- "traefik.http.routers.crater.rule=Host(`invoice.yourdomain.com`)"
- "traefik.http.routers.crater.entrypoints=websecure"
- "traefik.http.routers.crater.tls.certresolver=letsencrypt"
- "traefik.http.services.crater.loadbalancer.server.port=80"
networks:
- traefik-public
- crater-net
networks:
traefik-public:
external: true
자동 백업 설정
# docker-compose.yml에 추가
services:
db-backup:
image: mysql:8.0
container_name: crater-db-backup
volumes:
- ./backups:/backups
- /etc/localtime:/etc/localtime:ro
environment:
MYSQL_HOST: db
MYSQL_DATABASE: crater
MYSQL_USER: crater
MYSQL_PASSWORD: your_secure_password
entrypoint: |
bash -c 'while true; do
mysqldump -h$$MYSQL_HOST -u$$MYSQL_USER -p$$MYSQL_PASSWORD $$MYSQL_DATABASE > /backups/crater_$$(date +%Y%m%d_%H%M%S).sql
find /backups -name "*.sql" -mtime +7 -delete
sleep 86400
done'
networks:
- crater-net
depends_on:
- db
Cron 작업 설정
반복 인보이스 등의 기능을 위해 Cron이 필요합니다:
# docker-compose.yml에 추가
services:
cron:
build:
context: ./
dockerfile: ./docker-compose/cron.dockerfile
container_name: crater-cron
restart: unless-stopped
volumes:
- ./:/var/www
networks:
- crater-net
depends_on:
- app
- db
또는 호스트 시스템에 Cron 추가:
# crontab -e
* * * * * cd /path/to/crater && docker compose exec -T app php artisan schedule:run >> /dev/null 2>&1
관리 명령어
# 아티즌 명령어 실행
docker compose exec app php artisan migrate
docker compose exec app php artisan cache:clear
docker compose exec app php artisan config:clear
# 큐 워커 실행
docker compose exec app php artisan queue:work
# 데이터베이스 백업
docker compose exec db mysqldump -u crater -p crater > backup.sql
# 데이터베이스 복원
docker compose exec -T db mysql -u crater -p crater < backup.sql
# 로그 확인
docker compose logs -f app
docker compose logs -f nginx
# 컨테이너 재시작
docker compose restart app nginx
결제 게이트웨이 설정
Stripe 연동
- Settings > Payment Gateways 이동
- Stripe 활성화
- Stripe 대시보드에서 API 키 획득:
- Publishable Key
- Secret Key
- Crater에 키 입력
PayPal 연동
- PayPal Developer에서 앱 생성
- Client ID, Secret 획득
- Crater에서 PayPal 설정
업그레이드 절차
# 1. 백업 생성
docker compose exec db mysqldump -u crater -p crater > backup_$(date +%Y%m%d).sql
# 2. 최신 코드 풀
git pull origin master
# 3. 컨테이너 재빌드
docker compose build app
# 4. 컨테이너 재시작
docker compose up -d
# 5. 마이그레이션 실행
docker compose exec app php artisan migrate --force
# 6. 캐시 클리어
docker compose exec app php artisan optimize:clear
모바일 앱 연결
Crater는 iOS/Android 앱을 제공합니다:
- 앱 스토어에서 “Crater Invoice” 검색 및 설치
- 앱 실행 후 “Self-hosted” 선택
- 서버 URL 입력 (예:
https://invoice.yourdomain.com) - 관리자 계정으로 로그인
문제 해결
권한 오류
# storage 및 bootstrap/cache 권한 설정
docker compose exec app chmod -R 775 storage bootstrap/cache
docker compose exec app chown -R www-data:www-data storage bootstrap/cache
데이터베이스 연결 오류
# 데이터베이스 컨테이너 상태 확인
docker compose ps db
# 데이터베이스 로그 확인
docker compose logs db
# 연결 테스트
docker compose exec app php artisan migrate:status
마무리
Crater는 소규모 비즈니스와 프리랜서를 위한 깔끔하고 현대적인 인보이스 솔루션입니다. Laravel과 Vue.js의 조합으로 빠르고 반응성 좋은 UI를 제공하며, 모바일 앱으로 어디서든 인보이스를 관리할 수 있습니다. Docker를 통해 쉽게 자체 호스팅할 수 있으며, 데이터의 완전한 소유권을 유지하면서 비용을 절약할 수 있습니다.
참고 링크
- 공식 사이트: https://craterapp.com
- GitHub: https://github.com/crater-invoice/crater
- 문서: https://docs.craterapp.com
- 데모: https://demo.craterapp.com