RIDM Apps โฮสติ้งแอป
เมื่อเชื่อมต่อ GitHub repository จะบิลด์·ดีพลอยทุกครั้งที่ push และเผยแพร่ที่ที่อยู่ <name>.ridm.ai แต่ละแอปมี PostgreSQL DB เฉพาะ จึงบันทึกสมาชิก·โพสต์·บันทึกได้ทันที นำขึ้นได้ทั้งแอปที่สร้างด้วย API ซาจู และเว็บแอปทั่วไปที่ไม่ใช้ API
สมัครที่แอปของฉัน คู่มือการดีพลอย แพลน·ราคา ค้นหาโดเมน
ให้ AI สร้างแอปให้ — อีบุ๊กฟรี (ภาษาเกาหลี)
เลือกอีบุ๊ก (ภาษาเกาหลี)แอปดูดวงแบบรวม (ภาษาเกาหลี)แอปแชตตัวละคร (ภาษาเกาหลี)เว็บแอประบบสมาชิก (ภาษาเกาหลี)
ดีพลอยใน 4 ขั้นตอน
- สมัคร — เลือกแพลนและที่อยู่ (ซับโดเมน) ในแอปของฉันในคอนโซล
- เชื่อมต่อ GitHub — ติดตั้ง GitHub App
ridm-apps-builderแล้วเลือก repository และ branch สิทธิ์มีเพียงการอ่าน repository - Push — ทุกครั้งที่ push ไปยัง branch ที่เชื่อมต่อ การบิลด์จะเริ่มขึ้น ประวัติการบิลด์และล็อกที่ล้มเหลวจะแสดงในหน้าจอแอป
- เผยแพร่ — เมื่อบิลด์สำเร็จจะผ่านการตรวจสอบอัตโนมัติแล้วเผยแพร่ทันที ก่อนการดีพลอยครั้งแรกจะเผยแพร่ จะไม่มีการหักค่าบริการแบบชำระเงิน
เว็บไซต์แบบสแตติกที่มีเพียง HTML·CSS·JS ก็นำขึ้นด้วยคอนเทนเนอร์ (Dockerfile) วางไฟล์ไว้ใน public/ แล้วใส่ Dockerfile ด้านล่างไว้ที่รากของ repository ก็ได้ เงื่อนไขอย่างพอร์ต 3000 ผู้ใช้ 1000 อยู่ในคู่มือการดีพลอย
FROM busybox:1.36
COPY --chown=1000:1000 public /www
USER 1000:1000
EXPOSE 3000
CMD ["httpd", "-f", "-p", "3000", "-h", "/www"]
นำเว็บไซต์สแตติกที่มี 3D·รูปภาพขนาดใหญ่ขึ้นระบบ
เว็บไซต์ที่มีโมเดล (.glb)·เท็กซ์เจอร์ขนาดหลายสิบ MB อย่างเกม three.js ให้ใช้ nginx:alpine แทน busybox เพราะ busybox httpd กำหนดเฮดเดอร์แคชไม่ได้ และส่ง .glb·.ktx2 เป็นไฟล์ประเภททั่วไป วางสองไฟล์ด้านล่างไว้ที่รากของ repository แล้วผลการบิลด์ (dist/ ตาม Vite) จะถูกให้บริการตามเดิม
# Dockerfile
FROM node:22-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:1.27-alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build --chown=1000:1000 /app/dist /usr/share/nginx/html
USER 1000:1000
EXPOSE 3000
ENTRYPOINT ["nginx", "-g", "daemon off;"]
# nginx.conf — runs as user 1000 on a read-only file system: only /tmp is writable.
worker_processes 1;
pid /tmp/nginx.pid;
error_log /dev/stderr warn;
events { worker_connections 1024; }
http {
include /etc/nginx/mime.types;
# 3D types missing from the stock mime.types (.wasm is already there).
types {
model/gltf-binary glb;
model/gltf+json gltf;
image/ktx2 ktx2;
}
default_type application/octet-stream;
client_body_temp_path /tmp/client_temp;
proxy_temp_path /tmp/proxy_temp;
fastcgi_temp_path /tmp/fastcgi_temp;
uwsgi_temp_path /tmp/uwsgi_temp;
scgi_temp_path /tmp/scgi_temp;
access_log off;
server_tokens off;
sendfile on;
tcp_nopush on;
# Text formats only. .glb / .ktx2 / images are already compressed.
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 5;
gzip_types text/css application/javascript text/javascript application/json
image/svg+xml model/gltf+json application/wasm text/plain;
# /assets/ = bundler output whose names carry a content hash (Vite default).
map $uri $cache_control {
~^/assets/ "public, max-age=31536000, immutable";
~*\.(?:glb|gltf|bin|ktx2|basis|hdr|webp|avif|png|jpe?g|svg|mp3|ogg|wasm|js|css|woff2?)$ "public, max-age=3600";
default "no-cache";
}
# Errors (404 etc.) are never cached, so a file added later shows up at once.
map $status $cache_header {
~^(200|206|304)$ $cache_control;
default "no-store";
}
server {
listen 3000;
root /usr/share/nginx/html;
add_header Cache-Control $cache_header always;
# Keeps the site out of search results. Delete this line to be indexed.
add_header X-Robots-Tag "noindex, nofollow" always;
location / {
try_files $uri $uri/ =404;
}
}
}
- แคช — ไฟล์ใต้
/assets/(ผลการบิลด์ที่มีแฮชในชื่อ) จะไม่ดาวน์โหลดใหม่เป็นเวลา 1 ปี โมเดล·รูปภาพ·สคริปต์อื่นๆ 1 ชั่วโมง และindex.htmlจะตรวจสอบใหม่ทุกครั้ง หากเรียกโมเดลในโค้ดแบบimport sceneUrl from './models/scene.glb?url'Vite จะใส่ไว้ใน/assets/ด้วยชื่อแฮช ไฟล์ที่วางไว้ในpublic/ใช้ชื่อเดิมจึงแคชเพียง 1 ชั่วโมงCache-Control·Content-Type·X-Robots-Tagที่แอปส่งมา RIDM Apps จะส่งต่อตามเดิมโดยไม่เปลี่ยนแปลง - ไฟล์ที่ดาวน์โหลดพร้อมกัน — จำนวนไฟล์ที่ผู้เยี่ยมชมหนึ่งคนดาวน์โหลดพร้อมกันได้ ในพาธ
/assets/จะมากกว่า หากมีโมเดล·เท็กซ์เจอร์จำนวนมากให้รวมไว้ที่/assets/ - การบีบอัด — HTML·JS·CSS·JSON·
.gltf·.wasmจะเล็กลงด้วย gzip จากการตั้งค่าข้างต้นและ Brotli ที่ส่วนหน้า.glb·.ktx2·รูปภาพจะไม่เล็กลงอีกระหว่างส่ง จึงควรลดขนาดตัวไฟล์เอง: เมชใช้ Draco หรือ meshopt เท็กซ์เจอร์ใช้ KTX2 (Basis) หรือ WebP ตัวอย่าง:npx @gltf-transform/cli optimize scene.glb scene.opt.glb --compress meshopt --texture-compress webp(ใน three.js ให้เชื่อมMeshoptDecoder·DRACOLoader·KTX2Loaderเข้ากับGLTFLoader) - ขนาด — ชุดไฟล์หลายสิบ MB และไฟล์เดี่ยวประมาณ 15MB นำขึ้นและให้บริการได้โดยไม่มีปัญหา repository เป็นไปตามขีดจำกัดของ GitHub (ไฟล์เดี่ยว 100MB) และการบิลด์ต้องเสร็จภายใน 20 นาที ไฟล์ที่อัปโหลดด้วย Git LFS จะไม่เข้าไปในการบิลด์ จึงควรใส่เป็นคอมมิตปกติ
- ปริมาณการรับส่งข้อมูลรายเดือน — ขนาดไฟล์ทั้งหมดที่ส่งให้ผู้เยี่ยมชมนับรวมในปริมาณการรับส่งข้อมูลรายเดือน ผู้เยี่ยมชมครั้งแรกจะดาวน์โหลดไฟล์ทั้งหมด (หาก 1,000 คนเปิดเว็บไซต์ขนาด 30MB เป็นครั้งแรกจะประมาณ 30GB) การลดขนาดไฟล์จึงได้ผลมากที่สุด ปริมาณการรับส่งข้อมูลของแต่ละแพลนอยู่ในหน้าราคา
- การแสดงในผลการค้นหา — การตั้งค่าข้างต้นใช้
X-Robots-Tag: noindexเพื่อไม่ให้แสดงในผลการค้นหา หากต้องการให้แสดงในการค้นหา ให้ลบบรรทัดนั้นออก
สิ่งที่มีให้
- PostgreSQL DB เฉพาะแต่ละแอป — ข้อมูลการเชื่อมต่อเข้ามาเป็นตัวแปรสภาพแวดล้อม (
DATABASE_URLฯลฯ) และเชื่อมต่อด้วย TLS ที่ตรวจสอบถึงใบรับรอง - ตัวแปรสภาพแวดล้อมที่เข้ารหัส — ค่าที่บันทึกจะถูกเข้ารหัสเก็บไว้และดูซ้ำไม่ได้ เมื่อบันทึก แอปจะรีสตาร์ตด้วยค่าใหม่
- การสำรอง DB — สร้าง DB dump แล้วดาวน์โหลดได้จากหน้าจอแอป (สูงสุดวันละ 3 ครั้ง)
- บล็อกค่าลับ — หากพบคีย์·โทเค็น·รหัสผ่านใน repository จะหยุดการบิลด์เพื่อไม่ให้เผยแพร่
- เชื่อมต่อโดเมนของคุณ — โดเมนที่ซื้อจาก RIDM เลือกเชื่อมต่อได้ที่ การจัดการโดเมน → เชื่อมต่อแอป ในคอนโซล ทั้งราก
wwwหรือที่อยู่ย่อยอย่างplay.example.com(หนึ่งระดับ ตัวอักษรภาษาอังกฤษพิมพ์เล็ก·ตัวเลข·ขีดกลาง) RIDM จะสร้างเรคคอร์ด DNS และใบรับรองให้ - สแตกใดก็ได้ — มี
Dockerfileที่รากของ repository และตอบสนองที่พอร์ต 3000 ก็พอ Dockerfile เริ่มต้นสำหรับ Next.js อยู่ในคู่มือการดีพลอย
แพลน
- แพลนฟรี — เปิดเมื่อมีผู้เยี่ยมชม และหยุดเมื่อไม่มีคำขอ 15 นาที การเยี่ยมชมครั้งแรกหลังหยุดอาจช้าไม่กี่วินาที พาร์ทเนอร์ละ 1 แอป
- แพลนแบบชำระเงิน — ทำงานตลอดเวลา และรีสตาร์ตอัตโนมัติเมื่อแอปล่ม ค่าบริการหักจากเครดิตที่เติมไว้ทุกเดือน
ราคา·หน่วยความจำ·ความจุ DB·ปริมาณการรับส่งข้อมูลรายเดือนของแต่ละแพลนดูได้ที่หน้าราคา หากยกเลิก จะหยุดในวันที่สิ้นสุดระยะเวลาที่ชำระเงินไว้แล้ว และหลังจากนั้น 30 วันยังดาวน์โหลดหรือกู้คืนข้อมูลได้
ข้อจำกัดที่ควรรู้
- ใช้ WebSocket ได้ในแพลนแบบชำระเงิน (พร้อมกัน 120 การเชื่อมต่อต่อแอป ข้อความ 64KB) ขีดจำกัดโดยละเอียดอยู่ในเอกสารโฮสติ้ง
- ระบบไฟล์เป็นแบบอ่านอย่างเดียว ข้อมูลถาวรให้บันทึกใน DB
- พอร์ตส่งอีเมล (SMTP) ถูกปิดกั้น ส่งอีเมลผ่านบริการอีเมลแบบ HTTPS API
- การเชื่อมต่อ DB ได้พร้อมกันสูงสุด 3 การเชื่อมต่อต่อแอป
เงื่อนไขทั้งหมดดูได้ที่คู่มือการดีพลอยและข้อกำหนดการใช้งาน หมวด 3 (ภาษาเกาหลี)
หากอยากลองสร้างตั้งแต่ต้น
เว็บแอประบบสมาชิกด้วย AI (ภาษาเกาหลี) เป็นอีบุ๊กแบบลงมือทำฟรีที่เมื่อให้ประโยคเริ่มต้นหนึ่งบรรทัดกับเครื่องมือเขียนโค้ด AI จะแนะนำตั้งแต่การสร้างการสมัคร·เข้าสู่ระบบและสมุดบันทึกเฉพาะสมาชิก จนถึงการเผยแพร่บน RIDM Apps หากจะสร้างแอปซาจูให้ดูโซลูชัน AI ดูดวงแบบรวม (ภาษาเกาหลี) หากจะเริ่มจากการเชื่อมต่อ API ซาจูให้ดูคู่มือเริ่มต้นใช้งานสำหรับนักพัฒนา
หากอยากสร้างโดยไม่ต้องเขียนโค้ด เลือกบล็อกซาจู·ดูดวงใน Baro (สร้างแอปแบบประกอบ) เพื่อประกอบแอป แล้วอัปโหลดแพ็กเกจดีพลอยที่ดาวน์โหลดไปยัง RIDM Apps ได้ทันที
หากอยากดูทุกอย่างตั้งแต่การสร้างจนถึงเซิร์ฟเวอร์·DB·โดเมนในครั้งเดียว ดูได้ที่พัฒนาแอปแบบครบวงจร
ติดต่อ: contact@float.do · ดำเนินการโดย: FLOAT Co., Ltd.