리눅스로 서버를 열고 DB 관리하기

vednuyk·2026년 5월 7일

Unity

목록 보기
29/29

저번에 윈도우즈로 NHN Cloud에서 인스턴스를 생성했는데, 이제 OS를 리눅스로 하려고 한다.
왜냐! 가성비가 좋다. 리눅스는 운영체제 용량 자체가 가벼워서 스토리지도 높게 설정 할 필요도 없을 뿐더러 전반적으로 서버 성능이 좋기 때문이다.
사실, 업무를 받은 것도 있음 ㅋㅋ

어쨋거나 NHN Cloud에서 리눅스 운영체제로 서버 인스턴스 생성하고

ssh -i "asset-key.pem" ubuntu@xxx.xxx.x.x.x.x.x.(대충 내 IP)

해줘서 ubuntu 접속에 완료 했다.

서버의 소프트웨어 목록을 최신 상태로 업데이트하고, 유니티 엔진 구동 필수 라이브러리 설치까지 해야한다! + 압축 해제 도구까지

Power Shell에서 리눅스 서버로 빌드한거를 리눅스로 보낸 뒤
압축 해제 후 실행..!

클라이언트 빌드 파일 켜서 확인하니 잘 로그가 뜨는 모습.

개발 할 포트와 라이브 서버 할 포트를 나누어 줘야 작업 할 때 편하니까 NHN Security Group에 포트 규칙을 만들어주고 리눅스에서 포트 나누어서 실행하기 위해 .sh 를 만들어 줬다.

#!/bin/bash

PORT=$1

# 포트 번호를 입력하지 않았을 때의 방어막
if [ -z "$PORT" ]; then
  echo "⚠️ 사용법: ./start_servers.sh [포트번호]"
  exit 1
fi

# 🚨 핵심 방어막: 이미 해당 포트로 실행 중인 서버가 있는지 검사
if pgrep -f "AssetOnline.*-port $PORT" > /dev/null; then
  echo "❌ 에러: 포트 [$PORT]번 서버가 이미 실행 중입니다! (중복 실행 방지)"
  exit 1
fi

# 통과했다면 정상적으로 서버 실행
echo "🚀 Asset Online 서버를 [$PORT] 포트로 시작합니다..."
nohup ./AssetOnline.x86_64 -batchmode -nographics -force-multiple-instances -port $PORT > server_$PORT.log 2>&1 &

sleep 1
echo "✅ 실행 완료! (로그 파일: server_$PORT.log)"

그러고 DB 세팅 위해서 스키마 짜주고 WorkBench로 불러서 세팅완

-- uMMORPG2D MySQL Database Schema (Bulletproof Version)
-- 모든 컬럼을 백틱(` `)으로 감싸 예약어 충돌을 원천 차단
-- [Update] Added 'vault' column for Remote Warehouse.

CREATE DATABASE IF NOT EXISTS ummorpg;
USE ummorpg;

-- ==========================================
-- 1. BASE TABLES (Port 7777 / Default)
-- ==========================================

