반응형

 

 

 


 

문서 개정 이력

날짜 제목 상세
2024-12-23 초안 작성 최초 메뉴얼 포스팅

 

테크팀 채널 소개

테크팀 채널은 누구나 친구들과 함께 즐길 수 있는 사설서버를 구축하기 위한 강의를 제공하기 위해 만들어졌습니다. 
아래와 같은 다양한 공식 자료를 확인하실 수 있습니다.
제목 링크이동
테크팀 유튜브 채널 링크이동
테크팀 디스코드 서버 링크이동
테크팀 게임사설 서버 (T2Server) 링크이동
테크팀 게임사설 서버 디스코드 링크이동

 

테크팀 채널 소개

팰월드 자주하는 질문 포스팅 
 

[팰월드] 서버구축 자주하는 질문 & 답변 모음

문서 개정 이력날짜제목상세2024-02-25초안 작성최초 메뉴얼 포스팅2024-12-21내용 수정최신 내용 반영하여 수정 서버 구축 참고 문헌들기술 참고 사이트 (공식)번호항목설명링크이동1공식 구축 가

techtim.tistory.com

 


 

동영상 강의

팰월드 윈도우OS 서버 구축하기 : 2024.12 Ver

 



Step1 : 윈도우 방화벽 개방

New-NetFirewallRule -DisplayName "PalWorld" -Direction Inbound -LocalPort 8211 -Protocol UDP -Action Allow

 


 

Step2 : 포트포워딩 

UDP 8211 포트를, 서버 PC 내부 IP 쪽으로 포트포워딩 합니다

 

포트포워딩 완료

 

IPTime이 아닌 다른 공유기 브랜드별 포트포워딩 유튜브 자료
번호 브랜드 YouTube 링크
1 IP Time 공유기 링크이동
2 KT 공유기 링크이동
3 TP Link 공유기 링크이동
4 Next 공유기 링크이동
5 SK 브로드밴드 공유기 링크이동
6 LG U+ 공유기 링크이동

 


 

Step3 : 게임엔진 설치

설치 스크립트 삽입
steamcmd +login anonymous +app_update 2394010 validate +quit

 


 

Step4 : 게임엔진 실행 실행

바로 가기 아이콘 스크립트 삽입의 예 : 4 쓰레드
-useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS

 

바로 가기 아이콘 스크립트 삽입의 예 : 8 쓰레드
-useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS -NumberOfWorkerThreadsServer=8

 

반응형

반응형

시작하며

서문
  • 본 가이드는 YouTube 채널 “테크팀” 에서 제작 되었으며, 테크팀 채널의 영상내용에 최적화 되어있습니다.
  • 본가이드의 오류발견시 아래 주소로 제보 부탁 드립니다.

 

[ 테크팀 공식 강의 영상 ]

 


참고자료

영상 제작에 참고한 자료들 (URLs)

 


사전작업

PalWorldSettings.ini 파일 수정
  • ini 파일 편집기로 수정
nano ~/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini

 

  • RCONEable 지정
  • 수정항목 : AdminPassword="12341234"    ,   RCONEnabled=True 로 변경함 
