저번에 윈도우즈로 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 확인 했는데 잘 뜨고 있는 모습 ㅎㅎ