[Mac] 개발서버 구축기

[Mac] 개발서버 구축기

맥스튜디오를 CTO버전으로 구입하고 사용하던 맥북 두대는 모두 처분했다. SSD용량을 제외하고는 CPU와 메모리를 모두 최대치까지 셋팅해서 아마도 최소 6~7년은 새로운 컴퓨터 구입 없이 지낼 수 있을것 같다.(이 이후에도 컴퓨터를 고사양으로 필요로 하는 일을 할 수 있을지도 잘 모르겠다.) 새로운 장비는 원격으로 접속할 수 있도록 설정하고 밖에 다닐때는 아이패드만 들고 다닐 생각이다.

맥을 개발용 서버로 설정하면서 리눅스와 차이가 보이는 부분이 있어서 구축 과정을 기록으로 남겨본다.

#01. 맥 스튜디오 사양

구분 사양
프로세서 Apple M2 Ultra(24코어 CPU, 76코어 GPU, 32코어 Neural Engine)
메모리 192G 통합 메모리
저장장치 2TB SSD

img

맥 스튜디오의 언박싱은 허무하리만치 조촐했다. 본체, 전원 케이블 외에는 아무것도 없었다. 예전에 iMac 살 때는 키보드랑 마우스도 들어있더구만… 이건 더 비싼 녀석이 암것도 없다니… 살짝 실망했지만… 아무렴 어떠냐? 스팩이 괴물인데~ 이뻐죽겠다~ ㅎㅎㅎ

#02. 구축 시나리오

1. 구축할 구성요소

  1. SSH 서버 구성
  2. 원격 데스크탑 접속 구성
  3. JDK 설치
  4. Node.js 설치
  5. PyEnv를 활용한 Python 설치
  6. Jupyter Server 구성
  7. PHP 개발환경 구성
  8. SSL 인증서 발급 및 설정(jupyter, httpd)
  9. MariaDB

2. 서비스 포트 구성

포트번호 용도
9900 SSH 및 SFTP
9901 원격 데스크탑
9902 HTTP (HTTPS로 Redirect)
9903 HTTPS
9904 Jupyter Server

MariaDB는 원격 접속을 허용하지 않도록 할 계획이다.

#03. 기본 프로그램 설치

1. AppStore를 통한 설치

App 설명
무비스트 동영상 재생 프로그램
반디집 압축 및 압축 해제 프로그램. 맥에서는 압축과 해제를 위한 프로그램을 각각 설치해야 했었는데 이 프로그램은 통합으로 기능을 제공하고 있어서 구입했다.
카카오톡 말이 필요 없는 메시징 프로그램 (무료)
FineReader OCR Pro 고속 스케너를 구입하면서 번들로 제공받았던 프로그램인데 번들보다 유료 구입 버전이 성능이 더 좋았다.
Folder2ISO 폴더를 통째로 ISO 이미지로 생성하는 프로그램
Firendly Streaming 유투브, 넷플릭스, 디즈니 등 OTT에 대한 전용 브라우저 프로그램
Image Viewer 이미지 뷰어. 맥 기본 프로그램이 폴더 안의 이미지 이동 기능이 없어서 구입함
MacDroid 안드로이드 파일 전송 프로그램
Magnet 단축키를 통한 창 재배치
Microsoft Excel 말이 필요 없다. 방송대 계정으로 무료 이용중.
Microsoft PowerPoint 말이 필요 없다. 방송대 계정으로 무료 이용중.
Microsoft Word 말이 필요 없다. 방송대 계정으로 무료 이용중.
Navicat for MySQL MySQL 클라이언트 프로그램
OmniReader ePub 리더
PDF Expert PDF 리더. PDF 뷰어 끝판왕
Sequel Ace MySQL 클라이언트 프로그램 (무료)

2. 직접 혹은 brew를 통한 설치

