Lập trình viên / Tra cứu
Variables và môi trường local
Cấu hình theo backend, bí mật mã hóa và cách dùng cùng os.environ trên máy riêng.
Thêm biến cho backend
Mở dự án → Mini Server → chọn backend → Variables → + Thêm biến. Nhập Tên biến và Giá trị mới; bật Bí mật cho API key, mật khẩu hoặc thông tin đăng nhập. Bấm Lưu thay đổi. Biến thường hiển thị giá trị; bí mật chỉ hiện Bí mật đã lưu và không có nút đọc lại. Chỉ phiên đăng nhập của chủ dự án quản lý Variables; khóa API quản lý/CI và phiên quản trị nền tảng không có quyền này.
Khi Sửa biến bí mật, giá trị cũ không được tải về trình duyệt: phải nhập giá trị mới. Muốn chuyển thành biến thường cũng phải nhập lại giá trị; hệ thống không giải mã bí mật cũ để công khai. Xóa biến cần xác nhận; request mới không còn biến đó. Khi xung đột revision, tải lại trước khi lưu để tránh ghi đè thay đổi từ cửa sổ khác.
Có tối đa 64 biến/backend, tên tối đa 128 ký tự theo [A-Za-z_][A-Za-z0-9_]*; mỗi giá trị UTF-8 tối đa 8 KiB, tổng tên và giá trị tối đa 64 KiB. Nhận chuỗi rỗng và nhiều dòng, không nhận NUL. WHYPIK_*, _WHYPIK*, PYTHON*, LD_*, DYLD_*, LC_*, OMP_*, MKL_*, XDG_* và các tên PATH/HOME/TMP/TEMP/TMPDIR/LANG/TZ/USER/LOGNAME/SHELL, proxy/CA/OpenSSL, thread-pool thuộc runtime; không dùng chúng làm Variables ứng dụng.
Lượt gọi mới sau khi lưu dùng revision Variables mới và nạp lại mã. Lượt đang chạy giữ cấu hình tại lúc bắt đầu; lượt còn chờ với revision cũ bị chặn trước khi thực thi. Sandbox cũ không được tái dùng cho cấu hình mới.
Đọc trong Python
Variables có sẵn trong os.environ trước khi import server.py, kể cả bước kiểm tra bản triển khai. Giá trị luôn là chuỗi. Hai backend có thể có cùng tên biến nhưng giá trị riêng; không tự dùng chung với Hosting, cửa hàng hoặc backend khác.
Mỗi request lấy một snapshot nguyên tử khi được nhận. Sửa Variables áp dụng cho request/validation nhận sau đó; request đang chạy giữ snapshot cũ. Rollback chỉ đổi phiên bản mã, không khôi phục Variables cũ. Thay biến không tự kiểm tra lại mọi phiên bản, nên hãy kiểm tra các biến mà mã đang chạy yêu cầu.
import os
from whypik import api
APP_MODE = os.environ.get("APP_MODE", "production")
@api.get("/health")
async def health(request):
return {"ok": True, "mode": APP_MODE}
# Đọc secret cho client thư viện, không trả ra HTTP hoặc print:
# token = os.environ["PROVIDER_API_KEY"]Local dùng .env riêng
whypik run đọc .env trong thư mục có whypik.toml. Dùng --env-file .env.test để chọn file khác; đường tương đối tính từ thư mục cấu hình. Biến terminal có ưu tiên cao hơn file. Khởi động lại run sau khi sửa biến; mỗi lần gọi local chạy mã trong một tiến trình mới.
File env UTF-8 tối đa 64 KiB, dùng một dòng NAME=value cho mỗi biến. Nháy đơn giữ nguyên nội dung; nháy kép dùng cú pháp chuỗi JSON, nên \n biểu diễn xuống dòng trong giá trị. Không nhận khối nhiều dòng trực tiếp, không nội suy $NAME và không thực thi shell. Không mặc định tải hay đồng bộ secret production xuống máy.
Commit .env.example chỉ có tên/ví dụ vô hại, thêm .env và .env.* vào .gitignore, giữ lại .env.example. Bộ đóng gói API loại file env; Hosting chỉ upload output đã build, vì vậy tự kiểm tra không copy .env/secret vào dist hay biến public của frontend.
# .env.example — không có secret thật
APP_MODE=development
PROVIDER_API_KEY=
# Terminal, trong thư mục whypik.toml:
whypik run --host 127.0.0.1 --port 8000 --env-file .env.testAPI của dashboard
GET /api/v1/seller/cloud/projects/PROJECT_UUID/mini/variables?service_id=SERVICE_UUID dùng phiên chủ tài khoản, trả {service_id,revision,variables,limits}. Mỗi variable có name,secret,updated_at; chỉ biến thường có value. Luôn truyền service_id kể cả backend mặc định.
POST cùng URL cần X-CSRFToken và JSON {expected_revision,changes}. changes nhận 1–64 phần tử; đặt biến dùng {name,value,secret}, xóa dùng {name,delete:true}. Mỗi tên chỉ xuất hiện một lần. Toàn bộ batch commit hoặc thất bại; revision cũ trả 409 mini_variables_changed. Response có cùng dạng GET, không trả giá trị bí mật vừa gửi.
API logs có variables_revision để đối chiếu cấu hình của execution; không có giá trị biến. Backend vượt gói/đang xóa không sửa được Variables. Tạm dừng giữ cấu hình; xóa backend hoặc Project dọn cấu hình tương ứng.
{
"expected_revision": 0,
"changes": [
{"name": "APP_MODE", "value": "production", "secret": false},
{"name": "PROVIDER_API_KEY", "value": "ENTER_NEW_SECRET", "secret": true}
]
}Phạm vi bảo vệ bí mật
Cấu hình được mã hóa tại nơi lưu bằng khóa riêng của nền tảng; audit chỉ ghi tên/thao tác/revision. Secret không nằm trong ZIP, bản export source, OCI config hay biên nhận hoàn tất runtime. Log ứng dụng được lọc các giá trị secret của snapshot trước khi lưu/cắt ngắn, gồm dạng chuỗi JSON/Python thường gặp.
Không ghi secret vào URL, log, response hoặc source. Lọc log không ngăn code cố ý mã hóa/biến đổi rồi gửi secret đi. Người có quyền deploy có thể thay backend bằng mã đọc Variables; vì vậy chỉ cấp khóa triển khai cho CI/người đáng tin cậy. Secret của provider AI dùng trong backend, không đặt trong Hosting hoặc SDK trình duyệt.
Chọn Database local riêng
whypik run --db-env local dùng local stack đã khởi động bằng whypik db start; --env-file vẫn chọn Variables ứng dụng. Local credentials nằm trong .whypik, không đưa vào Variables hosted hoặc file frontend. Nếu local chưa sẵn sàng, run báo lỗi thay vì lấy WHYPIK_ADMIN_KEY hosted.
Custom --host/--port chỉ đổi server ứng dụng local. Database có endpoint loopback riêng của workspace; dùng db doctor để xem tình trạng. Script Python/Node standalone không tự đọc .env hoặc suy ra workspace: truyền rõ endpoint, project, key và local binding theo Admin SDK.