[시놀로지 NAS] Docker로 Redmine 설치 (DSM 7.3, ds218+)
Posted on 2025. 12. 31. 21:07
Filed Under 시놀로지NAS활용
[시놀로지 NAS] Docker로 Redmine 설치하기 (삽질기 포함)
안녕하세요! 오늘은 시놀로지 NAS에 프로젝트 관리 도구인 Redmine을 설치하는 과정을 정리해보려 합니다. 처음 시도하면서 꽤 많은 시행착오(삽질)를 겪었는데, 저처럼 고생하지 마시라고 A부터 Z까지 상세하게 기록해 둡니다. 나중에 저도 다시 볼 겸요. ^^;
0. 전체 구조 이해하기 (우리가 만들 집의 설계도)
Redmine을 설치하려면 총 3가지의 컨테이너(방)가 필요합니다.
- MariaDB (금고): Redmine의 모든 데이터(회원 정보, 일감, 게시글 등)를 안전하게 보관하는 데이터베이스입니다. 가장 중요합니다.
- phpMyAdmin (창문): 터미널의 검은 화면 대신, 웹 브라우저에서 마우스로 편하게 MariaDB 금고 안을 들여다보고 관리할 수 있게 해주는 관리 도구입니다.
- Redmine (장부): 우리가 실제로 사용할 프로젝트 관리 프로그램입니다. MariaDB 금고에 데이터를 저장하고 불러옵니다.
🤔 Web Station, 꼭 설치해야 할까? (중요!)
많은 블로그에서 Web Station을 먼저 설치하라고 하지만, 결론부터 말하면 Docker로 설치할 때는 필수가 아닙니다. 오히려 저처럼 포트 충돌(특히 80번 포트) 문제로 삽질하게 만드는 원인이 될 수 있습니다.
- 설치 목적: Web Station은 NAS 자체를 하나의 웹 서버로 만들 때 사용합니다.
- 결론: Docker 컨테이너는 그 자체로 독립된 서버 역할을 하므로 Web Station 없이도 충분히 운영 가능합니다. 굳이 설치해서 포트 문제를 일으킬 필요가 없습니다.
1. 준비물 및 사전 작업 (폴더 만들기)
가장 먼저, 데이터가 저장될 '실제 창고'(폴더)를 만들어야 합니다. 이 단계를 건너뛰면 컨테이너가 실행되지 않거나, 열심히 작업한 데이터가 날아갈 수 있습니다.
1. File Station에서 폴더 생성:docker 폴더 아래에 다음과 같이 폴더를 만들어 주세요.
/docker/mariadb(DB 데이터 저장용)/docker/redmine/files(Redmine 첨부파일 저장용)/docker/redmine/plugins(Redmine 플러그인 저장용)
2. 권한 설정 (매우 중요! ⭐⭐⭐):
만든 폴더 각각에 대해 읽기/쓰기 권한을 주어야 합니다. (저는 이것 때문에 한참 고생했습니다 ㅠㅠ)
- 각 폴더 우클릭 -> [속성] -> [권한] 탭으로 이동.
- [생성] 클릭 -> 사용자/그룹에
Everyone선택 -> [읽기] 및 [쓰기] 체크. - 하단의 '이 폴더, 하위 폴더 및 파일에 적용' 체크 후 저장.
2. Step 1: MariaDB (데이터베이스 금고) 설치
1. 이미지 다운로드:Container Manager -> [레지스트리]에서 mariadb 검색. 가장 상단의 공식 이미지(latest 또는 11.4)를 다운로드합니다. (저는 ubi 버전을 받았다가 권한 문제로 고생했으니 일반 버전을 추천합니다.)
2. 컨테이너 생성 및 설정:
- 포트 설정: 로컬 포트
3306, 컨테이너 포트3306(기본값 그대로 사용). - 볼륨 설정:
- 파일/폴더:
/docker/mariadb(아까 만든 폴더 선택) - 마운트 경로:
/var/lib/mysql(직접 입력)
코멘트: 이 설정이 있어야 컨테이너를 삭제해도 데이터가 안전하게 남습니다.
- 환경 변수 설정 (필수):
- 변수:
MARIADB_ROOT_PASSWORD(또는MYSQL_ROOT_PASSWORD) - 값: (사용할 강력한 비밀번호 입력)
3. 설치 확인:
컨테이너 실행 후 [로그] 탭에 ready for connections 문구가 뜨면 성공!
3. Step 2: phpMyAdmin (DB 관리 도구) 설치
1. 이미지 다운로드: phpmyadmin 검색 후 다운로드.
2. 컨테이너 생성 (Web Station 충돌 해결!):
첫 화면에서 'Web Station을 통해 웹 포털 설정' 체크를 반드시 해제하세요. 이걸 해제해야 포트 충돌 없이 원하는 포트를 설정할 수 있습니다.

