commit 46cac2de6e07d493447f3887a7c5700ce6462191 Author: chiDT Date: Tue Aug 26 22:12:00 2025 +0900 initial commit diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a5c70a8 --- /dev/null +++ b/Dockerfile @@ -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/ = 209;/ = 122;/g' /usr/share/X11/xkb/keycodes/xfree86 +RUN sed -i 's/ = 210;/ = 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 diff --git a/README.md b/README.md new file mode 100644 index 0000000..ab0f3e9 --- /dev/null +++ b/README.md @@ -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 관련이 충돌이 많고 버그가 많아 포함시키지 않았습니다. 테스트 결과 설치하더라도 끊기거나 안정적이지 않습니다. 게다가 설치 용량도 너무 커지는 관계로 제외하였습니다. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..6a4b19b --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,3 @@ +# Security Policy + +보안 문제라고 판단되시면 언제든 이슈 등록해주세요! diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..415ca02 --- /dev/null +++ b/entrypoint.sh @@ -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 diff --git a/initial-resource/.config/fcitx5/config b/initial-resource/.config/fcitx5/config new file mode 100644 index 0000000..c883b10 --- /dev/null +++ b/initial-resource/.config/fcitx5/config @@ -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 diff --git a/initial-resource/.config/fcitx5/profile b/initial-resource/.config/fcitx5/profile new file mode 100644 index 0000000..67f62da --- /dev/null +++ b/initial-resource/.config/fcitx5/profile @@ -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=기본값 diff --git a/initial-resource/Desktop/chromium.desktop b/initial-resource/Desktop/chromium.desktop new file mode 100644 index 0000000..4daf13e --- /dev/null +++ b/initial-resource/Desktop/chromium.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=Chromium 웹 브라우저 +Comment=인터넷에 연결합니다 +Exec=/usr/bin/chromium %U +Icon=chromium +Terminal=false +Type=Application diff --git a/initial-resource/Desktop/vscode.desktop b/initial-resource/Desktop/vscode.desktop new file mode 100644 index 0000000..612f32b --- /dev/null +++ b/initial-resource/Desktop/vscode.desktop @@ -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 diff --git a/user-entrypoint.sh b/user-entrypoint.sh new file mode 100644 index 0000000..e2c760d --- /dev/null +++ b/user-entrypoint.sh @@ -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;) &