[/Script/Pal.PalGameWorldSettings]
OptionSettings=(Difficulty=None,DayTimeSpeedRate=1.000000,NightTimeSpeedRate=1.000000,ExpRate=1.000000,PalCaptureRate=1.000000,PalSpawnNumRate=1.000000,PalDamageRateAttack=1.000000,PalDamageRateDefense=1.000000,PlayerDamageRateAttack=1.000000,PlayerDamageRateDefense=1.000000,PlayerStomachDecreaceRate=1.000000,PlayerStaminaDecreaceRate=1.000000,PlayerAutoHPRegeneRate=1.000000,PlayerAutoHpRegeneRateInSleep=1.000000,PalStomachDecreaceRate=1.000000,PalStaminaDecreaceRate=1.000000,PalAutoHPRegeneRate=1.000000,PalAutoHpRegeneRateInSleep=1.000000,BuildObjectDamageRate=1.000000,BuildObjectDeteriorationDamageRate=1.000000,CollectionDropRate=1.000000,CollectionObjectHpRate=1.000000,CollectionObjectRespawnSpeedRate=1.000000,EnemyDropItemRate=1.000000,DeathPenalty=All,bEnablePlayerToPlayerDamage=False,bEnableFriendlyFire=False,bEnableInvaderEnemy=True,bActiveUNKO=False,bEnableAimAssistPad=True,bEnableAimAssistKeyboard=False,DropItemMaxNum=3000,DropItemMaxNum_UNKO=100,BaseCampMaxNum=128,BaseCampWorkerMaxNum=15,DropItemAliveMaxHours=1.000000,bAutoResetGuildNoOnlinePlayers=False,AutoResetGuildTimeNoOnlinePlayers=72.000000,GuildPlayerMaxNum=20,PalEggDefaultHatchingTime=72.000000,WorkSpeedRate=1.000000,bIsMultiplay=False,bIsPvP=False,bCanPickupOtherGuildDeathPenaltyDrop=False,bEnableNonLoginPenalty=True,bEnableFastTravel=True,bIsStartLocationSelectByMap=True,bExistPlayerAfterLogout=False,bEnableDefenseOtherGuildPlayer=False,CoopPlayerMaxNum=4,ServerPlayerMaxNum=32,ServerName="PalBotTest",ServerDescription="",AdminPassword="12341234",ServerPassword="",PublicPort=8211,PublicIP="",RCONEnabled=True,RCONPort=25575,Region="",bUseAuth=True,BanListURL="https://api.palworldgame.com/api/banlist.txt")

 

 


디스코드 작업

Create Apps
  • 디스코드 개발자 포탈 접속 : 링크이동
  • ‘New Application’ 선택

 

  • Bot의 이름 지정 후, ‘Create’ 선택

 

  • 서브메뉴 ‘Bot’으로 이동 합니다.

 

  • ‘Reset Token’ 클릭 : 토큰을 초기화 합니다.

 

  • 같은 화면 아래쪽에 ‘Privileged Gateway Intents’ 값을 아래 그림과 같이 모두 Enable 합니다.

 

  • 메인메뉴 → OAuth2 → ‘URL Generator’ 선택

 

  • Scope : ‘Bot’을 선택

 

  • Bot Permissions : ‘Administrator’ 선택

 

  • URL 복사

 

  • 브라우저를 열고 복사한 주소를 붙여넣기
  • 아래와 같은 ‘외부 애플리케이션’ 창이 뜨게되며 ‘서버에 추가:’ 항목에 추가를 원하는 디스코드 서버를 선택 후 → ‘계속하기’ 클릭

 

  • 관리자 권한을 체크한 상태에서 ‘승인’ 선택

 

  • 내 서버에 ‘Bot’이 추가된 것을 확인

반응형

 


PalBot Linux 설치

Dependencies 설치
  • apt update
sudo apt update

 

  • Install Dependencies
sudo apt install python3.10 python3.10-venv python3.10-dev git virtualenv nano

 

본 설치 진행
  • Git Clone
git clone https://github.com/dkoz/palworld-bot
cd palworld-bot

 

  • create a virtual env and install the requirements
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

 

  • Configure the environment variables and server configuration
cp .env.example .env

 

  • nano .env
nano .env
## 기본값 ##

BOT_TOKEN='TOKEN_HERE'      <-------- 앞선 스탭에서 복사해두었던 토큰 값을 여기에 넣는다
BOT_PREFIX=!
BOT_ACTIVITY='Palworld'
## 수정의 예시 ##

BOT_TOKEN='MTIwNz*****************Y'
BOT_PREFIX=!
BOT_ACTIVITY='Palworld'

 

  • exit를 눌러 Virtualenv 에서 빠져나옴

 


PalBot 실행하기

  • screen 실행 : 게임 엔진과는 별도의 스크린을 실행합니다.
screen

 

  • virtual env 접속
cd ~/palworld-bot
source venv/bin/activate

 

  • Palbot 실행
python main.py

 


그밖에 ... 

‘Broadcast’ 사용시 아직 한글은 지원되지 않습니다 (아래처럼 한글을 깨짐 / 영어는 정상 출력)

반응형
반응형

시작하며 

  • 본 가이드는 YouTube 채널 “테크팀” 에서 제작 되었으며, 테크팀 채널의 영상내용에 최적화 되어있습니다.
  • 본가이드의 오류발견시 아래 주소로 제보 부탁 드립니다.

 