3. 상세 설정:
- 포트 설정: 로컬 포트
8080(웹 주소창에 쓸 번호), 컨테이너 포트80(고정). - 링크 설정: 아까 만든 MariaDB 컨테이너 선택, 별칭(Alias)에
db입력. - 환경 변수 설정:
- 변수:
PMA_HOST - 값:
db(링크 별칭 입력)
코멘트:
PMA_HOST에 링크 별칭을 적어주면 IP 주소가 바뀌어도 알아서 MariaDB를 찾아갑니다.
- 볼륨 설정: 필요 없음 (데이터 저장 안 함).

4. 접속 확인: 웹 브라우저에 http://NAS아이피:8080 입력. ID는 root, 비밀번호는 MariaDB에서 설정한 값을 넣고 로그인해 봅니다.
4. Step 3: Redmine용 데이터베이스 생성
Redmine을 설치하기 전에 Redmine이 사용할 빈 금고(데이터베이스)를 미리 만들어줘야 합니다.
- phpMyAdmin에 접속합니다.
- 상단 [데이터베이스] 탭 클릭.
- 새 데이터베이스 이름에
redmine입력, 문자 집합은utf8mb4_general_ci선택 후 [만들기] 클릭.
5. Step 4: Redmine (프로젝트 관리 도구) 설치
1. 이미지 다운로드: redmine 검색 후 공식 이미지 다운로드.
2. 컨테이너 생성 및 설정:
- 포트 설정: 로컬 포트
3000, 컨테이너 포트3000. - 볼륨 설정:
/docker/redmine/files↔/usr/src/redmine/files/docker/redmine/plugins↔/usr/src/redmine/plugins(필요시)
- 링크 설정: MariaDB 컨테이너 선택, 별칭
db입력.
3. 환경 변수 설정 (가장 중요! ⭐⭐⭐):
이 부분을 정확히 입력해야 Redmine이 MariaDB와 연결됩니다.
REDMINE_DB_MYSQL:db(링크 별칭)REDMINE_DB_DATABASE:redmine(아까 만든 DB 이름)REDMINE_DB_USERNAME:rootREDMINE_DB_PASSWORD: (MariaDB 비밀번호)
4. 설치 확인:
Redmine은 처음 실행 시 DB 테이블을 만드느라 시간이 꽤 걸립니다(3~5분). [로그] 탭에 Listening on http://0.0.0.0:3000 문구가 뜰 때까지 느긋하게 기다려 주세요.
또는 아래이미지와 같이 [터미널]로 접속하여 명령어로 확인하는 방법도 있습니다.

