1FROM --platform=$BUILDPLATFORM debian:12 as buildenv
2
3RUN apt-get update
4RUN DEBIAN_FRONTEND=noninteractive apt-get install -y apt-transport-https lsb-release ca-certificates curl gnupg
5
6RUN curl -fsSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
7RUN echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
8
9RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg
10RUN echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" > /etc/apt/sources.list.d/nodesource.list
11
12RUN apt-get update
13RUN DEBIAN_FRONTEND=noninteractive apt-get install -y \
14 build-essential \
15 git \
16 nodejs \
17 php8.3 \
18 php8.3-common \
19 php8.3-curl \
20 php8.3-ds \
21 php8.3-gd \
22 php8.3-intl \
23 php8.3-mbstring \
24 php8.3-mysql \
25 php8.3-redis \
26 php8.3-sqlite3 \
27 php8.3-swoole \
28 php8.3-tokenizer \
29 php8.3-xml \
30 php8.3-zip \
31 zip
32
33RUN npm install -g yarn
34
35WORKDIR /app
36
37RUN curl -L "https://getcomposer.org/download/latest-2.x/composer.phar" > /usr/local/bin/composer && chmod 755 /usr/local/bin/composer
38
39COPY composer.json composer.lock ./
40RUN composer install --no-dev --no-scripts
41
42COPY package.json yarn.lock ./
43RUN yarn --prod --ignore-optional --frozen-lockfile
44
45
46FROM debian:12 as runenv
47
48RUN apt-get update
49RUN DEBIAN_FRONTEND=noninteractive apt-get install -y apt-transport-https lsb-release ca-certificates curl
50
51RUN curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
52RUN echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
53
54RUN apt-get update
55RUN DEBIAN_FRONTEND=noninteractive apt-get install -y \
56 jhead \
57 nginx \
58 php8.3 \
59 php8.3-common \
60 php8.3-curl \
61 php8.3-ds \
62 php8.3-gd \
63 php8.3-intl \
64 php8.3-mbstring \
65 php8.3-mysql \
66 php8.3-redis \
67 php8.3-sqlite3 \
68 php8.3-swoole \
69 php8.3-tokenizer \
70 php8.3-xml \
71 php8.3-zip
72
73RUN rm -f /var/log/nginx/access.log /var/log/nginx/error.log && \
74 ln -s /dev/stdout /var/log/nginx/access.log && \
75 ln -s /dev/stderr /var/log/nginx/error.log
76
77
78FROM buildenv as build
79
80COPY . .
81RUN mkdir -p bootstrap/cache storage/logs storage/framework/cache storage/framework/views storage/framework/sessions public/uploads public/uploads-avatar public/uploads-replay
82
83ARG APP_URL
84ARG DOCS_URL
85RUN yarn production
86
87RUN php artisan ip2asn:update
88RUN php artisan scribe:generate
89
90RUN rm -rf node_modules
91
92RUN composer dump-autoload
93
94ARG GIT_SHA
95RUN printf "%s" "$GIT_SHA" > version
96
97
98FROM runenv as run
99
100COPY --from=build /app /app
101WORKDIR /app
102
103RUN useradd -m osuweb
104RUN chown -R osuweb /var/lib/nginx bootstrap/cache storage
105USER osuweb
106ENV LOG_CHANNEL stderr
107
108EXPOSE 8000
109EXPOSE 8080
110
111ENTRYPOINT ["/app/docker/deployment/entrypoint.sh"]