x86과 ARM이 섞인 Linux 서버 4대를 운영했다. 시간이 지나면서 서버마다 사용자명, SSH 설정, Docker 경로, 홈 디렉토리 구조가 제각각이 되었다. “이 서버는 어떤 계정이었지?”부터 확인해야 하는 상황이 되어 통일 작업을 진행했다.
Table of contents
Open Table of contents
서버 구성
| 서버 | 아키텍처 | OS | 역할 |
|---|---|---|---|
| A (x86) | x86_64 | Debian Trixie | GPU 연산 |
| B (ARM) | aarch64 | Debian Trixie | DB Slave + 서비스 |
| C (ARM) | aarch64 | Armbian Trixie | Web + Master DB + VPN |
| D (x86) | x86_64 | Debian Trixie | AI Hub (MCP 서버) |
통일 항목
1. 사용자 계정 통일
서버마다 다른 계정명을 사용하고 있었다. 하나의 계정으로 통일하고 sudo 권한을 설정했다.
# 모든 서버에 동일 계정 생성
sudo useradd -m -s /bin/bash {username}
echo '{username} ALL=(ALL) NOPASSWD: ALL' | sudo tee /etc/sudoers.d/{username}
기존 계정의 데이터는 새 계정 홈으로 이동하고, 이전 계정은 로그인 비활성화 후 유지했다(롤백 대비).
2. SSH 설정 중앙화
SSH config를 프로젝트 저장소에서 관리하고, 각 머신에서 Include로 참조하는 방식을 적용했다.
# ~/.ssh/config
Include ~/project/ssh/config
프로젝트의 SSH config:
Host server-a
HostName 192.168.x.10
User {username}
IdentityFile ~/project/ssh/id_ed25519
Host server-b
HostName 192.168.x.12
User {username}
IdentityFile ~/project/ssh/id_ed25519
# ... 4대 모두 동일 패턴
셋업 스크립트로 Include 추가/제거를 자동화했다.
#!/usr/bin/env bash
set -euo pipefail
SSH_DIR="$HOME/.ssh"
CONFIG="$SSH_DIR/config"
INCLUDE_LINE="Include ~/project/ssh/config"
case "${1:-install}" in
install)
mkdir -p "$SSH_DIR" && chmod 700 "$SSH_DIR"
if ! grep -qF "$INCLUDE_LINE" "$CONFIG" 2>/dev/null; then
echo "$INCLUDE_LINE" | cat - "$CONFIG" > /tmp/ssh_config && mv /tmp/ssh_config "$CONFIG"
fi
chmod 600 "$CONFIG"
;;
remove)
sed -i "\|$INCLUDE_LINE|d" "$CONFIG"
;;
esac
결과: Windows, macOS, 서버 간 SSH 접속 시 동일한 호스트명 사용 가능. ssh server-a로 모든 환경에서 접속.
3. 서버 간 상호 SSH 연결
4대 서버 간 상호 접속을 위해 authorized_keys를 교차 등록했다.
# 각 서버에서 키 생성 (이미 있으면 스킵)
[ -f ~/.ssh/id_ed25519 ] || ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
# 다른 3대 서버에 공개키 배포
for server in server-a server-b server-c server-d; do
ssh-copy-id -i ~/.ssh/id_ed25519.pub "$server"
done
4. Docker 경로 패턴
서버 하드웨어에 따라 두 가지 경로 패턴으로 표준화했다.
| 패턴 | 적용 서버 | Docker 소스 | 런타임 데이터 |
|---|---|---|---|
| NVMe 분리 | B, C (ARM) | ~/docker/ | /mnt/nvme/docker/ |
| 홈 통합 | A, D (x86) | ~/docker/ | ~/docker/ |
ARM 서버는 eMMC/SD 부팅 + NVMe 데이터 분리 구조라서, IO 집중 데이터(DB, 로그, 캐시)만 NVMe로 분리한다. x86 서버는 단일 디스크라서 홈 디렉토리에 통합한다.
# ARM 서버: 심볼릭 링크로 소스→데이터 연결
ln -s /mnt/nvme/docker/mariadb/data ~/docker/mariadb/data
ln -s /mnt/nvme/docker/redis/data ~/docker/redis/data
5. 홈 디렉토리 정리
각 서버의 불필요한 파일을 정리했다.
- 미사용 패키지 매니저 잔재 (
.pyenv,.cargo등) - 오래된 백업 아카이브 (
.tar.gz) - 중복 bash 히스토리
- 이전 계정의 config 파일
정리 원칙:
- 삭제 전
du -sh로 크기 확인 - 백업이 다른 곳에 있는지 확인
- 현재 사용 중인 프로세스가 참조하는지 확인 (
lsof) - 즉시 삭제가 아닌 압축 후 보관 → 2주 후 삭제
검증
# 모든 서버에서 동일 명령 실행 가능 확인
for s in server-a server-b server-c server-d; do
echo "=== $s ==="
ssh "$s" "whoami && docker ps --format '{{.Names}}' | head -5"
done
핵심 정리
서버 환경 통일의 핵심은 “어떤 서버에서든 같은 방식으로 작업할 수 있는 것”이다. 계정명, SSH 접속 방식, 경로 패턴이 통일되면, 스크립트를 서버별로 분기할 필요가 없어진다. 통일 작업 자체보다 통일 상태를 유지하는 것이 더 중요하므로, SSH config를 코드로 관리하고 셋업 스크립트로 자동화하는 것이 핵심이다.
참고 자료
- Arch Wiki: SSH Keys — SSH 키 생성 및 관리 가이드