为云准备 Laravel 应用

2024 年 9 月 6 日

最近在 拉拉康 重新激发了 Laravel 社区对基于云的部署的兴趣。随着关于如何部署应用程序的争论不断升温,有一点是明确的:云正在成为 Laravel 用户更可行的选择。

在本文中,我们将探讨如何使用以下工具准备 Laravel 应用程序以在云环境中部署 弗兰肯PHP , 球童 、Dockerfiles,最后将其部署到 塞维利亚

那么我们从哪里开始呢?当然是在本地环境中!🤓

本地开发环境

为了简单起见,我们假设您在本地机器上安装了一个新的 Laravel 应用程序,它连接到 PostgreSQL 数据库来读取/写入一些数据。

在我们继续之前,请确保你有一个 .env 项目根目录中的文件包含以下内容:

.env :

...
DB_CONNECTION=pgsql
...

一旦验证通过,我们就可以开始构建。🤓☕️

拥有与生产环境非常相似的本地开发环境始终是一个好主意。这样,您可以尽早发现任何问题,并避免在生产中部署应用时出现意外。

为了模拟我们将要使用的生产设置,我们将依赖 Docker 和 Docker Compose。如果你的机器上没有安装 Docker,你可以从 官方网站

运行没有数据库的 Laravel

首先,创建一个名为 compose.yml 在 Laravel 项目的根目录中添加以下内容:

compose.yml :

services:
  php:
    image: dunglas/frankenphp:php8.3-alpine
    command: php artisan serve --host 0.0.0.0 --port 8080
    ports:
      - 8080:8080
    volumes:
      - .:/app

此配置文件定义了一个名为的服务 php 使用 dunglas/frankenphp:php8.3-alpine 镜像,这是一个轻量级的 FrankenPHP 镜像,包含运行 Laravel 应用程序所需的扩展。我们还公开了端口 8080 从主机访问该应用程序。

要测试您的配置,请尝试在终端中运行以下命令:

docker compose up [-d]

当你导航到 http://0.0.0.0:8080 在您的浏览器中。这是意料之中的,因为我们还没有将 Laravel 应用程序连接到数据库。

太棒了,到目前为止,我们已经将 Laravel 应用程序配置为由运行 php artisan serve

接下来,让我们将本地应用程序与 PostgreSQL 数据库连接起来!

使用数据库运行 Laravel

要将您的 Laravel 应用程序连接到 PostgreSQL 数据库,我们需要做几件事。

首先,我们需要在 .env 文件:

.env :

...
DB_CONNECTION=pgsql
DB_HOST=db
DB_PORT=5432 # default PostgreSQL port
DB_DATABASE=main
DB_USERNAME=admin
DB_PASSWORD=password

之后,您需要向你的 compose.yml 文件,并创建自定义 Dockerfile 适用于您的开发环境。创建并更新具有以下内容的文件:

Dockerfile.dev :

FROM dunglas/frankenphp:php8.3-alpine

RUN install-php-extensions pdo_pgsql

Dockerfile.dev 仅供您的本地/开发环境使用,它扩展了 dunglas/frankenphp:php8.3-alpine 图像包含 pdo_pgsql 扩展,这是连接到 PostgreSQL 数据库所必需的。

compose.yml :

services:
  init:
    build:
      dockerfile: Dockerfile.dev
    command: php artisan migrate
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - .:/app
  php:
    build:
      context: .
      dockerfile: Dockerfile.dev
    command: php artisan serve --host 0.0.0.0 --port 8080
    ports:
      - 8080:8080
    depends_on:
      init:
        condition: service_completed_successfully
    volumes:
      - .:/app
  db:
    image: postgres:16.4-alpine
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: password
      POSTGRES_DB: main
    volumes:
      - /var/lib/postgresql/data
    healthcheck:
      test: pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB
      interval: 1s

这里发生了很多事情,让我们看看发生了什么变化以及为什么发生变化:

  1. 我们更新了 php 使用名为 Dockerfile.dev 构建一个包含连接 PostgreSQL 数据库所需扩展的新图像。
  2. 我们添加了一项新服务,名为 db 使用 postgres:16.4-alpine 图像来运行 PostgreSQL 数据库。我们还定义了一些环境变量来设置数据库用户、密码和数据库名称。
  3. 我们创建了一个名为 db_data 将数据保存在您机器的数据库中,并且 Docker 可以在您重新启动服务时重复使用它。
  4. 一项名为 init 还补充说,重复使用 Dockerfile.dev 。此图像用于运行 php artisan migrate 命令来运行数据库迁移。 depends_on 关键确保 db 在运行迁移之前,服务已启动并正在运行。
  5. php 服务现在取决于 init 服务以确保数据库迁移在 Laravel 应用程序启动之前运行。
  6. 我们已将健康检查添加到 db 服务,以确保 PostgreSQL 数据库在 init 服务运行迁移。

要测试您的配置,请在终端中运行以下命令:

docker compose up --build

您的应用程序现在应该连接到您的 PostgreSQL 数据库,并且您的数据库迁移始终运行。🎉

您的本地环境现已准备好模拟您的生产环境。您现在可以在本地开发您的应用并测试与生产环境非常相似的设置。

