initial commit

This commit is contained in:
2025-08-26 22:12:00 +09:00
commit 46cac2de6e
9 changed files with 282 additions and 0 deletions

49
Dockerfile Normal file
View File

@@ -0,0 +1,49 @@
FROM debian:trixie
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
# locale gen
RUN apt-get install -y locales
ENV TZ=Asia/Seoul
ENV LANG=ko_KR.UTF-8
ENV LANGUAGE=ko_KR:ko
ENV LC_ALL=ko_KR.UTF-8
RUN sed -i 's/^# *ko_KR.UTF-8 UTF-8/ko_KR.UTF-8 UTF-8/' /etc/locale.gen && locale-gen $LANG && update-locale LANG=$LANG
# install modules
RUN apt-get install -y dbus-x11 x11-xserver-utils xfce4 xfce4-goodies xorgxrdp xrdp tumbler \
ibus ibus-gtk3 fcitx5-hangul fcitx5-config-qt fcitx5-frontend-gtk3 fcitx5-frontend-gtk4 fcitx5-frontend-qt5 fonts-noto-cjk \
sudo nano vim net-tools chromium git curl npm \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# install vscode
RUN curl -q -L -o vscode.deb https://update.code.visualstudio.com/1.103.2/linux-deb-x64/stable \
&& apt-get install ./vscode.deb \
&& rm -rf ./vscode.deb /etc/apt/sources.list.d/vscode.sources
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
COPY user-entrypoint.sh /etc/X11/Xsession.d/97user-entrypoint
COPY initial-resource/ /var/initial-resource/
# korean keycode correction
RUN sed -i 's/<HNGL> = 209;/<HNGL> = 122;/g' /usr/share/X11/xkb/keycodes/xfree86
RUN sed -i 's/<HJCV> = 210;/<HJCV> = 121;/g' /usr/share/X11/xkb/keycodes/xfree86
# startup profile
RUN echo "TZ=Asia/Seoul" >> /etc/environment && \
echo "LANG=ko_KR.UTF-8" >> /etc/environment && \
echo "LANGUAGE=ko_KR:ko" >> /etc/environment && \
echo "LC_ALL=ko_KR.UTF-8" >> /etc/environment && \
echo "GTK_IM_MODULE=fcitx" >> /etc/environment && \
echo "QT_IM_MODULE=fcitx" >> /etc/environment && \
echo "QT4_IM_MODULE=fcitx" >> /etc/environment && \
echo "QT5_IM_MODULE=fcitx" >> /etc/environment && \
echo "XMODIFIERS=@im=fcitx" >> /etc/environment
EXPOSE 3389
ENTRYPOINT /entrypoint.sh

33
README.md Normal file
View File