App 설명
Adobe Photoshop 2024 그래픽 작업용
한컴오피스 한글 국산 워드프로세서 (내돈내산)
CleanMyMac X 시스템 청소 및 프로그램 제거시 사용
DockView Dock에서 실행중인 프로그램 미리보기
DropBox 웹 하드 (무료)
EdgeView 만화책 뷰어
FileZilla Pro FTP, SFTP 클라이언트 (내돈내산)
Folx Torrent 클라이언트 (무료)
Google Chrome 웹 브라우저 (무료)
iTerm 터미널 (무료))
Logi Options+ 로지텍 키보드, 마우스 관리 프로그램 (무료)
OpenInTerminal 단축키로 현재 위치에서 터미널 바로 열기 (무료)
Parallels Desktop 윈도우 가상화
QGIS GIS 프로그램 (무료)
ScanSnap Home 고속 스케너 프로그램 (내돈내산)
Snagit 2024 화면 캡쳐 프로그램
TotalFinder 파인더 확장 프로그램. Cmd+X로 파일 잘라내기를 가능하게 한다. (내돈내산)
Visual Studio Code 궁극의 코딩 프로그램 (무료)

#04. 시스템 기본 설정

필요한 소프트웨어를 설치한 후에는 시스템의 자잘한 기본 설정들을 진행한다.

몇년째 맥의 기본 설정을 하는데 참고하고 있는 사이트가 있다. 처음에는 zsh 설정을 참고하고자 즐겨찾기를 해 두었었는데 이제는 맥을 처음 시작하는 사람들에게 권하고 있다.

기초적인 부분부터 쭉 정독하면 매우 도움이 많이 되는 곳이다.

macOS 안내서

#05. SSH 서버 구성

1. SSH 접속 활성화

생각보다 설정이 쉬웠다.

시스템 설정 > 공유 화면으로 이동 후 원격 로그인항목을 활성화 한다.

2. SSH 접속 환경 설정

1) 설정 파일 열기

/etc/ssh/sshd_config 파일을 편집기로 연다.

리눅스였다면 vi로 편집해야 하겠지만 이미 시스템에 Visual Studio Code가 설치되어 있는 상태이므로 VSCode를 사용했다.

$ code /etc/ssh/sshd_config

2) 설정 파일 편집

키워드로 검색 후 값을 편집한다. 주석처리 되어 있다면 주석을 해제한다.

포트번호 설정

Port 9900

root 접속 차단

PermitRootLogin no

3) services 부분 수정

/etc/services 파일에서 ssh 관련 포트 부분을 수정해야 한다.

$ code /etc/services

아래와 같이 ssh의 TCP, UDP 포트값을 수정한다.

ssh              9900/udp     # SSH Remote Login Protocol
ssh              9900/tcp     # SSH Remote Login Protocol

4) git-clone시 변경사항

git에서도 ssh를 사용하고 있기 때문에 ssh의 접근 포트를 변경하면 Clone 명령어에 변화가 생긴다.

아래와 같이 ssh:// 프로토콜과 :22 포트를 직접적으로 명시해야만 github으로부터 clone이 가능해진다.

$ git clone ssh://git@github.com:22/leekh4232/hossam-blog.git

#06. 원격 데스크탑 접속 구성

원격 데스크탑은 주로 외부작업 진행중 긴급 상황시에 사용하려고 설치했다.

VNC는 속도 때문에 마음에 들지 않고, 크롬 데스크탑도 한계가 분명히 있어서 사용이 꺼려졌기 때문에 자료 조사를 진행하다가 NuoRDS라는 프로그램을 알게 되었다.

윈도우의 원격 데스크탑과 동일한 RDS 방식을 사용하기 때문에 윈도우에서 접속할 때는 별도 클라이언트 설치 없이 내장된 클라이언트 프로그램을 사용할 수 있다는 점이 매력이다.

직접 사용했을 때 성능도 꽤 만족스러웠다.

하지만 화면 해상도가 클라이언트에 맞춰지지 않고 내 Mac 해상도 그대로 사용되기 때문에 대부분 원격에서 접속했을 때 화면에 스크롤바가 생겼다.

NuoRDS

막상 설치하고 나니 외부에서 접속이 필요할 때 ssh 접속으로 대부분 해결하고 있어서 활용도는 크지 않은것 같다.

#07. JDK 설치

