Server Build
Wails v3 mendukung mode server, memungkinkan Anda menjalankan aplikasi sebagai server HTTP murni tanpa membuat window native atau memerlukan dependensi GUI. Ini memungkinkan deploy aplikasi Wails yang sama ke server, container, dan browser web.
Ringkasan
Section titled “Ringkasan”Mode server berguna untuk:
- Deploy Docker/Container - Jalankan tanpa dependensi X11/Wayland
- Aplikasi server-side - Deploy sebagai web server yang dapat diakses via browser
- Akses web-only - Bagikan codebase yang sama antara desktop dan web
- Pengujian CI/CD - Jalankan integration test tanpa display server
- Microservices - Gunakan bindings Wails di layanan backend headless
Memulai Cepat
Section titled “Memulai Cepat”Mode server diaktifkan via build tag server. Kode aplikasi Anda tetap sama — Anda hanya build dengan tag tersebut:
# Menggunakan Taskfile (direkomendasikan)wails3 task build:serverwails3 task run:server
# Atau build langsung dengan Gogo build -tags server -o myapp-server .Berikut contoh minimal:
package main
import ( "embed" "log"
"github.com/wailsapp/wails/v3/pkg/application")
//go:embed frontend/distvar assets embed.FS
func main() { app := application.New(application.Options{ Name: "My App", // Opsi server digunakan saat di-build dengan -tags server Server: application.ServerOptions{ Host: "localhost", Port: 8080, }, Services: []application.Service{ application.NewService(&MyService{}), }, Assets: application.AssetOptions{ Handler: application.AssetFileServerFS(assets), }, })
log.Println("Starting application...") if err := app.Run(); err != nil { log.Fatal(err) }}Kode yang sama dapat di-build untuk desktop (tanpa tag) atau mode server (dengan -tags server).
Konfigurasi
Section titled “Konfigurasi”ServerOptions
Section titled “ServerOptions”Konfigurasi server HTTP dengan ServerOptions:
Server: application.ServerOptions{ // Host untuk bind. Default: "localhost" // Gunakan "0.0.0.0" untuk listen di semua interface Host: "localhost",
// Port untuk listen. Default: 8080 Port: 8080,
// Request read timeout. Default: 30s ReadTimeout: 30 * time.Second,
// Response write timeout. Default: 30s WriteTimeout: 30 * time.Second,
// Idle connection timeout. Default: 120s IdleTimeout: 120 * time.Second,
// Graceful shutdown timeout. Default: 30s ShutdownTimeout: 30 * time.Second,
// Konfigurasi TLS (opsional) TLS: &application.TLSOptions{ CertFile: "/path/to/cert.pem", KeyFile: "/path/to/key.pem", },},Endpoint Health Check
Section titled “Endpoint Health Check”Endpoint health check tersedia secara otomatis di /health:
curl http://localhost:8080/health# {"status":"ok"}Ini berguna untuk:
- Kubernetes liveness/readiness probe
- Health check load balancer
- Sistem monitoring
Service Bindings
Section titled “Service Bindings”Semua service bindings bekerja identik dengan mode desktop:
type GreetService struct{}
func (g *GreetService) Greet(name string) string { return "Hello, " + name + "!"}
// Daftarkan di opsiServices: []application.Service{ application.NewService(&GreetService{}),},Frontend dapat memanggil bindings ini menggunakan runtime Wails standar:
const greeting = await wails.Call.ByName('main.GreetService.Greet', 'World');Events
Section titled “Events”Events bekerja dua arah di mode server:
- Frontend ke Backend: Event yang di-emit dari browser dikirim via HTTP dan diterima oleh event handler Go Anda
- Backend ke Frontend: Event yang di-emit dari Go di-broadcast ke semua browser yang terhubung via WebSocket
Setiap tab browser direpresentasikan sebagai “window” dengan nama unik (browser-1, browser-2, dll.), dapat diakses via event.Sender:
// Dengarkan event dari browserapp.Event.On("user-action", func(event *application.CustomEvent) { log.Printf("Event from %s: %v", event.Sender, event.Data) // event.Sender akan "browser-1", "browser-2", dll.})
// Emit event ke semua browser yang terhubungapp.Event.Emit("server-update", data)Dari frontend:
// Emit event ke server (dan semua browser lain)await wails.Events.Emit('user-action', { action: 'click' });
// Dengarkan event dari serverwails.Events.On('server-update', (event) => { console.log('Update from server:', event.data);});Graceful Shutdown
Section titled “Graceful Shutdown”Server menangani sinyal SIGINT dan SIGTERM dengan graceful:
- Berhenti menerima koneksi baru
- Menunggu request aktif selesai (hingga
ShutdownTimeout) - Menjalankan hook
OnShutdown - Mematikan layanan dalam urutan terbalik
Perbedaan dari Mode Desktop
Section titled “Perbedaan dari Mode Desktop”| Fitur | Mode Desktop | Mode Server |
|---|---|---|
| Window native | Dibuat | Window browser (browser-N) |
| System tray | Tersedia | Tidak tersedia |
| Dialog native | Tersedia | Tidak tersedia |
| Menu aplikasi | Tersedia | Tidak tersedia |
| Info layar | Tersedia | Mengembalikan error |
| Service bindings | Berfungsi | Berfungsi |
| Events | Berfungsi | Berfungsi (via WebSocket) |
| Assets | Via webview | Via HTTP |
| CGO diperlukan | Ya | Tidak |
Perilaku Window API
Section titled “Perilaku Window API”Di mode server, API terkait window ditangani dengan aman:
app.Window.NewWithOptions()- Log peringatan, mengembalikan nilapp.Hide()/app.Show()- No-opapp.Screen.GetPrimary()- Mengembalikan error
Ini memungkinkan kode yang mereferensikan window berjalan tanpa crash, meskipun operasi window tidak berpengaruh.
Build untuk Produksi
Section titled “Build untuk Produksi”Menggunakan Task (Direkomendasikan)
Section titled “Menggunakan Task (Direkomendasikan)”Proyek yang dibuat dengan wails3 init menyertakan task build:server:
# Build untuk mode serverwails3 task build:server
# Build dan jalankanwails3 task run:serverBuild Manual
Section titled “Build Manual”# Build dengan mode servergo build -tags server -o myapp-server .Docker
Section titled “Docker”Proyek Wails menyertakan setup Docker siap pakai. Untuk build dan jalankan aplikasi Anda di container:
# Build image Dockerwails3 task build:docker
# Jalankanwails3 task run:dockerSelesai! Aplikasi Anda akan tersedia di http://localhost:8080.
Anda dapat menyesuaikan build dengan beberapa opsi:
# Gunakan tag image kustomwails3 task build:docker TAG=myapp:v1.0.0
# Jalankan di port berbedawails3 task run:docker PORT=3000Dockerfile.server yang di-generate membuat image minimal berbasis distroless. Image ini menangani network binding secara otomatis, sehingga aplikasi Anda dapat diakses dari luar container.
Docker Compose
Section titled “Docker Compose”Untuk deploy yang lebih kompleks, berikut konfigurasi Docker Compose dengan health check:
services: app: build: . ports: - "8080:8080" environment: - WAILS_SERVER_HOST=0.0.0.0 healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3Dockerfile Kustom
Section titled “Dockerfile Kustom”Jika Anda memerlukan kontrol lebih, Anda dapat membuat Dockerfile sendiri. Hal penting yang perlu diingat adalah mengatur WAILS_SERVER_HOST=0.0.0.0 agar server menerima koneksi dari luar container:
# Build stageFROM golang:alpine AS builderWORKDIR /appRUN apk add --no-cache gitCOPY . .RUN go mod tidyRUN go build -tags server -ldflags="-s -w" -o server .
# Runtime stageFROM gcr.io/distroless/static-debian12COPY --from=builder /app/server /serverCOPY --from=builder /app/frontend/dist /frontend/distEXPOSE 8080ENV WAILS_SERVER_HOST=0.0.0.0ENTRYPOINT ["/server"]Pertimbangan Keamanan
Section titled “Pertimbangan Keamanan”Saat mendeploy aplikasi mode server:
- Bind ke localhost secara default - Hanya gunakan
0.0.0.0saat diperlukan - Gunakan TLS di produksi - Konfigurasi
ServerOptions.TLS - Tempatkan di belakang reverse proxy - Gunakan nginx/traefik untuk keamanan tambahan
- Validasi semua input - Praktik keamanan yang sama seperti aplikasi web apa pun
Contoh
Section titled “Contoh”Contoh lengkap tersedia di v3/examples/server/:
cd v3/examples/server
# Menggunakan Taskfiletask dev
# Atau jalankan langsunggo run -tags server .
# Buka http://localhost:8080 di browserVariabel Lingkungan
Section titled “Variabel Lingkungan”Untuk skenario deploy di mana Anda perlu meng-override konfigurasi server tanpa mengubah kode, Wails mengenali variabel lingkungan berikut:
| Variabel | Deskripsi | Default |
|---|---|---|
WAILS_SERVER_HOST | Interface jaringan untuk bind | localhost |
WAILS_SERVER_PORT | Port untuk listen | 8080 |
Variabel ini memiliki prioritas lebih tinggi dari ServerOptions di kode Anda, itulah mengapa contoh Docker mengatur WAILS_SERVER_HOST=0.0.0.0 — ini memungkinkan container menerima koneksi eksternal tanpa perlu perubahan pada aplikasi Anda.
Lihat Juga
Section titled “Lihat Juga”- Custom Transport - Untuk kustomisasi IPC lanjutan
- Services - Dokumentasi service binding
- Events - Dokumentasi sistem event