Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,24 @@ jobs:
tags: ${{ steps.vars.outputs.TAGS }}
flavor: |
latest=${{ steps.vars.outputs.LATEST }}
labels: |
maintainer="me@zuni.kim"
org.opencontainers.image.authors="me@zuni.kim"
org.opencontainers.image.vendor="Team Overclock"
org.opencontainers.image.title="Lifemap backend API server"
org.opencontainers.image.documentation="${{ github.server_url }}/${{ github.repository }}"
org.opencontainers.image.ref.name="${{ github.ref_name }}"

- name: Build and push
uses: docker/build-push-action@v7
with:
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
target: prod
target: ${{ steps.vars.outputs.LATEST == 'true' && 'prod' || 'dev' }}

# pr에서는 테스트용이기 때문에 push하지 않음 (dry-run)
push: ${{ github.event_name != 'pull_request' }}

cache-from: type=gha
cache-to: type=gha,mode=max
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,6 @@ __pycache__

# tests
.coverage

# lock
*.lock
59 changes: 39 additions & 20 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,42 +1,61 @@
# 공통: uv + python 3.11
FROM ghcr.io/linuxserver/baseimage-alpine:3.23 AS base

LABEL org.opencontainers.image.base.name="ghcr.io/linuxserver/baseimage-alpine:3.23"

ENV HOME="/config"
ENV VIRTUAL_ENV="/venv"
ENV PATH="$VIRTUAL_ENV/bin:$HOME/.local/bin:$PATH"
ENV PUID=1000
ENV PGID=1000
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

COPY --from=ghcr.io/astral-sh/uv:0.11.8 /uv /uvx /usr/local/bin/
RUN uv python install 3.11
COPY root/ /

WORKDIR /defaults


# 운영용: 공통 이미지
FROM base AS prod-base
ENV APP_ENV=production
ENV UV_COMPILE_BYTECODE=1
RUN uv venv $VIRTUAL_ENV

# 운영용: 빌드
FROM prod-base AS prod-build
# 배포용: 공통 이미지
FROM base AS deploy-base
RUN uv venv "$VIRTUAL_ENV"

# 배포용: 빌드
FROM deploy-base AS deploy-build
ENV CC=clang
ENV CXX=clang++
RUN apk add --no-cache gdal-dev clang compiler-rt
COPY requirements.txt .
RUN uv pip install --no-cache -r requirements.txt
RUN uv pip install --link-mode=copy --no-cache -r requirements.txt

# 운영용: 메인
FROM prod-base AS prod
COPY --from=prod-build $VIRTUAL_ENV $VIRTUAL_ENV
COPY data ./data
# 배포용: 메인
FROM deploy-base AS deploy
COPY --from=deploy-build "$VIRTUAL_ENV" "$VIRTUAL_ENV"
COPY requirements.txt .
COPY root/ /
COPY data/url.txt ./data/url.txt
COPY app ./app
COPY scripts ./scripts
WORKDIR /app/scripts
WORKDIR /app



# 개발용 이미지
FROM base AS dev
ENV APP_ENV=development
ENV PYTHONDONTWRITEBYTECODE=1
WORKDIR /app/scripts
# 운영용
FROM deploy AS prod
ENV MODE=production

# 개발용: main 브랜치 push 시 자동 배포되는 이미지
FROM deploy AS dev
ENV MODE=development

# 로컬 개발용 이미지
FROM base AS local
ENV MODE=local
ENV CC=clang
ENV CXX=clang++
RUN apk add --no-cache gdal-dev clang compiler-rt
COPY root/ /
VOLUME /venv
WORKDIR /app
Loading
Loading