@@ -0,0 +1,33 @@
![Repo Size](https://img.shields.io/github/repo-size/lancard/xwindow-korean)
![File Count](https://img.shields.io/github/directory-file-count/lancard/xwindow-korean)
![Docker Pulls](https://img.shields.io/docker/pulls/lancard/xwindow-korean)
![Docker Image Size](https://img.shields.io/docker/image-size/lancard/xwindow-korean)
# 설명
RDP(리모트 데스크탑) 지원하는 경량 debian 13 (trixie) base 한글 XWINDOW(wayland) docker
# 설치된 프로그램
- Visual studio code
- Chromium
- vim
- git
- npm + nodejs
# 사용법
- docker 3389 port 열어서 띄우시면 됩니다. 그 후 윈도우 원격 데스크탑(3389포트)으로 해당 컨테이너 접속.
- 사용자명을 지정하고 싶은 경우, docker env 에다가 XWINDOW_USER=(사용자명), XWINDOW_PASSWORD=(패스워드) 를 입력하시면 됩니다.
- 만약 입력안하시는 경우 사용자명은 'user', 패스워드는 임의로 생성되며, 패스워드는 docker logs 에 표시됩니다.
# 사용자 데이터 및 볼륨 유지
- docker 에서 /home/(사용자명) 볼륨을 연결하시는 경우 home 디렉토리 안에 있는 자료는 유지되며 계속 사용하실 수 있습니다.
# 로컬리소스 (드라이브) 연결
- 보안 상 로컬리소스가 붙는게 막혀있습니다. 로컬 리소스를 연결해서 CTRL+C / CTRL+V 같은 파일 복사를 원하시는 경우에는 privileged 모드로 실행하세요.
- privileged 모드로 실행하는 경우 C: 같은 드라이브는 home 디렉토리 내 thinclient_drives 에 마운트 됩니다.
# 새 사용자 생성
sudo su 하셔서 루트 권한으로 adduser 하시면 됩니다.
# 주의사항
- privileged mode 가 아닌 경우 vscode 나 chromium 이 no-sandbox 모드에서 실행됩니다. 참고하십시오.
- sound 관련이 충돌이 많고 버그가 많아 포함시키지 않았습니다. 테스트 결과 설치하더라도 끊기거나 안정적이지 않습니다. 게다가 설치 용량도 너무 커지는 관계로 제외하였습니다.

3
SECURITY.md Normal file
View File

@@ -0,0 +1,3 @@
# Security Policy
보안 문제라고 판단되시면 언제든 이슈 등록해주세요!

49
entrypoint.sh Normal file
View File

@@ -0,0 +1,49 @@
#!/bin/bash
set -e
export TZ=Asia/Seoul
export LANG=ko_KR.UTF-8
export LANGUAGE=ko_KR:ko
export LC_ALL=ko_KR.UTF-8
# set username
XWINDOW_USER="${XWINDOW_USER:-user}"
if ! id -u $XWINDOW_USER >/dev/null 2>&1; then
useradd -m -s /bin/bash $XWINDOW_USER
echo "user '$XWINDOW_USER' generated."
fi
# set password
if [ -z "$XWINDOW_PASSWORD" ]; then
XWINDOW_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 8)
echo "$XWINDOW_USER's generated password: $XWINDOW_PASSWORD"
fi
echo "$XWINDOW_USER:$XWINDOW_PASSWORD" | chpasswd
echo "user '$XWINDOW_USER' password set."
# change own and permission
chown $XWINDOW_USER:$XWINDOW_USER /home/$XWINDOW_USER
chmod 700 /home/$XWINDOW_USER
# add sudo group
usermod -aG sudo $XWINDOW_USER
# remove pid files
[ ! -f /var/run/xrdp/xrdp-sesman.pid ] || rm -f /var/run/xrdp/xrdp-sesman.pid
[ ! -f /var/run/xrdp/xrdp.pid ] || rm -f /var/run/xrdp/xrdp.pid
# check sandbox mode
set +e
SANDBOX_CHECK_OUTPUT=$(unshare -U true 2>&1)
SANDBOX_CHECK_EXIT_CODE=$?
if [ "$SANDBOX_CHECK_EXIT_CODE" -ne 0 ]; then
sed -i 's|^CHROMIUM_FLAGS=""|CHROMIUM_FLAGS="--no-sandbox --start-maximized --disable-gpu"|' /usr/bin/chromium
rm -rf /usr/bin/code
ln -s /usr/share/code/bin/code /usr/bin/code
sed -i 's|ELECTRON_RUN_AS_NODE=1 "\$ELECTRON" "\$CLI" "\$@"|ELECTRON_RUN_AS_NODE=1 "\$ELECTRON" "\$CLI" --no-sandbox --disable-gpu "\$@"|' /usr/share/code/bin/code
fi
set -e
# run program
/usr/sbin/xrdp-sesman
/usr/sbin/xrdp --nodaemon

View File

@@ -0,0 +1,78 @@
[Hotkey]
# 트리거 키를 반복해서 누를 때 열거하기
EnumerateWithTriggerKeys=False
# 입력기 전환
EnumerateForwardKeys=
# 입력기 역순으로 전환
EnumerateBackwardKeys=
# 열거하는 동안 첫 번째 입력기 건너뛰기
EnumerateSkipFirst=False
# 입력기 그룹 전환
EnumerateGroupForwardKeys=
# 입력기 그룹 역순으로 전환
EnumerateGroupBackwardKeys=
# 입력기 활성화
ActivateKeys=
# 입력기 비활성화
DeactivateKeys=
# Time limit in milliseconds for triggering modifier key shortcuts
ModifierOnlyKeyTimeout=250
[Hotkey/TriggerKeys]
0=Control+space
1=Alt+Alt_R
2=Hangul
[Hotkey/AltTriggerKeys]
0=Shift_L
[Hotkey/PrevPage]
0=Up
[Hotkey/NextPage]
0=Down
[Hotkey/PrevCandidate]
0=Shift+Tab
[Hotkey/NextCandidate]
0=Tab
[Hotkey/TogglePreedit]
0=Control+Alt+P
[Behavior]
# 기본적으로 활성화
ActiveByDefault=False
# Reset state on Focus In
resetStateWhenFocusIn=No
# 입력 상태 공유
ShareInputState=All
# 응용프로그램에서 사전편집 표시
PreeditEnabledByDefault=True
# 입력기 변경시 입력기 정보 표시
ShowInputMethodInformation=True
# 포커스를 변경할 때 입력기 정보 표시
showInputMethodInformationWhenFocusIn=False
# 간결한 입력기 정보 표시
CompactInputMethodInformation=True
# 첫 번째 입력기 정보 표시
ShowFirstInputMethodInformation=True
# 페이지 크기 기본값
DefaultPageSize=5
# Xkb 옵션 재정의
OverrideXkbOption=False
# 사용자 지정 Xkb 옵션
CustomXkbOption=
# Force Enabled Addons
EnabledAddons=
# Force Disabled Addons
DisabledAddons=
# Preload input method to be used by default
PreloadInputMethod=True
# Allow input method in the password field
AllowInputMethodForPassword=False
# Show preedit text when typing password
ShowPreeditForPassword=False
# Interval of saving user data in minutes
AutoSavePeriod=30

View File

@@ -0,0 +1,22 @@
[Groups/0]
# Group Name
Name=기본값
# Layout
Default Layout=us
# Default Input Method
DefaultIM=keyboard-us
[Groups/0/Items/0]
# Name
Name=keyboard-us
# Layout
Layout=
[Groups/0/Items/1]
# Name
Name=hangul
# Layout
Layout=
[GroupOrder]
0=기본값

View File

@@ -0,0 +1,7 @@
[Desktop Entry]
Name=Chromium 웹 브라우저
Comment=인터넷에 연결합니다
Exec=/usr/bin/chromium %U
Icon=chromium
Terminal=false
Type=Application

View File

@@ -0,0 +1,7 @@
[Desktop Entry]
Name=Visual Studio Code
Comment=Code Editing. Redefined.
Exec=/usr/bin/code %F
Icon=vscode
Terminal=false
Type=Application

34
user-entrypoint.sh Normal file
View File

@@ -0,0 +1,34 @@
FIRST_LOGIN_SETUP_FLAG="$HOME/.first_login_setup_done"
# first login script
if [ ! -f "$FIRST_LOGIN_SETUP_FLAG" ]; then
# 디폴트 브라우져 설정
xdg-settings set default-web-browser chromium.desktop
# fcitx5 설정 복사
cp /var/initial-resource/.config ~ -R
# .desktop 파일 복사
mkdir -p ~/바탕화면
cp /var/initial-resource/Desktop/*.desktop ~/바탕화면/
# Desktop/*.desktop 반복 처리
for FILE in ~/바탕화면/*.desktop; do
# 1. 실행 권한 부여
chmod +x "$FILE"
# 2. XFCE 체크섬 설정
if command -v gio >/dev/null 2>&1; then
SHA256=$(sha256sum "$FILE" | awk '{print $1}')
gio set "$FILE" metadata::xfce-exe-checksum "$SHA256"
chmod 700 "$FILE"
fi
done
touch "$FIRST_LOGIN_SETUP_FLAG"
fi
# normal start scripts ------------------------------------------------------------------------
fcitx5 -d
(sleep 5; setxkbmap -rules base -model pc105 -layout kr -variant kr106 -option korean:ralt_hangul -option korean:rctrl_hanja;) &