Lustre全栈应用部署指南:从Docker到云平台
前言
在现代Web开发中,全栈应用的部署是一个关键环节。本文将详细介绍如何将基于Lustre框架构建的全栈应用部署到生产环境。Lustre是一个基于Gleam语言的全栈Web框架,它允许开发者使用同一种语言编写前后端代码,大大提高了开发效率。
项目结构准备
典型的Lustre全栈项目采用monorepo结构,包含三个主要部分:
/项目根目录
/common # 前后端共享的通用代码和类型定义
/client # 面向JavaScript的客户端代码
/server # 面向Erlang的服务端代码
这种结构设计使得代码复用更加方便,同时也为部署提供了清晰的边界。
Docker容器化部署
Dockerfile详解
容器化是现代化部署的核心,下面是一个针对Lustre全栈应用的完整Dockerfile示例:
# 指定Gleam版本
ARG GLEAM_VERSION=v1.10.0
# 构建阶段 - 编译应用
FROM ghcr.io/gleam-lang/gleam:${GLEAM_VERSION}-erlang-alpine AS builder
# 复制项目代码
COPY ./common /build/common
COPY ./client /build/client
COPY ./server /build/server
# 安装所有项目的依赖
RUN cd /build/common && gleam deps download
RUN cd /build/client && gleam deps download
RUN cd /build/server && gleam deps download
# 编译客户端代码并输出到服务器的静态目录
RUN cd /build/client \
&& gleam add --dev lustre_dev_tools \
&& gleam run -m lustre/dev build app --minify --outdir=/build/server/priv/static
# 编译服务端代码
RUN cd /build/server \
&& gleam export erlang-shipment
# 运行阶段 - 仅包含运行所需的最小镜像
FROM ghcr.io/gleam-lang/gleam:${GLEAM_VERSION}-erlang-alpine
# 从构建阶段复制编译好的服务端代码
COPY --from=builder /build/server/build/erlang-shipment /app
# 设置入口点
WORKDIR /app
RUN echo '#!/bin/sh\nexec ./entrypoint.sh "$@"' > /app/start.sh \
&& chmod +x /app/start.sh
# 设置环境变量
ENV PORT=8080
# 暴露服务器运行的端口
EXPOSE 8080
# 运行服务器
CMD ["/app/start.sh", "run"]
关键点说明:
- 使用多阶段构建减少最终镜像大小
- 客户端代码编译后放入服务端的静态资源目录
- 通过环境变量配置服务端口
服务端配置调整
确保服务端监听端口从环境变量获取:
fn get_port() -> Int {
case system.get_env("PORT") {
Ok(port) -> {
case int.parse(port) {
Ok(port_number) -> port_number
Error(_) -> 8080 // 解析失败时使用默认值
}
}
Error(_) -> 8080 // 环境变量未设置时使用默认值
}
}
// 在启动服务器时使用
let port = get_port()
mist.new(handler)
|> mist.port(port)
|> mist.start_http
Fly.io平台部署详解
Fly.io是一个支持全球部署的应用平台,特别适合需要低延迟的Web应用。
部署准备
- 安装CLI工具:根据官方文档安装flyctl命令行工具
- 账户认证:使用
fly auth login命令登录
应用创建与配置
在项目根目录执行:
fly launch --no-deploy
此命令会生成fly.toml配置文件,典型配置如下:
app = "your-app-name"
[build]
dockerfile = "Dockerfile"
[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
processes = ["app"]
[[http_service.ports]]
port = 80
handlers = ["http"]
[[http_service.ports]]
port = 443
handlers = ["tls", "http"]
配置要点:
internal_port必须与Dockerfile中的EXPOSE端口一致force_https确保所有流量通过安全连接
执行部署
fly deploy
部署过程包括:
- 基于Dockerfile构建镜像
- 上传镜像到Fly.io注册表
- 启动应用实例
部署完成后,应用可通过https://your-app-name.fly.dev访问。
自动化部署实践
GitHub Actions集成
实现CI/CD流程可以极大提高开发效率。以下是完整的GitHub Actions配置:
name: Deploy to Fly.io
on:
push:
branches:
- main
jobs:
deploy:
name: Deploy to Fly.io
runs-on: ubuntu-latest
concurrency: deploy-group
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Flyctl
uses: superfly/flyctl-actions/setup-flyctl@master
- name: Deploy to Fly.io
run: flyctl deploy --remote-only
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
实现步骤:
- 创建长期有效的Fly.io API令牌
- 将令牌添加为GitHub仓库的Secret
- 配置工作流在main分支推送时触发
生产环境运维
日志监控
# 查看历史日志
fly logs
# 实时日志监控
fly logs -f
# 应用状态检查
fly status
自定义域名配置
- 添加证书:
fly certs add your-domain.com - 配置DNS记录:
- A记录指向Fly.io IPv4地址
- AAAA记录指向Fly.io IPv6地址
其他部署方案
除了Fly.io,Lustre全栈应用还可以部署到多种云平台:
- Heroku:适合快速原型开发
- Railway:提供简单易用的部署体验
- AWS Elastic Beanstalk:企业级解决方案
- Google Cloud Run:无服务器容器平台
- Azure Container Apps:微软云原生解决方案
每个平台的部署细节略有不同,但核心都是基于Docker容器化部署。
总结
本文详细介绍了Lustre全栈应用的完整部署流程,从Docker容器化到云平台部署,再到自动化CI/CD配置。掌握这些技能将使您能够将Lustre应用高效地交付到生产环境,为用户提供稳定可靠的服务。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