CREATE TABLE IF NOT EXISTS `accounts` (
    `name` VARCHAR(255) PRIMARY KEY,
    `password` VARCHAR(255) NOT NULL,
    `created` DATETIME NOT NULL,
    `lastlogin` DATETIME NOT NULL,
    `banned` BOOLEAN DEFAULT FALSE,
    `AccessLevel` INT DEFAULT 1
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `characters` (
    `name` VARCHAR(255) PRIMARY KEY,
    `account` VARCHAR(255) NOT NULL,
    `gender` INT DEFAULT 0,
    `classname` VARCHAR(255) NOT NULL,
    `currentScene` VARCHAR(255) NOT NULL,
    `x` FLOAT DEFAULT 0,
    `y` FLOAT DEFAULT 0,
    `level` INT DEFAULT 1,
    `health` INT DEFAULT 100,
    `mana` INT DEFAULT 100,
    `vitality` INT DEFAULT 10,
    `intelligence` INT DEFAULT 10,
    `strength` INT DEFAULT 10,
    `dexterity` INT DEFAULT 10,
    `luck` INT DEFAULT 10,
    `experience` BIGINT DEFAULT 0,
    `gold` BIGINT DEFAULT 0,
    `coins` BIGINT DEFAULT 0,
    `online` BOOLEAN DEFAULT FALSE,
    `lastsaved` DATETIME NOT NULL,
    `deleted` BOOLEAN DEFAULT FALSE,
    `chaosGauge` INT DEFAULT 0,
    `deathGauge` INT DEFAULT 0,
    `vault` TEXT, -- [Added] Remote Warehouse Data
    INDEX (`account`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `character_inventory` (
    `character` VARCHAR(255) NOT NULL,
    `slot` INT NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    `amount` INT DEFAULT 1,
    `summonedHealth` INT DEFAULT 0,
    `summonedLevel` INT DEFAULT 0,
    `summonedExperience` BIGINT DEFAULT 0,
    `upgradeLevel` INT DEFAULT 0,
    `skillLevel` INT DEFAULT 0,
    `skinLevel` INT DEFAULT 0,
    `addVit` INT DEFAULT 0,
    `addStr` INT DEFAULT 0,
    `addInt` INT DEFAULT 0,
    `addDex` INT DEFAULT 0,
    `addLuk` INT DEFAULT 0,
    `enhDamage` INT DEFAULT 0,
    `enhPhysicalDefence` INT DEFAULT 0,
    `enhAccuracy` FLOAT DEFAULT 0,
    `enhEvade` FLOAT DEFAULT 0,
    `enhMagicDefence` INT DEFAULT 0,
    PRIMARY KEY (`character`, `slot`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `character_equipment` (
    `character` VARCHAR(255) NOT NULL,
    `slot` INT NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    `amount` INT DEFAULT 1,
    `summonedHealth` INT DEFAULT 0,
    `summonedLevel` INT DEFAULT 0,
    `summonedExperience` BIGINT DEFAULT 0,
    `upgradeLevel` INT DEFAULT 0,
    `skillLevel` INT DEFAULT 0,
    `skinLevel` INT DEFAULT 0,
    `addVit` INT DEFAULT 0,
    `addStr` INT DEFAULT 0,
    `addInt` INT DEFAULT 0,
    `addDex` INT DEFAULT 0,
    `addLuk` INT DEFAULT 0,
    `enhDamage` INT DEFAULT 0,
    `enhPhysicalDefence` INT DEFAULT 0,
    `enhAccuracy` FLOAT DEFAULT 0,
    `enhEvade` FLOAT DEFAULT 0,
    `enhMagicDefence` INT DEFAULT 0,
    PRIMARY KEY (`character`, `slot`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `character_itemcooldowns` (
    `character` VARCHAR(255) NOT NULL,
    `category` VARCHAR(255) NOT NULL,
    `cooldownEnd` FLOAT DEFAULT 0,
    PRIMARY KEY (`character`, `category`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `character_skills` (
    `character` VARCHAR(255) NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    `level` INT DEFAULT 0,
    `castTimeEnd` FLOAT DEFAULT 0,
    `cooldownEnd` FLOAT DEFAULT 0,
    PRIMARY KEY (`character`, `name`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `character_buffs` (
    `character` VARCHAR(255) NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    `level` INT DEFAULT 0,
    `buffTimeEnd` FLOAT DEFAULT 0,
    PRIMARY KEY (`character`, `name`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `character_quests` (
    `character` VARCHAR(255) NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    `progress` INT DEFAULT 0,
    `completed` BOOLEAN DEFAULT FALSE,
    PRIMARY KEY (`character`, `name`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `character_orders` (
    `orderid` INT AUTO_INCREMENT PRIMARY KEY,
    `character` VARCHAR(255) NOT NULL,
    `coins` BIGINT DEFAULT 0,
    `processed` BOOLEAN DEFAULT FALSE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `guild_info` (
    `name` VARCHAR(255) PRIMARY KEY,
    `notice` TEXT,
    `maxCapacity` INT DEFAULT 20,
    `emblem` VARCHAR(255)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `character_guild` (
    `character` VARCHAR(255) PRIMARY KEY,
    `guild` VARCHAR(255) NOT NULL,
    `rank` INT DEFAULT 0,
    INDEX (`guild`)
) ENGINE=InnoDB;

-- ==========================================
-- 2. PORT 7778 ISOLATED TABLES
-- ==========================================

CREATE TABLE IF NOT EXISTS `port_7778_accounts` LIKE `accounts`;
CREATE TABLE IF NOT EXISTS `port_7778_characters` LIKE `characters`;
CREATE TABLE IF NOT EXISTS `port_7778_character_inventory` LIKE `character_inventory`;
CREATE TABLE IF NOT EXISTS `port_7778_character_equipment` LIKE `character_equipment`;
CREATE TABLE IF NOT EXISTS `port_7778_character_itemcooldowns` LIKE `character_itemcooldowns`;
CREATE TABLE IF NOT EXISTS `port_7778_character_skills` LIKE `character_skills`;
CREATE TABLE IF NOT EXISTS `port_7778_character_buffs` LIKE `character_buffs`;
CREATE TABLE IF NOT EXISTS `port_7778_character_quests` LIKE `character_quests`;
CREATE TABLE IF NOT EXISTS `port_7778_character_orders` LIKE `character_orders`;
CREATE TABLE IF NOT EXISTS `port_7778_guild_info` LIKE `guild_info`;
CREATE TABLE IF NOT EXISTS `port_7778_character_guild` LIKE `character_guild`;

-- ==========================================
-- 3. SAFETY PATCH (For Existing Tables)
-- ==========================================
-- 테이블이 이미 존재할 경우 vault 컬럼이 누락되었을 수 있으므로 강제로 추가합니다.

SET @dbname = DATABASE();
SET @tablename = 'characters';
SET @columnname = 'vault';
SET @preparedStatement = (SELECT IF(
  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
   WHERE TABLE_SCHEMA = @dbname
     AND TABLE_NAME = @tablename
     AND COLUMN_NAME = @columnname) > 0,
  'SELECT 1',
  CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN ', @columnname, ' TEXT NULL')
));
PREPARE stmt FROM @preparedStatement;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- Port 7778용 Safety Patch
SET @tablename = 'port_7778_characters';
SET @preparedStatement = (SELECT IF(
  (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
   WHERE TABLE_SCHEMA = @dbname
     AND TABLE_NAME = @tablename
     AND COLUMN_NAME = @columnname) > 0,
  'SELECT 1',
  CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN ', @columnname, ' TEXT NULL')
));
PREPARE stmt FROM @preparedStatement;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

게임 내에서 잘 DB가 연결 됐는지 보기 위해 Server_Log 도 만들었는데 복사 하질 못했다.
그래서 캐릭터 생성하고 (개발자 서버) WorkBench 확인 했는데 잘 뜨고 있는 모습 ㅎㅎ

profile
Hi, I'm game developer :)

0개의 댓글