{"_id":"@chuseok22/infra-automation","name":"@chuseok22/infra-automation","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.2":{"name":"@chuseok22/infra-automation","version":"0.1.2","description":"PostgreSQL/MongoDB/Redis Docker 컨테이너 자동 세팅을 포함한 인프라 자동화 CLI","type":"module","bin":{"infra-automation":"dist/index.js"},"engines":{"node":">=18.18.0"},"scripts":{"build":"tsc && node scripts/postbuild.mjs","prepublishOnly":"npm run build","test":"vitest run --passWithNoTests","test:watch":"vitest","test:coverage":"vitest run --coverage --passWithNoTests"},"dependencies":{"@inquirer/prompts":"^5.3.0","commander":"^12.1.0","picocolors":"^1.0.1"},"devDependencies":{"@types/node":"^20.14.0","@vitest/coverage-v8":"^1.6.0","typescript":"^5.5.0","vitest":"^1.6.0"},"gitHead":"b1cb803bd8637b3e52087fffe5c9945a7596b363","_id":"@chuseok22/infra-automation@0.1.2","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-PvFu+6ji5CsTSwS55ce8eK1+1ZR5oQxjYEwMQlViWS0RLjeBaJRKEauJoe5IVEzLSeX6yJlhcl/DTDVEgtZMzQ==","shasum":"9ad5587038a5dfeb42667fc5be0a9334728eca72","tarball":"https://registry.npmjs.org/@chuseok22/infra-automation/-/infra-automation-0.1.2.tgz","fileCount":20,"unpackedSize":42403,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHYDysAZchmd6JEd+AiIxkF4ZLhUc5bWwXWPCLL5p10yAiAuBljyLneJTOEg81XBKw7rJOBhOWwo6PGcWg+S2rcmeQ=="}]},"_npmUser":{"name":"chuseok22","email":"bjh59629@gmail.com"},"directories":{},"maintainers":[{"name":"chuseok22","email":"bjh59629@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/infra-automation_0.1.2_1783439747535_0.9920049586949897"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-07T15:55:47.238Z","0.1.2":"2026-07-07T15:55:47.691Z","modified":"2026-07-07T15:55:47.925Z"},"maintainers":[{"name":"chuseok22","email":"bjh59629@gmail.com"}],"description":"PostgreSQL/MongoDB/Redis Docker 컨테이너 자동 세팅을 포함한 인프라 자동화 CLI","readme":"# Infra Automation\n\n`infra-automation`은 외부 서버 또는 로컬 개발 환경에서 Docker 기반 데이터베이스 컨테이너를 빠르게 구성하기 위한 자동화 스크립트 저장소입니다.\n\n현재 제공하는 자동화는 다음 DB를 대상으로 합니다.\n\n- PostgreSQL\n- MongoDB\n- Redis\n\n이 스크립트는 실행 시 사용자에게 필요한 값을 입력받고, 사용자 홈 경로 아래에 `ContainerData` 디렉터리와 DB별 `docker-compose.yml` 파일을 자동 생성합니다. 설정 완료 후 선택에 따라 컨테이너 실행까지 진행합니다.\n\n---\n\n## 1. 주요 기능\n\n- 사용자 홈 경로에 `ContainerData` 자동 생성\n- PostgreSQL, MongoDB, Redis 설치 대상 선택 가능\n- 기본값은 전체 설치\n- DB별 username, password, database, port, image name, container name 입력 가능\n- Docker Compose v2 `docker compose` / v1 `docker-compose` 자동 감지\n- 기존 compose 파일 존재 시 덮어쓰기 여부 확인\n- 덮어쓰기 전 백업 여부 확인\n- 기존 container name 충돌 검사\n- host port 충돌 검사\n- PostgreSQL custom image 자동 빌드\n- PostgreSQL `pgvector`, `PostGIS` 사용 가능 이미지 생성\n- PostgreSQL extension 생성 여부 선택\n- MongoDB root 계정 생성\n- Redis password 설정\n- Redis localhost-only 바인딩 기본값 제공\n- Redis AOF 영속성 설정 선택 가능\n\n---\n\n## 2. 생성되는 폴더 구조\n\n스크립트 실행 후 기본적으로 사용자 홈 경로에 아래 구조가 생성됩니다.\n\n```text\n~/ContainerData\n├── docker-compose\n│   ├── postgres\n│   │   ├── docker-compose.yml\n│   │   └── Dockerfile\n│   ├── mongodb\n│   │   └── docker-compose.yml\n│   └── redis\n│       └── docker-compose.yml\n└── volumes\n    ├── postgres\n    ├── mongodb\n    │   ├── db\n    │   └── configdb\n    └── redis\n```\n\n각 역할은 다음과 같습니다.\n\n| 경로 | 역할 |\n|---|---|\n| `~/ContainerData/docker-compose/postgres` | PostgreSQL 실행 설정 및 custom image Dockerfile |\n| `~/ContainerData/docker-compose/mongodb` | MongoDB 실행 설정 |\n| `~/ContainerData/docker-compose/redis` | Redis 실행 설정 |\n| `~/ContainerData/volumes/postgres` | PostgreSQL 실제 데이터 저장소 |\n| `~/ContainerData/volumes/mongodb/db` | MongoDB 실제 데이터 저장소 |\n| `~/ContainerData/volumes/mongodb/configdb` | MongoDB 내부 config 데이터 저장소 |\n| `~/ContainerData/volumes/redis` | Redis AOF/RDB 데이터 저장소 |\n\n---\n\n## 3. 사전 요구사항\n\n실행 대상 서버 또는 로컬 환경에 다음이 설치되어 있어야 합니다.\n\n- Docker\n- Docker Compose\n- Node.js 18.18 이상 (npx 실행에 필요)\n\n스크립트는 아래 명령어 중 사용 가능한 것을 자동으로 감지합니다.\n\n```bash\ndocker compose\n```\n\n또는\n\n```bash\ndocker-compose\n```\n\nDocker daemon이 실행 중이어야 합니다.\n\n---\n\n## 4. 실행 방법\n\nNode.js와 Docker/Docker Compose가 설치되어 있다면 OS에 관계없이 동일한 명령으로 실행합니다.\n\n```bash\nnpx @chuseok22/infra-automation docker-db\n```\n\n특정 버전을 고정해서 실행하려면 다음과 같이 버전을 명시합니다.\n\n```bash\nnpx @chuseok22/infra-automation@1.0.0 docker-db\n```\n\nmacOS, Linux, Windows(PowerShell/cmd), WSL2, Git Bash 모두 동일한 명령으로 동작합니다.\n\n---\n\n## 5. 설치 대상 선택\n\n스크립트 실행 시 설치할 DB를 선택할 수 있습니다.\n\n기본값은 `all`입니다.\n\n```text\n설치할 DB [all]:\n```\n\n사용 가능한 값:\n\n```text\nall\npostgres\nmongodb\nredis\npostgres,mongodb\npostgres,redis\nmongodb,redis\n```\n\n예시:\n\n```text\n설치할 DB [all]: redis\n```\n\n위처럼 입력하면 Redis 관련 폴더와 compose 파일만 생성됩니다.\n\n---\n\n## 6. PostgreSQL 설정\n\nPostgreSQL 선택 시 다음 값을 입력받습니다.\n\n| 항목 | 기본값 | 설명 |\n|---|---:|---|\n| username | `root` | PostgreSQL 기본 사용자 |\n| password | `postgres_password` | PostgreSQL 비밀번호 |\n| database | `postgres` | 최초 생성할 기본 DB |\n| host port | `5432` | host에서 접근할 포트 |\n| image name | `postgres-chuseok22:17-pgvector-postgis` | custom PostgreSQL image 이름 |\n| container name | `postgres` | 컨테이너 이름 |\n\n생성되는 PostgreSQL 이미지는 다음 기준으로 구성됩니다.\n\n- `postgres:17-bookworm` 기반\n- PostgreSQL 17 사용\n- Debian `bookworm` 계열 고정\n- `pgvector v0.8.2` 소스 빌드 설치\n- `PostGIS` PostgreSQL 17용 패키지 설치\n- `shp2pgsql`, `raster2pgsql` 등 PostGIS CLI 유틸리티 포함\n- `PGDATA=/var/lib/postgresql/data/pgdata` 적용\n\nPostgreSQL 데이터는 아래 경로에 저장됩니다.\n\n```text\n~/ContainerData/volumes/postgres/pgdata\n```\n\n### PostgreSQL extension 생성\n\n컨테이너 실행 후 기본 DB에 extension을 생성할지 선택할 수 있습니다.\n\n```text\n기본 DB에 PostgreSQL extension을 생성할까요? [y/N]:\n```\n\n기본값은 `N`입니다.\n\n생성할 extension 목록도 입력할 수 있습니다.\n\n```text\n생성할 extension 목록(comma 구분) [vector,postgis]:\n```\n\n예시:\n\n```text\nvector,postgis,pgcrypto,uuid-ossp,pg_trgm\n```\n\nextension 이름은 안전을 위해 다음 형식만 허용됩니다.\n\n```text\n영문, 숫자, underscore, hyphen\n```\n\n---\n\n## 7. MongoDB 설정\n\nMongoDB 선택 시 다음 값을 입력받습니다.\n\n| 항목 | 기본값 | 설명 |\n|---|---:|---|\n| root username | `root` | MongoDB root 사용자 |\n| root password | `mongodb_password` | MongoDB root 비밀번호 |\n| host port | `27017` | host에서 접근할 포트 |\n| image name | `mongo:8.0` | MongoDB image |\n| container name | `mongodb` | 컨테이너 이름 |\n\nMongoDB root 계정은 `admin` database에 생성됩니다.\n\n접속 URI 예시:\n\n```text\nmongodb://root:mongodb_password@localhost:27017/admin?authSource=admin\n```\n\nSpring Boot에서 특정 app database에 root 계정으로 접근하려면 다음 형식을 사용할 수 있습니다.\n\n```yaml\nspring:\n  data:\n    mongodb:\n      uri: mongodb://root:mongodb_password@localhost:27017/app_db?authSource=admin\n```\n\nMongoDB 데이터는 아래 경로에 저장됩니다.\n\n```text\n~/ContainerData/volumes/mongodb/db\n~/ContainerData/volumes/mongodb/configdb\n```\n\n---\n\n## 8. Redis 설정\n\nRedis 선택 시 다음 값을 입력받습니다.\n\n| 항목 | 기본값 | 설명 |\n|---|---:|---|\n| password | `redis_password` | Redis 비밀번호 |\n| host port | `6379` | host에서 접근할 포트 |\n| image name | `redis:8.0-alpine` | Redis image |\n| container name | `redis` | 컨테이너 이름 |\n| external access | `no` | 외부 접근 허용 여부 |\n| AOF persistence | `yes` | AOF 영속성 활성화 여부 |\n\nRedis는 공식 이미지 기준으로 `REDIS_PASSWORD` 환경변수만으로 비밀번호가 자동 적용되지 않습니다.  \n따라서 스크립트는 `redis-server --requirepass` 명령을 사용해 password를 설정합니다.\n\n기본 포트 바인딩은 localhost-only입니다.\n\n```yaml\n127.0.0.1:6379:6379\n```\n\n외부 접근을 허용하면 다음과 같이 설정됩니다.\n\n```yaml\n6379:6379\n```\n\nRedis 데이터는 아래 경로에 저장됩니다.\n\n```text\n~/ContainerData/volumes/redis\n```\n\n---\n\n## 9. 기존 파일 처리 방식\n\n이미 대상 compose 파일이 존재하면 스크립트가 덮어쓰기 여부를 물어봅니다.\n\n```text\n이미 파일이 존재합니다: /home/user/ContainerData/docker-compose/postgres/docker-compose.yml\n이 파일을 덮어쓸까요? [y/N]:\n```\n\n덮어쓰기를 선택하면 백업 여부를 추가로 물어봅니다.\n\n```text\n덮어쓰기 전에 백업할까요? [Y/n]:\n```\n\n백업을 선택하면 다음 형식으로 백업 파일이 생성됩니다.\n\n```text\ndocker-compose.yml.bak.YYYYMMDD_HHMMSS\n```\n\n---\n\n## 10. 컨테이너 이름 충돌 처리\n\n입력한 `container_name`과 동일한 컨테이너가 이미 존재하면 스크립트는 즉시 중단됩니다.\n\n예:\n\n```text\nERROR: 이미 'postgres' 컨테이너가 존재합니다. 기존 컨테이너를 삭제하거나 다른 이름으로 다시 실행하세요.\n```\n\n기존 컨테이너를 자동 삭제하지 않는 이유는 데이터 손실이나 예상하지 못한 서비스 중단을 막기 위해서입니다.\n\n기존 컨테이너를 삭제하려면 직접 확인 후 제거합니다.\n\n```bash\ndocker ps -a\ndocker rm {container_name}\n```\n\n---\n\n## 11. 포트 충돌 검사\n\n스크립트는 host port 입력 시 사용 중인 포트인지 검사합니다.\n\n지원하는 검사 도구:\n\n- `lsof`\n- `ss`\n- `netstat`\n\n이미 사용 중인 포트를 입력하면 다른 포트 입력을 요구합니다.\n\n---\n\n## 12. 컨테이너 실행\n\n파일 생성 후 컨테이너를 바로 실행할지 선택할 수 있습니다.\n\n```text\n파일 생성 후 docker compose up -d까지 실행할까요? [Y/n]:\n```\n\n기본값은 `Y`입니다.\n\nPostgreSQL은 Dockerfile 빌드가 필요하므로 아래와 같이 실행됩니다.\n\n```bash\ndocker compose up -d --build\n```\n\nMongoDB와 Redis는 공식 이미지를 사용하므로 아래와 같이 실행됩니다.\n\n```bash\ndocker compose up -d\n```\n\n---\n\n## 13. 수동 실행 명령어\n\n자동 실행을 건너뛴 경우 아래 명령어로 직접 실행할 수 있습니다.\n\n### PostgreSQL\n\n```bash\ncd ~/ContainerData/docker-compose/postgres\ndocker compose up -d --build\n```\n\n### MongoDB\n\n```bash\ncd ~/ContainerData/docker-compose/mongodb\ndocker compose up -d\n```\n\n### Redis\n\n```bash\ncd ~/ContainerData/docker-compose/redis\ndocker compose up -d\n```\n\nDocker Compose v1 환경에서는 `docker compose` 대신 `docker-compose`를 사용합니다.\n\n---\n\n## 14. 접속 확인\n\n### PostgreSQL\n\n```bash\ndocker exec -it postgres psql -U root -d postgres\n```\n\n사용 가능한 extension 확인:\n\n```bash\ndocker exec -it postgres psql -U root -d postgres -c \"SELECT name, default_version FROM pg_available_extensions ORDER BY name;\"\n```\n\n현재 DB에 생성된 extension 확인:\n\n```bash\ndocker exec -it postgres psql -U root -d postgres -c \"SELECT extname, extversion FROM pg_extension ORDER BY extname;\"\n```\n\n### MongoDB\n\n```bash\ndocker exec -it mongodb mongosh \"mongodb://root:mongodb_password@localhost:27017/admin?authSource=admin\"\n```\n\n접속 후:\n\n```javascript\ndb.adminCommand({ ping: 1 })\n```\n\n### Redis\n\n비밀번호 없이 접근하면 실패해야 정상입니다.\n\n```bash\ndocker exec -it redis redis-cli ping\n```\n\n비밀번호 포함 접근:\n\n```bash\ndocker exec -it redis redis-cli -a redis_password ping\n```\n\n정상 응답:\n\n```text\nPONG\n```\n\n---\n\n## 15. 데이터 초기화\n\n컨테이너만 제거하려면 각 DB compose 폴더에서 다음 명령을 실행합니다.\n\n```bash\ndocker compose down\n```\n\n데이터까지 삭제하려면 `~/ContainerData/volumes` 아래의 해당 DB 폴더를 삭제해야 합니다.\n\n### PostgreSQL 데이터 초기화\n\n```bash\ncd ~/ContainerData/docker-compose/postgres\ndocker compose down\nrm -rf ~/ContainerData/volumes/postgres\nmkdir -p ~/ContainerData/volumes/postgres\ndocker compose up -d --build\n```\n\n### MongoDB 데이터 초기화\n\n```bash\ncd ~/ContainerData/docker-compose/mongodb\ndocker compose down\nrm -rf ~/ContainerData/volumes/mongodb/db\nrm -rf ~/ContainerData/volumes/mongodb/configdb\nmkdir -p ~/ContainerData/volumes/mongodb/db\nmkdir -p ~/ContainerData/volumes/mongodb/configdb\ndocker compose up -d\n```\n\n### Redis 데이터 초기화\n\n```bash\ncd ~/ContainerData/docker-compose/redis\ndocker compose down\nrm -rf ~/ContainerData/volumes/redis\nmkdir -p ~/ContainerData/volumes/redis\ndocker compose up -d\n```\n\n> 데이터 삭제 명령은 되돌릴 수 없습니다. 실행 전에 반드시 필요한 데이터인지 확인해야 합니다.\n\n---\n\n## 16. 보안 주의사항\n\n이 스크립트는 로컬 개발 환경 또는 개인 서버 초기 세팅 편의를 목적으로 합니다.\n\n주의할 점:\n\n- 비밀번호는 숨김 입력하지 않습니다.\n- 생성된 `docker-compose.yml`에 비밀번호가 평문으로 저장됩니다.\n- 외부에 repository나 compose 파일을 공유할 경우 비밀번호가 노출될 수 있습니다.\n- Redis는 기본적으로 `127.0.0.1`에만 바인딩합니다.\n- 외부 접근을 허용할 경우 방화벽, 보안 그룹, 네트워크 접근 제어를 별도로 설정해야 합니다.\n- 운영 환경에서 그대로 사용하려면 secret 관리, 백업 정책, 네트워크 접근 정책을 별도로 설계해야 합니다.\n\n---\n\n## 17. 현재 설계 기준\n\n이 자동화는 다음 기준으로 작성되었습니다.\n\n| 기준 | 결정 |\n|---|---|\n| 설치 위치 | 사용자 홈 경로의 `~/ContainerData` |\n| 스크립트 형태 | TypeScript 기반 npm CLI (`@chuseok22/infra-automation`) |\n| 실행 방식 | `npx @chuseok22/infra-automation docker-db` |\n| DB 구조 | PostgreSQL, MongoDB, Redis compose 분리 |\n| volume 관리 | DB별 bind mount 사용 |\n| PostgreSQL image | custom image build |\n| MongoDB image | official `mongo:8.0` |\n| Redis image | official `redis:8.0-alpine` |\n| Redis password | `redis-server --requirepass` |\n| Redis network | localhost-only 기본 |\n| 기존 파일 | 덮어쓰기 전 사용자 확인 |\n| 기존 컨테이너 충돌 | 자동 삭제하지 않고 중단 |\n| 포트 충돌 | 사전 검사 |\n| 자동 실행 | 기본값 yes |\n\n---\n\n## 18. Repository 구조\n\n이 저장소는 `@chuseok22/infra-automation`이라는 단일 npm CLI 패키지로 관리되며, 기능은 서브커맨드로 구분됩니다.\n\n```text\ninfra-automation\n├── src/\n│   ├── index.ts\n│   ├── commands/\n│   │   └── docker-db/\n│   └── lib/\n├── tests/\n├── package.json\n└── README.md\n```\n\n향후 `server-init`, `deploy`, `backup` 등이 추가되면 동일 패키지의 서브커맨드로 확장됩니다.\n\n```bash\nnpx @chuseok22/infra-automation docker-db\nnpx @chuseok22/infra-automation server-init   # 추후 추가\n```\n\n---\n\n## 19. 라이선스\n\n필요에 따라 repository에 라이선스를 추가할 수 있습니다.\n\n개인/팀 내부용이면 라이선스를 생략할 수 있습니다.  \n공개 repository로 배포할 계획이면 `MIT License` 같은 permissive license를 고려할 수 있습니다.\n","readmeFilename":"README.md","_rev":"1-ade3d8e8d38a44adb04566299ca81ad7"}