YouTube 영상은 업로드 예정

 


참고자료

웹사이트

 

프로그램 데모 화면 미리 보기 

예제1 : 서버 접속자가 보유한 팰 전체 리스트 보기

 

예제2 : 서버 접속자 리스트 및 보유 팰

 

예제3 : 접속자 별 보유 팰의 상세 정보

 

 

사전 정보 
  • 추가로 개방되어야 할 방화벽 포트 : 원할 경우 변경 가능
TCP : 8080

 

  • PalWorldSettings.ini 파일에 반드시 아래 정보가 설정되어 있어야 동작 합니다.
1. RCON Enable 설정이 반드시 True로 잡혀 있어야 함 
2. 관리자 패스워드 설정이 반드시 있어야 함

 


리눅스 사설 서버 위에 구축

방화벽 추가 개방
  • 구글 클라우드에서 방화벽 개방  ( TCP 8080 )

TCP 8080 을 추가합니다.

 

  • 리눅스 OS에서 방화벽 개방

SSH 접근

 

  • 리눅스 OS에서 방화벽 개방
## 방화벽 개방 ##
sudo iptables -I INPUT -p tcp --dport 8080 -j ACCEPT

## 방화벽 저장 ##
sudo netfilter-persistent save

## 방화벽 설정 확인 ##
sudo iptables -nL

 

파일 다운로드
 

Releases · zaigie/palworld-server-tool

[中文|English|日本語]基于.sav存档解析和RCON优雅地用可视化界面管理幻兽帕鲁专用服务器。/ Through parse .sav and RCON, visual interface management PalWorld dedicated server. - zaigie/palworld-server-tool

github.com

리눅스 다운로드를 위해 '링크 주소 복사' 를 눌러 URL을 카피함

 

  • 홈 디렉토리로 이동
cd ~

 

  • 다운로드 진행
wget https://github.com/zaigie/palworld-server-tool/releases/download/v0.6.1/pst_v0.6.1_linux_x86_64.tar.gz

wget 으로 다운로드

 

  • 다운로드한 파일 확인
ls -l

파일 리스트 확인

 

  • 압축해제 
gzip -d <파일명>

gzip -d pst_v0.6.1_linux_x86_64.tar.gz

gzip 압축 해제

 

  • tar 해제 
tar -xvf <파일명>

tar -vf pst_v0.6.1_linux_x86_64.tar

tar 해제

 

  • 파일 확인 및 pst 폴더 이동
ls -l
cd linux_x86_64

ls -l

 

최초 Inital 실행 및 환경 변수 선언
  • nano 편집기로 config.yaml 파일 수정 
nano config.yaml

 

  • config.yaml 파일 원본 양식
web:
  password: ""
  port: 8080
  tls: false
  cert_path: ""
  key_path: ""
  public_url: ""
rcon:
  address: "127.0.0.1:25575"
  password: ""
  is_palguard: false
  timeout: 5
  sync_interval: 60
save:
  path: "/path/to/your/Pal/Saved"
  decode_path: ""
  sync_interval: 120
  backup_interval: 14400
manage:
  kick_non_whitelist: false

 

  • 아래와 같이 수정
  • 반드시 절대 경로를 모두 입력해야 합니다.
web:
  password: ""
  port: 8080
  tls: false
  cert_path: ""
  key_path: ""
  public_url: ""
rcon:
  address: "127.0.0.1:25575"
  password: "12341234"        <--- PalWorldSettings.ini에 있는 관리자 비밀번호 
  is_palguard: false
  timeout: 5
  sync_interval: 60
save:
  path: "/home/ubuntu/Steam/steamapps/common/PalServer/Pal/Saved/SaveGames/0/A860A46533464E0A934425B7A17121C1/Level.sav"
  decode_path: ""
  sync_interval: 120
  backup_interval: 14400
manage:
  kick_non_whitelist: false

 

실행 및 최종 확인
  • screen 실행
screen

 

  • pst 실행 
./pst

 

  • 스크린 빠져나가기 
ctrl + a + d

 

  • 웹브라우저 실행 후 접속 테스트
http://<VM공인IP>:8080