1. 설치 가능한 JDK 버전 확인

아래 명령으로 설치 가능한 버전들을 확인한다.

$ brew search jdk

아래와 같이 목록이 표시된다.

==> Formulae
openjdk        openjdk@11     openjdk@17     openjdk@21     openjdk@8      jd             mdk            cdk

==> Casks
adoptopenjdk            graalvm-jdk@21          microsoft-openjdk@17    oracle-jdk@21           semeru-jdk-open@17
gama-jdk                jdk-mission-control     oracle-jdk              sapmachine-jdk          semeru-jdk-open@21
graalvm-jdk             microsoft-openjdk       oracle-jdk-javadoc      semeru-jdk-open         semeru-jdk-open@8
graalvm-jdk@17          microsoft-openjdk@11    oracle-jdk@17           semeru-jdk-open@11

2. openjdk 설치

가장 기본이 되는 openjdk를 설치했다.

$ brew install openjdk

설치 후 환경변수 설정을 위해서 쉘 초기화 파일을 연다.

$ code ~/.zshrc

아래와 같이 환경변수를 설정한다.

export JAVA_HOME="/opt/homebrew/opt/openjdk"
export PATH="$JAVA_HOME/bin:$PATH"

설정이 완료되면 초기화 파일을 다시 로드한다.

$ source ~/.zshrc

설정 완료 후 버전 확인 명령으로 결과를 확인한다.

$ javac --version

이 시점 기준으로 22.0.1 버전이 설치되었다.

#08. Node.js 설치

$ brew install node

v22.4.0이 설치되었다.

#09. PyEnv를 활용한 Python 설치

macOS에는 기본적으로 파이썬 3.9가 설치되어 있다. 이 버전을 그대로 사용해도 되지만, 내 경험상 MacOS에 기본적으로 설치된 Python은 Mac에 기본으로 설치된 다른 프로그램들과 많은 연동이 되어있다. 처음에 나는 기본 Python을 사용해서 패키지도 설치하고 업그레이드도 하고 하다 보니 어느 날 갑자기 기본 프로그램들 몇 개가 에러가 나고 실행이 제대로 안 됐다. 그래서 시스템 기본 버전과 머신러닝 등에 사용되는 버전을 구분하기 위해 Python을 새로 설치했다.

또한, github의 여러 오픈 소스나 프로그램들을 사용하다 보니 각자가 필요로 하는 Python 패키지가 너무나도 많이 달랐다. 그래서 파이썬을 새로 설치하는 일이 꽤나 자주 발생하곤 했다. 그래서 파이썬을 여러 버전을 설치하고 필요시마다 파이썬의 버전을 변경해 가면서 사용할 수 있는 pyenv를 설치해서 파이썬을 관리하고자 했다.

pyenvvirtualenv를 함께 설치해서 파이썬 가상환경을 사용하는 글도 많이 보였지만 pyenv 자체가 파이썬을 여러 버전으로 설치해 두고 버전을 switch해 가면서 사용할 수 있기 때문에 가상환경까지는 필요 없을 것 같았다.

1. pyenv 설치

$ brew install pyenv

2. 환경변수 설정

~/.zshrc 파일에 다음의 내용을 추가한다.

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"

3. pyenv 사용하기

pyenv를 사용해서 내가 원하는 버전의 Python을 다음과 같이 설치하고 관리할 수 있다.

# 설치 가능한 Python 버전
$ pyenv install --list

# 특정한 버전 Python 설치
$ pyenv install 3.12.4

# 특정한 버전 Python 삭제
$ pyenv uninstall 3.12.4

# 설치된 Python list
$ pyenv versions

# 특정 Python 버전을 기본으로 설정
$ pyenv global 3.12.4

#10. Jupyter Server 구성

1. JupyterLab 설치

파이썬을 설치한 후 jupyter를 설치했다.

$ pip3 install jupyter

2. Jupyter Server 설정

(1) 비밀번호 생성

아래 명령으로 비밀번호를 생성한다.

$ jupyter lab password
출력결과

아래와 같이 비밀번호를 두 번 입력받는다. 그 후 비밀번호가 기입된 파일의 경로가 표시된다.

