Docker 部署

Docker 部署

快速摘要

Fork https://github.com/Afilmory/docker 自定义配置并构建镜像。

说明

该教程会部署Afilmory/afilmory的代码,而并非本站,若要部署本站,推荐查看其他方式部署

🚀 快速开始

使用 Docker 部署 Afilmory 是一种便捷高效的方式来管理您的照片画廊应用。本指南将引导您完成使用 Docker 设置和运行 Afilmory 的步骤。

前提条件

  • Docker
  • Docker Compose(可选但推荐)
  • PostgreSQL 数据库(用于 SSR 应用)

1. 配置文件

在构建 Docker 镜像之前,您需要配置以下文件:

config.json

{
  "name": "您的照片画廊",
  "title": "您的照片画廊", 
  "description": "捕捉生活中的美好瞬间",
  "url": "https://your-domain.com",
  "accentColor": "#fb7185",
  "author": {
    "name": "您的名字",
    "url": "https://your-website.com",
    "avatar": "https://your-avatar-url.com/avatar.png"
  },
  "social": {
    "twitter": "@yourusername"
  },
  "extra": {
    "accessRepo": true
  }
}

builder.config.json

{
  "repo": {
    "enable": false,
    "url": "https://github.com/username/gallery-public"
  },
  "storage": {
    "provider": "s3",
    "bucket": "your-photos-bucket",
    "region": "us-east-1",
    "prefix": "photos/",
    "customDomain": "cdn.yourdomain.com"
  },
  "performance": {
    "worker": {
      "enabled": true,
      "maxWorkers": 4
    }
  }
}

.env

# 数据库配置
PG_CONNECTION_STRING=postgresql://user:password@postgres:5432/afilmory

# S3 存储配置
S3_ACCESS_KEY_ID=your_access_key_id
S3_SECRET_ACCESS_KEY=your_secret_access_key

# Git 仓库(可选)
GIT_TOKEN=your_github_token

# 应用设置
NODE_ENV=production
PORT=3000

2. Dockerfile 设置

在项目根目录创建 Dockerfile 文件:

# 用于 pnpm 单体仓库中 Next.js 应用的 Dockerfile
# 此 Dockerfile 应从单体仓库的根目录构建:
# > docker build -t iris-ssr .
# > docker run -p 3000:3000 iris-ssr

# -----------------
# 基础阶段
# -----------------
FROM node:20-alpine AS base
WORKDIR /app
RUN corepack enable

# -----------------
# 构建阶段
# -----------------
FROM base AS builder

RUN apk update && apk add --no-cache git perl

RUN git clone https://github.com/Afilmory/Afilmory --depth 1 .
COPY config.json ./
COPY builder.config.json ./
COPY .env ./

ARG S3_ACCESS_KEY_ID
ARG S3_SECRET_ACCESS_KEY
ARG GIT_TOKEN
ARG PG_CONNECTION_STRING

RUN sh ./scripts/preinstall.sh
# 安装所有依赖
RUN pnpm install --frozen-lockfile

# 构建应用。
# ssr package.json 中的构建脚本首先处理构建 web 应用。
RUN pnpm --filter=@afilmory/ssr build

# -----------------
# 运行阶段
# -----------------
FROM base AS runner

WORKDIR /app

ENV NODE_ENV=production
# ENV PORT 和其他配置现在位于配置文件中
# 并在运行时通过环境变量传递。
RUN apk add --no-cache curl wget
# 创建非 root 用户
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

USER nextjs

COPY --from=builder --chown=nextjs:nodejs /app/apps/ssr/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/apps/ssr/.next/static /app/apps/ssr/.next/static
COPY --from=builder --chown=nextjs:nodejs /app/apps/ssr/public /app/apps/ssr/public

# 独立输出包含 server.js 文件。
# PORT 环境变量会被 Next.js 自动使用。
EXPOSE 3000

CMD ["node", "apps/ssr/server.js"]

3. Docker Compose 设置

在项目根目录创建 docker-compose.yml 文件:

version: '3.8'

services:
  afilmory:
    build: .
    ports:
      - '3000:3000'
    environment:
      - NODE_ENV=production
    volumes:
      - ./config.json:/app/config.json:ro
      - ./builder.config.json:/app/builder.config.json:ro
      - ./.env:/app/.env:ro
    depends_on:
      - postgres
    restart: unless-stopped

  postgres:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: afilmory
      POSTGRES_USER: afilmory
      POSTGRES_PASSWORD: your_secure_password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  postgres_data:

4. 构建和运行

选项 1:使用 Docker Compose(推荐)

# 构建并启动所有服务
docker-compose up -d

# 查看日志
docker-compose logs -f afilmory

# 停止服务
docker-compose down

选项 2:手动 Docker 构建

# 构建镜像
docker build -t afilmory .

# 运行容器
docker run -d \
  --name afilmory \
  -p 3000:3000 \
  --env-file .env \
  -v $(pwd)/config.json:/app/config.json:ro \
  -v $(pwd)/builder.config.json:/app/builder.config.json:ro \
  afilmory

📋 配置详情

存储提供商

Afilmory 支持多种存储提供商。在 builder.config.json 中配置它们:

S3 兼容存储:

{
  "storage": {
    "provider": "s3",
    "bucket": "your-bucket",
    "region": "us-east-1",
    "prefix": "photos/",
    "customDomain": "cdn.example.com"
  }
}

GitHub 存储:

{
  "storage": {
    "provider": "github",
    "owner": "username",
    "repo": "photo-storage",
    "branch": "main",
    "path": "photos/"
  }
}
创建时间
修改时间