准备生产

现在是时候对您的生产环境做出必要的改变了。

第一步是告诉 Docker 在构建生产镜像时可以安全忽略哪些目录。创建一个名为 .dockerignore 在 Laravel 项目的根目录中添加以下内容:

.dockerignore :

vendor
bootstrap/chache/*
tests

此文件告诉 Docker 忽略 vendor , bootstrap/cache , 和 tests 目錄。

然后,创建一个 Dockerfile 将用于构建你的生产图像:

Dockerfile :

FROM dunglas/frankenphp:php8.3-alpine

ENV SERVER_NAME=":8080"

RUN install-php-extensions @composer pdo_pgsql

WORKDIR /app

COPY . .

RUN composer install \
  --ignore-platform-reqs \
  --optimize-autoloader \
  --prefer-dist \
  --no-interaction \
  --no-progress \
  --no-scripts

Dockerfile 类似于 Dockerfile.dev 我们之前创建的,但它包括一些额外的步骤:

  1. 由于 FrankenPHP 镜像使用 Caddy 作为默认 Web 服务器,因此我们设置了 SERVER_NAME 环境变量 :8080 指示 Caddy 监听端口 8080
  2. 我们安装 @composer PHP 扩展用于在图像中安装 Composer。
  3. composer install 运行命令来安装 Laravel 应用程序的依赖项。
  4. 我们将工作目录设置为 /app 并将你的 Laravel 应用程序的内容复制到图像中。

要在本地环境中测试您的更改,您需要生成应用的生产版本。在终端中运行以下命令:

docker build -t my-laravel-app .

此命令将构建一个名为 my-laravel-app 基于 Dockerfile 在当前目录中。

要测试新构建的生产映像,请使用以下命令:

docker run -p 8080:8080 -e APP_KEY=<your-app-key> my-laravel-app

代替 <your-app-key> 与价值 APP_KEY 您的环境变量 .env 文件或从中获取密钥 这里

在浏览器中访问 0.0.0.0:8080,你的应用应该会以生产模式启动。它可能会因为缺少数据库连接而出错,但这是正常现象。

部署到云

现在您已经有了可用于生产的 Docker 映像,您可以将其部署到云提供商。🚀

在本教程中,我们将使用 塞维利亚 ,一家新的云提供商,提供一种简单的部署方式 Dockerfile 的部署。

由于您的应用依赖于 PostgreSQL 数据库,因此最好先在 Sevalla 上配置一个新的 PostgreSQL 数据库。登录后 Sevalla 仪表板 ,

  1. 导航到创建数据库模式
  2. 选择 PostgreSQL 数据库
  3. 确认设置并创建数据库

在 Sevalla 中创建数据库模式

一旦数据库准备就绪,您就可以在 Sevalla 上创建 Laravel 应用程序。

  1. 导航到创建应用模式
  2. 从您首选的 Git 提供商中选择您的应用存储库
  3. 确保选择与数据库相同的数据中心
  4. 设置 APP_KEY Laravel 所需的环境变量
  5. 选择 Dockerfile 作为构建类型
  6. 确认其余设置并点击“稍后部署”按钮

在 Sevalla 上使用 Dockerfile 创建 Laravel 应用程序

如果您的应用程序已准备就绪,您现在可以将其与您的 PostgreSQL 数据库连接。

  1. 导航到应用页面
  2. 转到“网络”选项卡
  3. 单击“添加连接”按钮并选择您的 PostgreSQL 数据库
  4. 确认设置并点击“连接”

添加内部连接

然后,使用数据库的连接详细信息在“环境变量”选项卡中设置以下环境变量:

  • DB_CONNECTION
  • DB_HOST
  • DB_PORT
  • DB_DATABASE
  • DB_USERNAME
  • DB_PASSWORD

应用程序环境变量

我们建议使用数据库的内部网络地址作为 DB_HOST 值。这样,您的应用就可以通过专用网络连接到数据库。

最后一步是在启动应用程序之前为您的应用程序设置一个作业进程以运行数据库迁移。

  1. 导航到“流程”选项卡
  2. 点击“创建流程”按钮并选择“作业”
  3. 将命令设置为 php artisan migrate --force
  4. 将启动策略设置为“部署之前”
  5. 确认设置并点击“创建”

创建作业流程

如果也完成了此操作,您现在可以在“部署”选项卡中启动应用程序的手动部署。🎉

如果一切顺利,恭喜!您已成功为云准备了 Laravel 应用。🚀

结论

在本文中,我们探讨了:

  • 如何使用 Docker 设置本地环境来模拟生产环境以及 docker compose
  • 如何使用 Docker、FrankenPHP 和 Caddy 准备 Laravel 应用程序以在云环境中部署。
  • 我们还介绍了如何将你的应用部署到云提供商,例如 塞维利亚

通过遵循这些步骤,您可以将 Laravel 应用提升到新的高度,并享受基于云的部署的好处。🌤


帖子 为云准备 Laravel 应用 首先出现在 Laravel 新闻

加入 Laravel 时事通讯 获取最新信息 类似这样的 Laravel 文章将直接发送到您的收件箱。