ShellRS
ShellRS 是一款免費、開源的 SSH 客戶端,使用 Rust 編寫:主機管理、終端機、WinSCP 風格的 SFTP 與埠轉發,全部於一個 GPU 渲染視窗中,支援 macOS、Windows 與 Linux。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗ทุกการแก้ไขบันทึกลงฐานข้อมูล Supabase ทันที ทุกคนเห็นข้อมูลเดียวกันแบบสด ๆ เข้าใช้ด้วย ชื่อผู้ใช้ + รหัสผ่าน ที่ผู้ดูแลสร้างให้ (ไม่ใช้ Magic link) แพ็กหนึ่งแก้ได้ทีละคน คนแรกที่เปิดแพ็กจะถือสิทธิ์แก้ไว้ คนอื่นเห็นว่า “🔒 ชื่อ กำลังแก้แพ็กนี้อยู่” และดูได้อย่างเดียว จนกว่าคนแรกจะออกจากแพ็กนั้น
index.html หน้าเว็บ (ไฟล์เดียวกับ tosm-pack-builder.html + บรรทัดโหลด /config.js)
api/config.js ส่งค่าเชื่อมต่อ Supabase ให้หน้าเว็บ (/config.js)
api/admin-users.js สร้างบัญชี / รีเซ็ตรหัสผ่าน / เปลี่ยนสิทธิ์ (เฉพาะ admin)
supabase/schema.sql ตาราง + RLS + ระบบล็อกแพ็ก (รันครั้งเดียว รันซ้ำได้)
vercel.json, package.json
supabase/schema.sql → Runselect * from public.rls_audit(); → ต้องได้ 0 แถว
(ถ้ามีแถวขึ้น แปลว่ามีตารางที่ยังไม่เปิด RLS หรือเปิดให้ anon ใช้ได้)Supabase → Authentication → Sign In / Providers
[email protected] (ชื่อผู้ใช้ตามด้วย @tosm.local)update public.profiles set role = 'admin', active = true, display_name = 'SK' where username = 'sk';
คนต่อไปสร้างจากในเว็บได้เลย (ตั้งค่า → จัดการผู้ใช้)select value from private.app_config where key = 'app_client_key';
คัดลอกค่าที่ได้ไว้ใส่ใน Vercel ขั้นถัดไป
npx vercel ในโฟลเดอร์นี้)
Framework Preset: Other · ไม่ต้องมี Build command| ชื่อ | ค่า |
|---|---|
SUPABASE_URL | https://slmxqrjttummvgfhmfnd.supabase.co |
SUPABASE_PUBLISHABLE_KEY | sb_publishable_ksgczLdB9vYu6Q-QISTPkg_p40z-uER |
APP_CLIENT_KEY | ไม่ต้องใส่แล้ว (หน้าเว็บรับรหัสนี้จากฐานข้อมูลหลังล็อกอิน) |
SUPABASE_SERVICE_ROLE_KEY | Supabase → Project Settings → API Keys → Secret key (sb_secret_…) |
LOGIN_DOMAIN | ไม่ต้องใส่ (ค่าเริ่มต้น tosm.local) |
⚠ Secret key / service_role ใส่ที่ Vercel เท่านั้น ห้ามใส่ในหน้าเว็บ ห้ามส่งในแชท ห้าม commit ขึ้น GitHub ถ้าเผลอหลุด ให้กด Revoke/Roll ที่ Supabase แล้วใส่อันใหม่
sk และรหัสผ่านจากขั้นที่ 3สิทธิ์: ผู้ดูแล (ทุกอย่าง + จัดการผู้ใช้) · แก้ไขได้ · ดูอย่างเดียว ปิดบัญชี = เข้าสู่ระบบไม่ได้ทันที และปล่อยแพ็กที่เขาถืออยู่
| ชั้น | ป้องกันอะไร |
|---|---|
anon ไม่มีสิทธิ์ใด ๆ ในทุกตาราง | ใครถือแค่ publishable key แต่ไม่ได้ล็อกอิน อ่าน/เขียนอะไรไม่ได้เลย |
| RLS เปิดทุกตาราง | อ่านได้เฉพาะบัญชีที่เปิดใช้งาน · เขียนได้เฉพาะสิทธิ์ ผู้ดูแล/แก้ไขได้ |
Header x-app-client | การเขียนต้องส่งรหัส App Client มาด้วย สคริปต์ภายนอกที่เอา key ไปยิงตรงจะเขียนไม่ได้ |
ตาราง profiles, edit_locks, change_log | แก้จากหน้าเว็บตรง ๆ ไม่ได้ ต้องผ่านฟังก์ชันหรือ API ผู้ดูแล |
| Event trigger | ตารางใหม่ที่สร้างทีหลังจะถูกเปิด RLS อัตโนมัติ |
rls_audit() | ตรวจได้ทุกเมื่อ ต้องได้ 0 แถว |
change_log | บันทึกว่าใครสร้าง/แก้/ลบแพ็กและโฟลเดอร์ เมื่อไร |
หมายเหตุ: รหัส App Client อยู่ในหน้าเว็บ คนที่ล็อกอินแล้วเปิดดูโค้ดจะเห็นได้ จึงเป็นด่านเสริม ด่านหลักจริง ๆ คือ ต้องล็อกอิน + RLS ถ้าอยากเปลี่ยนรหัส:
update private.app_config set value = '…' where key = 'app_client_key';แล้วแก้APP_CLIENT_KEYใน Vercel ให้ตรงกัน
| ตาราง | เก็บอะไร |
|---|---|
profiles | ผู้ใช้: username, ชื่อที่แสดง, สิทธิ์, เปิด/ปิดใช้งาน |
folders | โฟลเดอร์โปรโมชัน: ชื่อ, สี, ลำดับแพ็ก |
packs | แพ็ก: ชื่อ, Fixed/Random, ราคา, Limit, วันเวลาขาย, Reset, หมวด Aztek, Type, โบนัส GSP/EXP, แนวคิด, รูป, ยอดขายจริง |
pack_items | ไอเทมในแพ็ก: Item ID, ชื่อ, จำนวน, TP, TP in-game, โอกาส %, ได้แน่นอน, ไอเทมนอกลิสต์, ลำดับ |
item_values | TP ที่จำไว้ต่อไอเทม (เติมให้อัตโนมัติครั้งต่อไป) |
app_settings | อัตรา TP→THB, Seed ต่อ THB, ชื่อหมวด Aztek |
edit_locks | ใครกำลังแก้แพ็กไหน หมดอายุเมื่อไร |
change_log | ประวัติการแก้ไข |
รายการไอเทม (คลังไอเทม) ยังโหลดจาก Google Sheet ผ่าน Apps Script URL เหมือนเดิม (ตั้งค่า → Apps Script URL)
แทนที่ index.html ด้วยไฟล์ใหม่ แล้ว push/redeploy · ถ้า schema.sql มีการแก้ ให้รันใน SQL Editor ซ้ำได้เลย (ข้อมูลเดิมไม่หาย)
มีแค่ supabaseUrl, publishable key และ loginDomain ใน /config.js ซึ่งจำเป็นสำหรับการล็อกอินเอง
และเปิดอะไรไม่ได้ถ้าไม่มีบัญชี (RLS ทุกตาราง, anon ไม่มีสิทธิ์ใด ๆ)
ส่วนนี้ส่งให้ หลังล็อกอินเท่านั้น ผ่าน public.client_config() (เฉพาะบัญชีที่เปิดใช้งาน):
private.app_config.app_client_key)private.app_config.items_api, รหัส items_key ถ้าตั้ง ACCESS_KEY ในสคริปต์)เปลี่ยน URL ของรายการไอเทม: update private.app_config set value = 'https://script.google.com/macros/s/…/exec' where key = 'items_api';
ตอนออกจากระบบ เบราว์เซอร์ไม่เก็บข้อมูลโฟลเดอร์หรือรายการไอเทมไว้