Enter password: ****
Verify password: ****
[JupyterPasswordApp] Wrote hashed password to /Users/leekh/.jupyter/jupyter_server_config.json

(2) 비밀번호 확인

생성된 파일을 열어 비밀번호를 확인한다. 입력한 값이 암호화 되어 있습니다.

이 값을 설정파일에 기입해야 합니다.

$ cat /Users/leekh/.jupyter/jupyter_server_config.json
출력결과

hashed_password의 값을 따옴표 없이 복사한다.

{
  "IdentityProvider": {
    "hashed_password": "...암호화된 비밀번호..."
  }
}

(3) 설정파일 생성

아래 명령으로 설정 파일을 생성합니다.

$ jupyter lab --generate-config
출력결과

아래와 같이 생성된 설정파일의 위치가 출력됩니다.

Writing default config to: /Users/leekh/.jupyter/jupyter_lab_config.py

(2) 설정파일 수정

vi 에디터로 설정파일을 편집한다.

$ code ~/.jupyter/jupyter_lab_config.py

편집 내용

아래 항목들을 찾아서 값을 변경한다.

# 서버 서비스 아이피 (모든 아이피 허용)
c.ServerApp.ip = '*'

# 서비스 가동시 브라우저 오픈 금지
c.ServerApp.open_browser = False

# jupyter_server_config.py 에서 복사한 비밀번호
c.ServerApp.password = "... 비밀번호 ..."

# 서비스 포트번호
c.ServerApp.port = 9904

# jupyter 가동시 root 디렉토리
c.ServerApp.root_dir = '/Users/leekh/workspace-notebook'

3. 서비스 구동

(1) 서비스 구동 정보 파일 생성

~/Library/LaunchAgents/jupyter.server.plist 파일을 생성하고 아래의 내용을 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>KeepAlive</key>
    <true />
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.jupyter.server</string>
    <key>ProgramArguments</key>
    <array>
      <!-- jupyter 실행 파일 경로 -->
      <string>/Users/leekh/.pyenv/shims/jupyter</string>
      <string>lab</string>
      <string>--no-browser</string>
    </array>
  </dict>
</plist>

(2) 설정파일 로드

앞에서 생성한 서비스 구동 정보 파일을 로드한다.

$ launchctl load ~/Library/LaunchAgents/jupyter.server.plist

(3) 서비스 가동 / 중지

서비스 시작

부팅시 자동으로 서비스가 시작된다.

$ launchctl start com.jupyter.server

서비스 중지

부팅시 자동으로 시작되지 않는다.

$ launchctl stop com.jupyter.server

#11. PHP 개발환경 구성

[1] Apache 및 PHP 설치

이 내용은 이미 이전에 정리한적이 있어서 해당 내용을 참고했다.

설치 과정에서 port 번호를 80번이 아닌 9902로 설정했고, DocumentRoot의 경로는 VirtualHost를 설정할 것이므로 기본 경로를 그대로 두었다.

[Mac] MacOS에 PHP 설치 (8.3)

[2] Composer 설치

PHP 개발을 하려면 Composer가 필요하다.

이 역시 이전에 정리를 해 둔 글이 있어서 참고했다.

[PHP] MacOS에 컴포저 설치 (8.3.2)

[3] Virtual Host 설정

다음의 포스팅에 Virtual Host 설정을 정리해 둔 글이 있어서 참고했다.

포트번호는 9902번으로 설정했으며, Cafe24를 통해서 실제 도메인을 집 아이피로 연결해 두었기 때문에 가상 도메인은 설정하지 않았다.

[Mac] MacOS의 httpd Virtual Host 설정

#12. SSL 인증서 발급 및 설정(jupyter, httpd)

#13. MariaDB

호쌤(이광호)'s Picture

About 호쌤(이광호)

메가스터디IT아카데미에서 Java, Spring, Python, Frontend 등을 강의하는 IT 전문 강사이자 프리렌서 개발자 입니다.
https://www.youtube.com/@hossam-codingclub

Seoul, Korea http://www.hossam.kr