예 - http://123.123.123.123:8080

웹프라우저를 통한 정상 접근 확인

 

반응형

 

반응형
반응형

시작하며 

  • 본 가이드는 YouTube 채널 “테크팀” 에서 제작 되었으며, 테크팀 채널의 영상내용에 최적화 되어있습니다.
  • 본가이드의 오류발견시 아래 주소로 제보 부탁 드립니다.

 

 

[ 테크팀 공식 영상 ]

 


참고자료

웹사이트

 

프로그램 데모 화면 미리 보기 

예제1 : 서버 접속자가 보유한 팰 전체 리스트 보기

 

예제2 : 서버 접속자 리스트 및 보유 팰

 

예제3 : 접속자 별 보유 팰의 상세 정보

 

 

사전 정보 
  • 추가로 개방되어야 할 방화벽 포트 : 원할 경우 변경 가능
TCP : 8080

 

  • PalWorldSettings.ini 파일에 반드시 아래 정보가 설정되어 있어야 동작 합니다.
1. RCON Enable 설정이 반드시 True로 잡혀 있어야 함 
2. 관리자 패스워드 설정이 반드시 있어야 함

 

반응형

 


윈도우 사설 서버 위에 구축

윈도우 방화벽 추가 개방
  • 파워쉘을 관리자 모드로 실행 
New-NetFirewallRule -DisplayName "PalWorld-ServerTool" -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow

 

포트포워딩
  • 8080 포트를 자신의 PC로 포트포워딩 진행함 [ 각 제조사 공유기에 맞게 설정 진행합니다 ] 

자신의 공유기에서 포트포워디을 진행함

 

파일 다운로드
 

Releases · zaigie/palworld-server-tool

[中文|English|日本語]基于.sav存档解析和RCON优雅地用可视化界面管理幻兽帕鲁专用服务器。/ Through parse .sav and RCON, visual interface management PalWorld dedicated server. - zaigie/palworld-server-tool

github.com

윈도우용 파일 다운로드
윈도우 PST 파일 구성의 예

 

  • pst_v_0.x.x 폴더의 이름을 pst로 변경한다 (권고)
  • pst 폴더를 PalWorld Dedicated Server 디렉토리로 옮긴다 

팰월드 엔진 디렉토리에 'pst' 폴더를 옮겨 놓는다

 

환경 설정 구성
  • pst 폴더내부에 있는 환경설정 파일을 수정합니다.
  • config.yaml 파일 수정 (원본 양식)
web:
  password: ""                      
  port: 8080  						
  tls: false						
  cert_path: ""						
  key_path: ""						
  public_url: ""					
rcon:
  address: "127.0.0.1:25575"		
  password: ""						
  is_palguard: false				
  timeout: 5						
  sync_interval: 60					
save:
  path: "Level.sav파일의 절대 경로"	
  decode_path: ""					
  sync_interval: 120				
  backup_interval: 14400				
manage:
  kick_non_whitelist: false

 

  • config.yaml 파일 : 수정예제
  • 윈도우 시스템이라도 디렉토리 표현은 \ 이 아닌 / 으로 표현해야 함 (이것 때문에 한참 Trouble Shooting 했습니다)
web:
  password: ""
  port: 8080
  tls: false
  cert_path: ""
  key_path: ""
  public_url: ""
rcon:
  address: "127.0.0.1:25575"
  password: "12341234"     <--- PalWorldSettings.ini에 있는 관리자 비밀번호 
  is_palguard: false
  timeout: 5
  sync_interval: 60
save:
  path: "../steamapps/common/PalServer/Pal/Saved/SaveGames/0/6CF106DFD08C40A48E0E944C0F634140/Level.sav"
  decode_path: ""
  sync_interval: 120
  backup_interval: 14400
manage:
  kick_non_whitelist: false

 

PST 구동
  • (1번) PalWorld Dedciated Server 구동 

 

  • (2번) PST Server 구동 

 

실행 및 최종 확인
  • 접속 주소 
## 자신의 서버 PC에서 바로 접속 ## 
http://127.0.0.1:8080



## 외부 사용자가 접속할 경우 ##
http://<공인IP>:8080

예 - http://123.123.123.123:8080

공인 IP를 사용한 접속의 예

 

