chore: Optimize Dockerfile for improved build performance and update Gitea workflows with Docker Buildx support
This commit is contained in:
@@ -0,0 +1,69 @@
|
|||||||
|
# Dependencies
|
||||||
|
node_modules
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# Production builds
|
||||||
|
frontend/dist
|
||||||
|
frontend/build
|
||||||
|
|
||||||
|
# Environment files
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
|
||||||
|
# IDE files
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
|
||||||
|
# OS files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Git
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
README.md
|
||||||
|
CHANGELOG.md
|
||||||
|
DOCKER.md
|
||||||
|
|
||||||
|
# CI/CD
|
||||||
|
.gitea
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
name: Publish Fast Tabler Docker image
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- tabler
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-push-fast:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 15
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
with:
|
||||||
|
driver-opts: |
|
||||||
|
image=moby/buildkit:v0.12.0
|
||||||
|
network=host
|
||||||
|
|
||||||
|
- name: Log in to Gitea Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: git.shts.su
|
||||||
|
username: ${{ gitea.actor }}
|
||||||
|
password: ${{ secrets.ACTIONS_PAT }}
|
||||||
|
|
||||||
|
- name: Build and push Fast Tabler Docker image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./Dockerfile.fast
|
||||||
|
push: true
|
||||||
|
platforms: linux/amd64
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
tags: |
|
||||||
|
git.shts.su/${{ gitea.repository }}:tabler-fast
|
||||||
|
git.shts.su/${{ gitea.repository }}:tabler-fast-${{ gitea.sha }}
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.title=S3 Lists Manager with Tabler UI (Fast Build)
|
||||||
|
org.opencontainers.image.description=Modern S3 Lists Manager with Tabler UI design - Fast Alpine build
|
||||||
|
org.opencontainers.image.version=tabler-fast
|
||||||
|
org.opencontainers.image.revision=${{ gitea.sha }}
|
||||||
|
org.opencontainers.image.created=${{ gitea.event.head_commit.timestamp }}
|
||||||
|
build-args: |
|
||||||
|
BUILDKIT_INLINE_CACHE=1
|
||||||
|
BUILDKIT_PROGRESS=plain
|
||||||
@@ -12,6 +12,12 @@ jobs:
|
|||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
with:
|
||||||
|
driver-opts: |
|
||||||
|
image=moby/buildkit:v0.12.0
|
||||||
|
|
||||||
- name: Log in to Gitea Registry
|
- name: Log in to Gitea Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
@@ -26,6 +32,8 @@ jobs:
|
|||||||
file: ./Dockerfile
|
file: ./Dockerfile
|
||||||
push: true
|
push: true
|
||||||
platforms: linux/amd64
|
platforms: linux/amd64
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
tags: |
|
tags: |
|
||||||
git.shts.su/${{ gitea.repository }}:tabler
|
git.shts.su/${{ gitea.repository }}:tabler
|
||||||
git.shts.su/${{ gitea.repository }}:tabler-${{ gitea.sha }}
|
git.shts.su/${{ gitea.repository }}:tabler-${{ gitea.sha }}
|
||||||
@@ -34,4 +42,6 @@ jobs:
|
|||||||
org.opencontainers.image.description=Modern S3 Lists Manager with Tabler UI design
|
org.opencontainers.image.description=Modern S3 Lists Manager with Tabler UI design
|
||||||
org.opencontainers.image.version=tabler
|
org.opencontainers.image.version=tabler
|
||||||
org.opencontainers.image.revision=${{ gitea.sha }}
|
org.opencontainers.image.revision=${{ gitea.sha }}
|
||||||
org.opencontainers.image.created=${{ gitea.event.head_commit.timestamp }}
|
org.opencontainers.image.created=${{ gitea.event.head_commit.timestamp }}
|
||||||
|
build-args: |
|
||||||
|
BUILDKIT_INLINE_CACHE=1
|
||||||
@@ -12,6 +12,12 @@ jobs:
|
|||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
with:
|
||||||
|
driver-opts: |
|
||||||
|
image=moby/buildkit:v0.12.0
|
||||||
|
|
||||||
- name: Log in to Gitea Registry
|
- name: Log in to Gitea Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
@@ -26,6 +32,8 @@ jobs:
|
|||||||
file: ./Dockerfile
|
file: ./Dockerfile
|
||||||
push: true
|
push: true
|
||||||
platforms: linux/amd64
|
platforms: linux/amd64
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
tags: |
|
tags: |
|
||||||
git.shts.su/${{ gitea.repository }}:latest
|
git.shts.su/${{ gitea.repository }}:latest
|
||||||
git.shts.su/${{ gitea.repository }}:${{ gitea.sha }}
|
git.shts.su/${{ gitea.repository }}:${{ gitea.sha }}
|
||||||
@@ -34,4 +42,6 @@ jobs:
|
|||||||
org.opencontainers.image.description=S3 Lists Manager for domains and AS management
|
org.opencontainers.image.description=S3 Lists Manager for domains and AS management
|
||||||
org.opencontainers.image.version=latest
|
org.opencontainers.image.version=latest
|
||||||
org.opencontainers.image.revision=${{ gitea.sha }}
|
org.opencontainers.image.revision=${{ gitea.sha }}
|
||||||
org.opencontainers.image.created=${{ gitea.event.head_commit.timestamp }}
|
org.opencontainers.image.created=${{ gitea.event.head_commit.timestamp }}
|
||||||
|
build-args: |
|
||||||
|
BUILDKIT_INLINE_CACHE=1
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
# CI/CD Troubleshooting Guide
|
||||||
|
|
||||||
|
## Проблемы со сборкой Docker
|
||||||
|
|
||||||
|
### 1. Сборка зависает на npm install
|
||||||
|
|
||||||
|
**Симптомы:**
|
||||||
|
- CI зависает на этапе `RUN npm install`
|
||||||
|
- Время сборки превышает 20 минут
|
||||||
|
- Ошибки сетевого подключения
|
||||||
|
|
||||||
|
**Решения:**
|
||||||
|
|
||||||
|
#### A. Использовать оптимизированный Dockerfile
|
||||||
|
```bash
|
||||||
|
# Основной оптимизированный
|
||||||
|
docker build -f Dockerfile .
|
||||||
|
|
||||||
|
# Быстрый с Yarn
|
||||||
|
docker build -f Dockerfile.fast .
|
||||||
|
```
|
||||||
|
|
||||||
|
#### B. Проверить сетевые настройки
|
||||||
|
```bash
|
||||||
|
# В CI добавить таймауты
|
||||||
|
npm config set fetch-timeout 300000
|
||||||
|
npm config set fetch-retry-mintimeout 20000
|
||||||
|
npm config set fetch-retry-maxtimeout 120000
|
||||||
|
```
|
||||||
|
|
||||||
|
#### C. Использовать кэширование
|
||||||
|
```yaml
|
||||||
|
# В CI/CD файле
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Проблемы с Node.js версиями
|
||||||
|
|
||||||
|
**Симптомы:**
|
||||||
|
- `EBADENGINE Unsupported engine`
|
||||||
|
- Ошибки совместимости пакетов
|
||||||
|
|
||||||
|
**Решения:**
|
||||||
|
- Обновить Dockerfile до Node.js 20
|
||||||
|
- Проверить совместимость всех зависимостей
|
||||||
|
|
||||||
|
### 3. Проблемы с размером образа
|
||||||
|
|
||||||
|
**Симптомы:**
|
||||||
|
- Слишком большой размер Docker образа
|
||||||
|
- Медленная загрузка
|
||||||
|
|
||||||
|
**Решения:**
|
||||||
|
- Использовать Alpine Linux (`node:20-alpine`)
|
||||||
|
- Добавить `.dockerignore`
|
||||||
|
- Использовать multi-stage builds
|
||||||
|
|
||||||
|
## Быстрые решения
|
||||||
|
|
||||||
|
### Вариант 1: Основной оптимизированный
|
||||||
|
```bash
|
||||||
|
# Использует обновленный Dockerfile с кэшированием
|
||||||
|
git push origin tabler
|
||||||
|
```
|
||||||
|
|
||||||
|
### Вариант 2: Быстрый с Yarn
|
||||||
|
```bash
|
||||||
|
# Переименовать Dockerfile.fast в Dockerfile
|
||||||
|
mv Dockerfile.fast Dockerfile
|
||||||
|
git add Dockerfile
|
||||||
|
git commit -m "Switch to fast Dockerfile"
|
||||||
|
git push origin tabler
|
||||||
|
```
|
||||||
|
|
||||||
|
### Вариант 3: Локальная сборка для тестирования
|
||||||
|
```bash
|
||||||
|
# Собрать локально для проверки
|
||||||
|
docker build -t test-image .
|
||||||
|
docker run -p 3001:3001 test-image
|
||||||
|
```
|
||||||
|
|
||||||
|
## Мониторинг CI/CD
|
||||||
|
|
||||||
|
### Проверить статус сборки
|
||||||
|
1. Зайти в Gitea → Repository → Actions
|
||||||
|
2. Найти последний workflow
|
||||||
|
3. Проверить логи на каждом этапе
|
||||||
|
|
||||||
|
### Типичные времена сборки
|
||||||
|
- **Оптимизированный Dockerfile**: 5-10 минут
|
||||||
|
- **Быстрый Dockerfile**: 3-7 минут
|
||||||
|
- **С кэшированием**: 2-5 минут (повторные сборки)
|
||||||
|
|
||||||
|
## Контакты для поддержки
|
||||||
|
|
||||||
|
Если проблемы продолжаются:
|
||||||
|
1. Проверить логи CI/CD
|
||||||
|
2. Попробовать локальную сборку
|
||||||
|
3. Создать issue с логами ошибок
|
||||||
+24
-9
@@ -2,24 +2,39 @@
|
|||||||
FROM node:20-slim AS frontend-builder
|
FROM node:20-slim AS frontend-builder
|
||||||
WORKDIR /app/frontend
|
WORKDIR /app/frontend
|
||||||
|
|
||||||
# Copy package.json ONLY and install dependencies from scratch
|
# Set npm config for better performance
|
||||||
# This avoids issues with lock files generated on different OS (e.g. Windows -> Linux)
|
RUN npm config set registry https://registry.npmjs.org/
|
||||||
COPY frontend/package.json ./
|
RUN npm config set fetch-timeout 300000
|
||||||
RUN npm install
|
RUN npm config set fetch-retry-mintimeout 20000
|
||||||
|
RUN npm config set fetch-retry-maxtimeout 120000
|
||||||
|
|
||||||
# Copy rest of the frontend code and build
|
# Copy package files first for better caching
|
||||||
|
COPY frontend/package*.json ./
|
||||||
|
|
||||||
|
# Install dependencies with specific flags
|
||||||
|
RUN npm ci --only=production --no-audit --no-fund --prefer-offline
|
||||||
|
|
||||||
|
# Copy source code
|
||||||
COPY frontend/ .
|
COPY frontend/ .
|
||||||
|
|
||||||
|
# Build the application
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
# Stage 2: Setup Node.js backend and serve everything
|
# Stage 2: Setup Node.js backend and serve everything
|
||||||
FROM node:20-slim
|
FROM node:20-slim
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Copy package.json ONLY and install production dependencies from scratch
|
# Set npm config for better performance
|
||||||
COPY backend/package.json ./
|
RUN npm config set registry https://registry.npmjs.org/
|
||||||
RUN npm install --omit=dev
|
RUN npm config set fetch-timeout 300000
|
||||||
|
|
||||||
# Copy rest of the backend code
|
# Copy package files first for better caching
|
||||||
|
COPY backend/package*.json ./
|
||||||
|
|
||||||
|
# Install production dependencies only
|
||||||
|
RUN npm ci --only=production --no-audit --no-fund --prefer-offline
|
||||||
|
|
||||||
|
# Copy backend source code
|
||||||
COPY backend/ .
|
COPY backend/ .
|
||||||
|
|
||||||
# Copy built frontend assets from the previous stage
|
# Copy built frontend assets from the previous stage
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# Stage 1: Build React frontend
|
||||||
|
FROM node:20-alpine AS frontend-builder
|
||||||
|
WORKDIR /app/frontend
|
||||||
|
|
||||||
|
# Install yarn for faster package management
|
||||||
|
RUN npm install -g yarn
|
||||||
|
|
||||||
|
# Copy package files
|
||||||
|
COPY frontend/package*.json ./
|
||||||
|
COPY frontend/yarn.lock* ./
|
||||||
|
|
||||||
|
# Install dependencies with yarn (faster than npm)
|
||||||
|
RUN yarn install --frozen-lockfile --network-timeout 300000
|
||||||
|
|
||||||
|
# Copy source code
|
||||||
|
COPY frontend/ .
|
||||||
|
|
||||||
|
# Build the application
|
||||||
|
RUN yarn build
|
||||||
|
|
||||||
|
# Stage 2: Setup Node.js backend and serve everything
|
||||||
|
FROM node:20-alpine
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Install yarn for faster package management
|
||||||
|
RUN npm install -g yarn
|
||||||
|
|
||||||
|
# Copy package files
|
||||||
|
COPY backend/package*.json ./
|
||||||
|
COPY backend/yarn.lock* ./
|
||||||
|
|
||||||
|
# Install production dependencies only
|
||||||
|
RUN yarn install --frozen-lockfile --production --network-timeout 300000
|
||||||
|
|
||||||
|
# Copy backend source code
|
||||||
|
COPY backend/ .
|
||||||
|
|
||||||
|
# Copy built frontend assets from the previous stage
|
||||||
|
COPY --from=frontend-builder /app/frontend/dist ./public
|
||||||
|
|
||||||
|
# The port the backend runs on
|
||||||
|
EXPOSE 3001
|
||||||
|
|
||||||
|
# Start the server
|
||||||
|
CMD ["node", "server.js"]
|
||||||
Reference in New Issue
Block a user