Перейти к содержимому

25. Деплой

Remix поддерживает множество платформ для развёртывания: от Vercel и Netlify до собственного Node.js сервера. Адаптеры делают переключение между платформами простым.

Окно терминала
# Node.js (по умолчанию)
npm install @remix-run/node @remix-run/express
# Vercel
npm install @remix-run/vercel
# Netlify
npm install @remix-run/netlify
# Cloudflare Workers
npm install @remix-run/cloudflare @remix-run/cloudflare-workers
Окно терминала
npm install @vercel/remix
vite.config.ts
import { vitePlugin as remix } from "@remix-run/dev";
import { vercelPreset } from "@vercel/remix/vite";
export default defineConfig({
plugins: [
remix({
presets: [vercelPreset()],
}),
],
});
Окно терминала
vercel deploy # Автодеплой при push в main
Окно терминала
# Установка Fly CLI
curl -L https://fly.io/install.sh | sh
# Инициализация
fly launch
# Деплой
fly deploy
# Dockerfile (создаётся автоматически)
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY build/ ./build/
COPY public/ ./public/
CMD ["npm", "start"]
Окно терминала
npm run build
npm start
server.js
import { createRequestHandler } from "@remix-run/express";
import express from "express";
import * as build from "./build/server/index.js";
const app = express();
app.use(express.static("build/client"));
app.all(
"*",
createRequestHandler({
build,
mode: process.env.NODE_ENV,
})
);
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
FROM node:20-slim AS base
WORKDIR /app
FROM base AS deps
COPY package*.json ./
RUN npm ci
FROM base AS build
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
FROM base AS production
ENV NODE_ENV=production
COPY --from=deps /app/node_modules ./node_modules
COPY --from=build /app/build ./build
COPY --from=build /app/public ./public
COPY package.json .
CMD ["npm", "start"]
Окно терминала
# .env (локально)
DATABASE_URL="postgresql://..."
SESSION_SECRET="your-secret-here"
# Vercel: Settings → Environment Variables
# Fly.io:
fly secrets set DATABASE_URL="postgresql://..."
fly secrets set SESSION_SECRET="your-secret-here"
.github/workflows/deploy.yml
name: Deploy to Fly.io
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: superfly/flyctl-actions/setup-flyctl@master
- run: flyctl deploy --remote-only
env:
FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}