반응형
반응형

시작하며

서문
  • 본 가이드는 YouTube 채널 “테크팀” 에서 제작 되었으며, 테크팀 채널의 영상내용에 최적화 되어있습니다.
  • 본가이드의 오류발견시 아래 주소로 제보 부탁 드립니다.

[ 강의 영상 ]

 


참고자료

기술 자료제작에 참고한 사이트 

 

모드 다운로드 사이트 

 


모드의 종류

동작위치에 따른 모드 분류
  • Client Side Mod : 클라이언트만 설치하여 사용됨 ( IE : 미니맵 )
  • Server Side Mod : 서버에만 설치하여 사용됨 → 거의 없음
  • Client & Server Mod : 클라이언트, 서버 둘다 설치 하여 사용됨 → 대부분이 이 방식으로 운영됨
  • 따라서 본 가이드에서 모든 모드는, 서버+클라이언트 설치를 기본 전제로 설명합니다

 

구성 환경에 따른 모드 종류
  • pak 모드 : pak 확장자를 가지고 있는 단일 파일 모드
  • script 모드(=Lua모드) : 대부분의 모드가 여기에 속하며 script 폴더를 포함하는 모드
반응형

UE4SS 설치

모드를 구동하기 위해서는 "UE4SS"가 서버/클라이언트 모두 필수적으로 설치되어 있어야 합니다. 
 

Releases · UE4SS-RE/RE-UE4SS

Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games - UE4SS-RE/RE-UE4SS

github.com

 

  • 압축해제 

 

UE4SS 설치하기 
  • 다운로드 받은 파일을 압축해제하고 모든 파일을 아래 디렉토리에 붙어 넣기 합니다. 
## 파일 위치 ## 
{SteamCMD}\steamapps\common\PalServer\Pal\Binaries\Win64

붙여넣기한 화면의 예

 

필수파일 수정
  • 압축 디렉토리 내부에 존재하는 ‘UE4SS-settings.ini’ 파일을 열어 아래 항목을 수정 합니다.
## 파일 위치 ##
{SteamCMD}\steamapps\common\PalServer\Pal\Binaries\Win64\UE4SS-settings.ini
## 수정 부분 ##
bUseUObjectArrayCache = false   <---- 'False'로 변경합니다. 기본 값은 True로 되어있습니다.

 

모드 다운로드 
  • 모드 제공사이트에서 원하는 Mod를 다운로드 받습니다.

 

모드 설치 위치 
  • .pak 모드 : pak 확장자를 가지고 있는 단일 파일 모드
{SteamCMD}\steamapps\common\PalServer\Pal\Content\Paks

 

  • script 모드(=Lua모드) : 대부분의 모드가 여기에 속하며 script 폴더를 포함하는 모드
{SteamCMD}\steamapps\common\PalServer\Pal\Binaries\Win64\Mods

 

mods.txt 파일 수정 (Script, Lua 모드 전용)
  • 파일 위치 
{steamapps}\common\PalServer\Pal\Binaries\Win64\Mods\mods.txt

 

  • mods.txt 파일 수정 : 설치한 모드 디렉토리 명을 적어주고 ‘ 1 ‘ 로 표기함 → 1은 사용한다는 뜻 0은 사용하지 않는 다는 뜻
## mods.txt 작성의 예 ## 
## MapUnlocker 모드를 추가했을 경우 ##


CheatManagerEnablerMod : 1
ActorDumperMod : 0
ConsoleCommandsMod : 1
ConsoleEnablerMod : 1
SplitScreenMod : 0
LineTraceMod : 0
BPModLoaderMod : 1
BPML_GenericFunctions : 1
jsbLuaProfilerMod : 0

MapUnlocker : 1    <------------- 추가한 모드의 디렉토리 이름을 작성하고 '1' 로 설정 

; Built-in keybinds, do not move up!
Keybinds : 1

 

반응형
반응형

안녕하세요 테크팀 입니다. 

오늘 포스팅은 여러분들께서 구글 클라우드에 구축하신 VM에

MobaXterm을 사용하여 SSH 프로토콜을 사용하여

명령어 터미널 + 파일전송(SFTP)를 구성하는 방법에 대하여 가이드 합니다. 

