@chuseok22/infra-automation
v0.1.2
Published
PostgreSQL/MongoDB/Redis Docker 컨테이너 자동 세팅을 포함한 인프라 자동화 CLI
Readme
Infra Automation
infra-automation은 외부 서버 또는 로컬 개발 환경에서 Docker 기반 데이터베이스 컨테이너를 빠르게 구성하기 위한 자동화 스크립트 저장소입니다.
현재 제공하는 자동화는 다음 DB를 대상으로 합니다.
- PostgreSQL
- MongoDB
- Redis
이 스크립트는 실행 시 사용자에게 필요한 값을 입력받고, 사용자 홈 경로 아래에 ContainerData 디렉터리와 DB별 docker-compose.yml 파일을 자동 생성합니다. 설정 완료 후 선택에 따라 컨테이너 실행까지 진행합니다.
1. 주요 기능
- 사용자 홈 경로에
ContainerData자동 생성 - PostgreSQL, MongoDB, Redis 설치 대상 선택 가능
- 기본값은 전체 설치
- DB별 username, password, database, port, image name, container name 입력 가능
- Docker Compose v2
docker compose/ v1docker-compose자동 감지 - 기존 compose 파일 존재 시 덮어쓰기 여부 확인
- 덮어쓰기 전 백업 여부 확인
- 기존 container name 충돌 검사
- host port 충돌 검사
- PostgreSQL custom image 자동 빌드
- PostgreSQL
pgvector,PostGIS사용 가능 이미지 생성 - PostgreSQL extension 생성 여부 선택
- MongoDB root 계정 생성
- Redis password 설정
- Redis localhost-only 바인딩 기본값 제공
- Redis AOF 영속성 설정 선택 가능
2. 생성되는 폴더 구조
스크립트 실행 후 기본적으로 사용자 홈 경로에 아래 구조가 생성됩니다.
~/ContainerData
├── docker-compose
│ ├── postgres
│ │ ├── docker-compose.yml
│ │ └── Dockerfile
│ ├── mongodb
│ │ └── docker-compose.yml
│ └── redis
│ └── docker-compose.yml
└── volumes
├── postgres
├── mongodb
│ ├── db
│ └── configdb
└── redis각 역할은 다음과 같습니다.
| 경로 | 역할 |
|---|---|
| ~/ContainerData/docker-compose/postgres | PostgreSQL 실행 설정 및 custom image Dockerfile |
| ~/ContainerData/docker-compose/mongodb | MongoDB 실행 설정 |
| ~/ContainerData/docker-compose/redis | Redis 실행 설정 |
| ~/ContainerData/volumes/postgres | PostgreSQL 실제 데이터 저장소 |
| ~/ContainerData/volumes/mongodb/db | MongoDB 실제 데이터 저장소 |
| ~/ContainerData/volumes/mongodb/configdb | MongoDB 내부 config 데이터 저장소 |
| ~/ContainerData/volumes/redis | Redis AOF/RDB 데이터 저장소 |
3. 사전 요구사항
실행 대상 서버 또는 로컬 환경에 다음이 설치되어 있어야 합니다.
- Docker
- Docker Compose
- Node.js 18.18 이상 (npx 실행에 필요)
스크립트는 아래 명령어 중 사용 가능한 것을 자동으로 감지합니다.
docker compose또는
docker-composeDocker daemon이 실행 중이어야 합니다.
4. 실행 방법
Node.js와 Docker/Docker Compose가 설치되어 있다면 OS에 관계없이 동일한 명령으로 실행합니다.
npx @chuseok22/infra-automation docker-db특정 버전을 고정해서 실행하려면 다음과 같이 버전을 명시합니다.
npx @chuseok22/[email protected] docker-dbmacOS, Linux, Windows(PowerShell/cmd), WSL2, Git Bash 모두 동일한 명령으로 동작합니다.
5. 설치 대상 선택
스크립트 실행 시 설치할 DB를 선택할 수 있습니다.
기본값은 all입니다.
설치할 DB [all]:사용 가능한 값:
all
postgres
mongodb
redis
postgres,mongodb
postgres,redis
mongodb,redis예시:
설치할 DB [all]: redis위처럼 입력하면 Redis 관련 폴더와 compose 파일만 생성됩니다.
6. PostgreSQL 설정
PostgreSQL 선택 시 다음 값을 입력받습니다.
| 항목 | 기본값 | 설명 |
|---|---:|---|
| username | root | PostgreSQL 기본 사용자 |
| password | postgres_password | PostgreSQL 비밀번호 |
| database | postgres | 최초 생성할 기본 DB |
| host port | 5432 | host에서 접근할 포트 |
| image name | postgres-chuseok22:17-pgvector-postgis | custom PostgreSQL image 이름 |
| container name | postgres | 컨테이너 이름 |
생성되는 PostgreSQL 이미지는 다음 기준으로 구성됩니다.
postgres:17-bookworm기반- PostgreSQL 17 사용
- Debian
bookworm계열 고정 pgvector v0.8.2소스 빌드 설치PostGISPostgreSQL 17용 패키지 설치shp2pgsql,raster2pgsql등 PostGIS CLI 유틸리티 포함PGDATA=/var/lib/postgresql/data/pgdata적용
PostgreSQL 데이터는 아래 경로에 저장됩니다.
~/ContainerData/volumes/postgres/pgdataPostgreSQL extension 생성
컨테이너 실행 후 기본 DB에 extension을 생성할지 선택할 수 있습니다.
기본 DB에 PostgreSQL extension을 생성할까요? [y/N]:기본값은 N입니다.
생성할 extension 목록도 입력할 수 있습니다.
생성할 extension 목록(comma 구분) [vector,postgis]:예시:
vector,postgis,pgcrypto,uuid-ossp,pg_trgmextension 이름은 안전을 위해 다음 형식만 허용됩니다.
영문, 숫자, underscore, hyphen7. MongoDB 설정
MongoDB 선택 시 다음 값을 입력받습니다.
| 항목 | 기본값 | 설명 |
|---|---:|---|
| root username | root | MongoDB root 사용자 |
| root password | mongodb_password | MongoDB root 비밀번호 |
| host port | 27017 | host에서 접근할 포트 |
| image name | mongo:8.0 | MongoDB image |
| container name | mongodb | 컨테이너 이름 |
MongoDB root 계정은 admin database에 생성됩니다.
접속 URI 예시:
mongodb://root:mongodb_password@localhost:27017/admin?authSource=adminSpring Boot에서 특정 app database에 root 계정으로 접근하려면 다음 형식을 사용할 수 있습니다.
spring:
data:
mongodb:
uri: mongodb://root:mongodb_password@localhost:27017/app_db?authSource=adminMongoDB 데이터는 아래 경로에 저장됩니다.
~/ContainerData/volumes/mongodb/db
~/ContainerData/volumes/mongodb/configdb8. Redis 설정
Redis 선택 시 다음 값을 입력받습니다.
| 항목 | 기본값 | 설명 |
|---|---:|---|
| password | redis_password | Redis 비밀번호 |
| host port | 6379 | host에서 접근할 포트 |
| image name | redis:8.0-alpine | Redis image |
| container name | redis | 컨테이너 이름 |
| external access | no | 외부 접근 허용 여부 |
| AOF persistence | yes | AOF 영속성 활성화 여부 |
Redis는 공식 이미지 기준으로 REDIS_PASSWORD 환경변수만으로 비밀번호가 자동 적용되지 않습니다.
따라서 스크립트는 redis-server --requirepass 명령을 사용해 password를 설정합니다.
기본 포트 바인딩은 localhost-only입니다.
127.0.0.1:6379:6379외부 접근을 허용하면 다음과 같이 설정됩니다.
6379:6379Redis 데이터는 아래 경로에 저장됩니다.
~/ContainerData/volumes/redis9. 기존 파일 처리 방식
이미 대상 compose 파일이 존재하면 스크립트가 덮어쓰기 여부를 물어봅니다.
이미 파일이 존재합니다: /home/user/ContainerData/docker-compose/postgres/docker-compose.yml
이 파일을 덮어쓸까요? [y/N]:덮어쓰기를 선택하면 백업 여부를 추가로 물어봅니다.
덮어쓰기 전에 백업할까요? [Y/n]:백업을 선택하면 다음 형식으로 백업 파일이 생성됩니다.
docker-compose.yml.bak.YYYYMMDD_HHMMSS10. 컨테이너 이름 충돌 처리
입력한 container_name과 동일한 컨테이너가 이미 존재하면 스크립트는 즉시 중단됩니다.
예:
ERROR: 이미 'postgres' 컨테이너가 존재합니다. 기존 컨테이너를 삭제하거나 다른 이름으로 다시 실행하세요.기존 컨테이너를 자동 삭제하지 않는 이유는 데이터 손실이나 예상하지 못한 서비스 중단을 막기 위해서입니다.
기존 컨테이너를 삭제하려면 직접 확인 후 제거합니다.
docker ps -a
docker rm {container_name}11. 포트 충돌 검사
스크립트는 host port 입력 시 사용 중인 포트인지 검사합니다.
지원하는 검사 도구:
lsofssnetstat
이미 사용 중인 포트를 입력하면 다른 포트 입력을 요구합니다.
12. 컨테이너 실행
파일 생성 후 컨테이너를 바로 실행할지 선택할 수 있습니다.
파일 생성 후 docker compose up -d까지 실행할까요? [Y/n]:기본값은 Y입니다.
PostgreSQL은 Dockerfile 빌드가 필요하므로 아래와 같이 실행됩니다.
docker compose up -d --buildMongoDB와 Redis는 공식 이미지를 사용하므로 아래와 같이 실행됩니다.
docker compose up -d13. 수동 실행 명령어
자동 실행을 건너뛴 경우 아래 명령어로 직접 실행할 수 있습니다.
PostgreSQL
cd ~/ContainerData/docker-compose/postgres
docker compose up -d --buildMongoDB
cd ~/ContainerData/docker-compose/mongodb
docker compose up -dRedis
cd ~/ContainerData/docker-compose/redis
docker compose up -dDocker Compose v1 환경에서는 docker compose 대신 docker-compose를 사용합니다.
14. 접속 확인
PostgreSQL
docker exec -it postgres psql -U root -d postgres사용 가능한 extension 확인:
docker exec -it postgres psql -U root -d postgres -c "SELECT name, default_version FROM pg_available_extensions ORDER BY name;"현재 DB에 생성된 extension 확인:
docker exec -it postgres psql -U root -d postgres -c "SELECT extname, extversion FROM pg_extension ORDER BY extname;"MongoDB
docker exec -it mongodb mongosh "mongodb://root:mongodb_password@localhost:27017/admin?authSource=admin"접속 후:
db.adminCommand({ ping: 1 })Redis
비밀번호 없이 접근하면 실패해야 정상입니다.
docker exec -it redis redis-cli ping비밀번호 포함 접근:
docker exec -it redis redis-cli -a redis_password ping정상 응답:
PONG15. 데이터 초기화
컨테이너만 제거하려면 각 DB compose 폴더에서 다음 명령을 실행합니다.
docker compose down데이터까지 삭제하려면 ~/ContainerData/volumes 아래의 해당 DB 폴더를 삭제해야 합니다.
PostgreSQL 데이터 초기화
cd ~/ContainerData/docker-compose/postgres
docker compose down
rm -rf ~/ContainerData/volumes/postgres
mkdir -p ~/ContainerData/volumes/postgres
docker compose up -d --buildMongoDB 데이터 초기화
cd ~/ContainerData/docker-compose/mongodb
docker compose down
rm -rf ~/ContainerData/volumes/mongodb/db
rm -rf ~/ContainerData/volumes/mongodb/configdb
mkdir -p ~/ContainerData/volumes/mongodb/db
mkdir -p ~/ContainerData/volumes/mongodb/configdb
docker compose up -dRedis 데이터 초기화
cd ~/ContainerData/docker-compose/redis
docker compose down
rm -rf ~/ContainerData/volumes/redis
mkdir -p ~/ContainerData/volumes/redis
docker compose up -d데이터 삭제 명령은 되돌릴 수 없습니다. 실행 전에 반드시 필요한 데이터인지 확인해야 합니다.
16. 보안 주의사항
이 스크립트는 로컬 개발 환경 또는 개인 서버 초기 세팅 편의를 목적으로 합니다.
주의할 점:
- 비밀번호는 숨김 입력하지 않습니다.
- 생성된
docker-compose.yml에 비밀번호가 평문으로 저장됩니다. - 외부에 repository나 compose 파일을 공유할 경우 비밀번호가 노출될 수 있습니다.
- Redis는 기본적으로
127.0.0.1에만 바인딩합니다. - 외부 접근을 허용할 경우 방화벽, 보안 그룹, 네트워크 접근 제어를 별도로 설정해야 합니다.
- 운영 환경에서 그대로 사용하려면 secret 관리, 백업 정책, 네트워크 접근 정책을 별도로 설계해야 합니다.
17. 현재 설계 기준
이 자동화는 다음 기준으로 작성되었습니다.
| 기준 | 결정 |
|---|---|
| 설치 위치 | 사용자 홈 경로의 ~/ContainerData |
| 스크립트 형태 | TypeScript 기반 npm CLI (@chuseok22/infra-automation) |
| 실행 방식 | npx @chuseok22/infra-automation docker-db |
| DB 구조 | PostgreSQL, MongoDB, Redis compose 분리 |
| volume 관리 | DB별 bind mount 사용 |
| PostgreSQL image | custom image build |
| MongoDB image | official mongo:8.0 |
| Redis image | official redis:8.0-alpine |
| Redis password | redis-server --requirepass |
| Redis network | localhost-only 기본 |
| 기존 파일 | 덮어쓰기 전 사용자 확인 |
| 기존 컨테이너 충돌 | 자동 삭제하지 않고 중단 |
| 포트 충돌 | 사전 검사 |
| 자동 실행 | 기본값 yes |
18. Repository 구조
이 저장소는 @chuseok22/infra-automation이라는 단일 npm CLI 패키지로 관리되며, 기능은 서브커맨드로 구분됩니다.
infra-automation
├── src/
│ ├── index.ts
│ ├── commands/
│ │ └── docker-db/
│ └── lib/
├── tests/
├── package.json
└── README.md향후 server-init, deploy, backup 등이 추가되면 동일 패키지의 서브커맨드로 확장됩니다.
npx @chuseok22/infra-automation docker-db
npx @chuseok22/infra-automation server-init # 추후 추가19. 라이선스
필요에 따라 repository에 라이선스를 추가할 수 있습니다.
개인/팀 내부용이면 라이선스를 생략할 수 있습니다.
공개 repository로 배포할 계획이면 MIT License 같은 permissive license를 고려할 수 있습니다.
