# syntax=docker/dockerfile:1
# check=error=true

# This Dockerfile is designed for Git-based deployment with Kamal
# It pulls code from Git during deployment and uses external volumes for code, build artifacts, and data

# Make sure RUBY_VERSION matches the Ruby version in .ruby-version
FROM ruby:3.2.2

# Rails app lives here
WORKDIR /rails

# Install base packages including Git for code pulling
RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y \
    curl \
    libjemalloc2 \
    libvips \
    sqlite3 \
    nodejs \
    npm \
    netcat-openbsd \
    git \
    build-essential \
    pkg-config \
    ca-certificates \
    && rm -rf /var/lib/apt/lists /var/cache/apt/archives

# Set production environment and optimize memory usage
ENV RAILS_ENV="production" \
    BUNDLE_DEPLOYMENT="1" \
    BUNDLE_PATH="/bundle" \
    BUNDLE_WITHOUT="development:test" \
    BUNDLE_JOBS="4" \
    BUNDLE_RETRY="3" \
    MALLOC_ARENA_MAX="2" \
    LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libjemalloc.so.2" \
    JEMALLOC_CONF="background_thread:true,metadata_thp:auto,dirty_decay_ms:30000,muzzy_decay_ms:30000"

# Create directories for mounted volumes
RUN mkdir -p \
    /rails/code \
    /rails/storage \
    /rails/public/uploads \
    /rails/public/assets \
    /rails/public/vite \
    /rails/node_modules \
    /rails/tmp \
    /rails/log \
    /rails/tmp/pids \
    /rails/tmp/cache \
    /rails/tmp/sockets \
    /bundle

# Declare volumes for persistent storage
VOLUME ["/root/.ssh", "/rails/code", "/rails/storage", "/rails/public/uploads", "/rails/public/vite", "/rails/node_modules", "/rails/log", "/rails/tmp", "/bundle"]

# Copy entrypoint script
COPY bin/docker-entrypoint /rails/bin/
RUN chmod +x /rails/bin/docker-entrypoint

# 为rails用户准备环境,但仍使用root运行(为了访问SSH密钥)
RUN groupadd --system --gid 1000 rails && \
    useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \
    chown -R rails:rails /rails

# 注释掉USER指令,使用root用户运行
# USER 1000:1000

# Entrypoint pulls code, installs dependencies, and prepares the application
ENTRYPOINT ["/rails/bin/docker-entrypoint"]

# Start server via Rails default port 3000
EXPOSE 3000

# 添加健康检查,使用专门的健康检查端点
# 增加start-period到120秒,给应用更多启动时间
HEALTHCHECK --interval=10s --timeout=5s --start-period=120s --retries=10 \
  CMD curl -f http://localhost:3000/health_check || exit 1

# 使用正确的路径启动Rails服务器,并指定端口为3000
CMD ["/rails/code/bin/rails", "server", "-p", "3000", "-b", "0.0.0.0"]