본 포스팅의 내용을 동영상으로 보시길 원하는 분들은 아래 공식 영상을 참조하세요

https://youtu.be/yrL9RaLX4DY?si=zpSoTBRHp5gYYr69

 

먼저 프로그램을 다운로드 받아야 합니다. 

프로램의 이름은 모바엑스텀(MobaXterm)입니다. 

무료로 제공되는 오픈소스 툴이며 아래 링크를 통해 다운로드가 가능합니다. 

https://mobaxterm.mobatek.net/download.html

 

MobaXterm free Xserver and tabbed SSH client for Windows

The ultimate toolbox for remote computing - includes X server, enhanced SSH client and much more!

mobaxterm.mobatek.net

 

프로그램을 다운로드 받았다면 "Next"만 눌러 설치 해주세요 

설치가 완료되었다면 SSH Key-Pair를 만들어서 구글 클라우드에 등록 하겠습니다. 

Key Pair란 일종의 현관문 열쇄와 같은 개념입니다. 

클라우드에서는 ID / Password 방식의 로그인은 보안에 취약하므로

SSH Key를 이용한 접속을 권장합니다. 

 

자 그럼 키 발급부터 시작해 보겠습니다. 

MobaXterm의 상단 메뉴에서 Key Generation을 선택합니다.

Tools -> MoaKeyGen (SSH Key Generator)

메뉴를 클릭하면 아래와 같이 생성 메뉴가 뜹니다

Generate를 눌러 생성 시작

단 주의하실 사항은 반드시 아래 표시된 붉은 박스 영역에서

마우스를 움직여 주셔야 합니다. 가만히 있으면 생성되지 않습니다. 잼있죠 ? 

 

키 생성이 완료되고 나면 아래와 같이 Key 생성 내용이 출력되고 여기서

'Key Comment' 부분에 여러분의 구글 클라우드 ID를 넣습니다 (아래 그림)

자신의 구글 ID를 넣는다

ID를 넣었다면 생성된 Public / Private 키를 여러분들의 PC에 저장하여 안전하게 보관합니다.

 

지금까지 작업은 MobaXterm을 다운로드 받고

프로그램을 이용하여 키를 생성하여 여러분의 PC에 저장했습니다. 

이제 저장한 키를 구글 클라우드에 등록하여 VM 접속에 사용할 수 있도록 설정하겠습니다. 

구글 클라우드 콘솔에 접속하여 "Compute Engine" -> "메타데이터" 로 이동 합니다.

 

메타데이터 항목에서 "SSH키" -> "수정" 으로 들어갑니다.

 

"항목 추가"를 눌러 SSH 키 항목에 여러분들이 생성하신 Key 값을 붙여 넣기 합니다. 

생성한 키 값을 복사함

 

"짝짝짝" 이제 모든 작업이 완료 되었습니다. 

구글 클라우드에 잘 접속이 되는지 MobaXterm을 이용하여 접속 테스트 해보겠습니다.  

MobaXterm을 실행하고 'User Session'에서 우클릭하여 'New Session'을 선택 합니다

 

서버 접근 완료

축하 드립니다 서버에 정상적으로 접근 되었습니다. 

앞으로 VM 운영을 위해 구글 클라우드 콘솔에 접근할 필요 없이 

PC에서 MobaXterm만 실행하여 언제든 여러분들의 서버에 

명령어도 실행하고, 파일도 전송할 수 있게 되었습니다. 

반응형
반응형

==== [ 원본 영상 ] ====

 

스크린 세션 생성하기

  • screen 을 칠때마다 새로운 스크린 세션이 생성 됩니다.
screen

 

스크린 세션을 백그라운드로 돌려 놓으면서 빠져나가기 

  • Ctrl 키는 누르면서 a와d 키는 한번씩 누릅니다.
ctrl + a + d

 

생성된 스크린 세션 리스트 확인하기

screen -ls

 

반응형

 

스크린 세션 재접속 

screen -r {세션번호}

 

스크린을 백그라운드가 아닌, 종료(Termination)하면서 빠져나가기

  • screen으로 재접속 이후 ctrl + a + d 가 아닌, exit를 눌러 빠져나갑니다. 
screen -r {세션번호}
exit
반응형

+ Recent posts