6. 마무리
이제 모든 설치가 끝났습니다!
- 내부 접속 테스트: 같은 네트워크(집) 안에서 브라우저에
http://NAS아이피:3000을 입력해 보세요. Redmine 초기 화면이 뜬다면 성공입니다! (초기 계정: admin / admin) - 외부 접속 (집 밖에서): 카페나 회사에서 접속하려면 사용 중인 공유기 설정 페이지에서
3000(Redmine),8080(phpMyAdmin),3306(MariaDB) 포트에 대한 포트포워딩 설정이 필요합니다. (이 부분은 각자 공유기 매뉴얼을 참고해주세요!)
긴 글 따라오시느라 고생 많으셨습니다. 저의 삽질 기록이 여러분의 성공적인 설치에 도움이 되기를 바랍니다! 😊
7. 참고
- [Container Manager] MariaDB와 레드마인 구축하는 방법, 쉽게 따라하기 | 2025.01.31
- Redmine User Manual | 2021.02.01
"이 글은 사람(Human)이 설정을 진행하며 질답한 내용을 기반으로 Google Gemini 3에 의해 작성되었습니다(이미지 제외)"
VSCode 사용 모음 (updated: 25.12.25)
Posted on 2025. 12. 25. 18:00
Filed Under Programming/개발환경+도구
VSCode 단축키
1) Terminal창: Ctrl + `
2) Bookmark(Extension: bookmark 설치필요):
- Bookmarks: Toggle - 해당 코드 북마크 생성/취소★
- Bookmarks: Toggle Labeled - 해당 코드를 라벨화하여 생성/취소 ★
- Bookmarks: List - 현재 파일에 생성된 북마크 리스트 확인 ★
- 해당 명령어를 입력하면 또 입력창이 뜹니다. 입력창에 라벨 이름을 정하면 액티브 바에도 해당 라벨로 북마크를 확인할 수 있습니다. (북마크 정리에 유용)
- Bookmarks: Clear - 현재 파일에 생성된 모든 북마크를 제거
- Bookmarks: Jump to Next - 다음 북마크로 이동
- Bookmarks: Jump to Previous - 이전 북마크로 이동
- (정보출처: https://velog.io/@m2nja201/Visual-Studio-CodeVS-Code-북마크책갈피-생성하는-법)
VSCode Terminal 명령어 스니펫
# 모든 캐시 & 빌드 파일 삭제
> Remove-Item -Recurse -Force .next, node_modules, package-lock.json -ErrorAction SilentlyContinue
> npm cache clean --force
# .next 디렉터리 삭제
rmdir /s /q .next
VSCode Extensions 기록 (updated: 25.12.25)
| 아이콘 | Extension명 | Language | 설명 요약 | 활용 사례 |
| 🚀 | Code Runner | C, Java, Python 등 | 코드 스니펫 즉시 실행 | 별도 설정 없이 단축키로 코드 결과 바로 확인 |
| 🤖 | Continue | 오픈소스 AI 코드 에이전트 | AI와 대화하며 코드 작성 및 리팩토링 진행 | |
| 🚨 | Error Lens | 에러/경고 라인 직접 강조 | 오타나 문법 에러를 코드 줄에 바로 표시 | |
| 🛠️ | ESLint | JavaScript | JS 코드 문법 및 스타일 체크 | 코드의 잠재적 오류를 잡고 일관된 스타일 유지 |
| 📓 | Jupyter (계열) | Python | 노트북 환경 및 렌더링 지원 | 데이터 시각화 및 단계별 코드 실행(AI/데이터 분석) |
| ⚡ | Live Server | HTML, CSS | 실시간 리로드 로컬 서버 | HTML 수정 시 저장과 동시에 웹 브라우저 반영 |
| 🏗️ | Microsoft Terraform | Terraform | Azure용 인프라 관리 도구 | 클라우드 자원을 코드로 관리하고 자동 배포 |
| 💎 | Prettier | JS, CSS, HTML | 코드 포맷 자동 정렬 | 지저분한 코드를 저장 시 자동으로 깔끔하게 정리 |
| 🐍 | Pylance / Python | Python | 파이썬 언어 서버 지원 | 강력한 자동 완성 및 정의 이동으로 개발 효율 극대화 |
| 🌈 | Rainbow CSV | CSV | CSV 열 색상별 구분 | 엑셀 없이 CSV 파일의 데이터를 색상별로 구분 |
| 🎨 | Tailwind CSS | CSS | Tailwind 자동 완성 지원 | 방대한 CSS 클래스명을 힌트로 받아 빠른 디자인 |
| 🌐 | translate | 텍스트 번역 기능 | 코드 주석이나 영문 에러 메시지 즉시 번역 | |
| ⚛️ | ES7+ React... | React | React/Redux 스니펫 제공 | 리액트 컴포넌트 구조를 단축키로 즉시 생성 |
| 🐧 | WSL | Linux | Windows 내 리눅스 연결 | 윈도우 환경에서 리눅스 터미널과 도구 사용 |
| ✍️ | autoDocstring | Python | 독스트링 자동 생성 | 파이썬 함수 설명 양식을 자동으로 채워줌 |
| ☁️ |
Azure Tools (계열)
|
Azure 서비스 관리/배포 | VSCode 안에서 클라우드 배포 및 모니터링 관리 |
Gradle 사용 명령어 모음 (25.12.15)
Posted on 2025. 12. 15. 17:41
Filed Under Programming/개발환경+도구
./gradlew --stop # 데몬 모두 종료
./gradlew clean build --refresh-dependencies
./gradlew bootRun
# 또는 ./gradlew --no-daemon bootRun --stacktrace --info
java class 파일들 한번에 디컴파일(Decompile) with jd-cli
Posted on 2025. 10. 29. 10:04
Filed Under Programming/Java
레거시 소스를 class 파일들로 받았다.
로직을 그대로 옮겨야한단다.
해서, 디컴파일이 필요한데 jd-gui는 파일별로 실행해야해서 피곤하니 jd-cli를 사용해서 하위 디렉토리 포함하여 모든 class파일을 한번에 디컴파일한 방법을 기술한다.
1. JDK 8이상 설치 필요
2. JD-CLI 다운로드 (https://github.com/kwart/jd-cli/releases)
유의사항은 Release 중에 소스만 있는 경우도 있고 jd-cli.jar가 포함된 경우도 있으므로 jar 포함된 버전으로 다운로드할 것!
3. 명령어 실행
# src_classes: 소스 위치 / src_decompiled: 디컴파일한 파일 저장할 위치
java -jar jd-cli.jar -ods src_decompiled src_classes
■ 명령어/옵션,역할 (개발자를 위한 쉬운 설명)
-ods src_decompiled: .java 파일들을 저장할 새 폴더를 지정합니다. 이 옵션(–outputDirStructured)은 원본 소스 코드의 패키지 구조(com/example/Class.java 등)를 그대로 유지하며 저장합니다.
src_classes: 변환할 대상 폴더 (.class 파일들이 들어있는 폴더)를 지정합니다. $\text{jd-cli}$가 이 폴더 안의 모든 .class 파일을 자동으로 찾아 변환합니다.
※ class파일 외의 모든 디렉토리/파일 구조가 그대로 복사됨.
[Sequelize] associations(관계) 정의
Posted on 2025. 3. 26. 14:23
Filed Under DB
1-1, 1-N, N-M 등 모델 간에 관계를 정의해 둬야 JOIN(include)를 알아서 처리한다.
DBMS에 있는 관계정의와 상관없이 sequelize 모델에 정의되어 있어야 함.
A belongsTo B (One-To-One or One-To-Many): A가 B에 속한다.
City.belongsTo(Coutry) -> city.getContry()
A hasMany B (One-to-Many): A는 많은 B를 가진다.
country.hasMany(City) -> country.getCities()
A belongsToMany B through C (Many-to-Many): A는 C매핑테이블을 통해서 B에 속한다.
User.belongsToMany(Project, { through: ProjectUser });
Project.belongsToMany(User, { through: ProjectUser });


