Crater Docker 설치 가이드: 인보이스 및 비용 관리 시스템 자체 호스팅




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

설치 마법사

첫 접속 시 설치 마법사가 나타납니다:

  1. 환경 체크: PHP 확장 및 디렉토리 권한 확인
  2. 데이터베이스 설정:
    • Host: db
    • Port: 3306 (MySQL) 또는 5432 (PostgreSQL)
    • Database: crater
    • Username: crater
    • Password: .env에서 설정한 값
  3. 관리자 계정 생성: 이메일, 이름, 비밀번호 설정
  4. 회사 정보: 회사명, 주소, 로고 등 입력

고급 설정

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 연동

  1. Settings > Payment Gateways 이동
  2. Stripe 활성화
  3. Stripe 대시보드에서 API 키 획득:
    • Publishable Key
    • Secret Key
  4. Crater에 키 입력

PayPal 연동

  1. PayPal Developer에서 앱 생성
  2. Client ID, Secret 획득
  3. 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 앱을 제공합니다:

  1. 앱 스토어에서 “Crater Invoice” 검색 및 설치
  2. 앱 실행 후 “Self-hosted” 선택
  3. 서버 URL 입력 (예: https://invoice.yourdomain.com)
  4. 관리자 계정으로 로그인

문제 해결

권한 오류

# 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



댓글 남기기