checkAllPlayersReady() set the session to PLAYING and cleared/updated its timer in memory but never flushed, relying on callers to do so. The toggleReady() caller flushed right after, but GameController::index()'s lazy catch-up call did not - so if the "everyone ready" transition was only detected on a page load (e.g. players didn't click ready within the same 60s window), the terminal would render for that one request from the in-memory state, letting the game be played entirely through the unguarded message API, while the database silently kept the session on 'ready' with timer 0 forever. This made sessions invisible to the mainframe hint cron and the admin "running sessions" count. Moved the flush inside checkAllPlayersReady() itself so both callers persist reliably. Also chmod the logrotate configs after COPY in the Dockerfile, since their on-disk mode ended up group-writable (0664) depending on the build host's umask, which made logrotate refuse to use them. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
75 lines
1.9 KiB
Docker
75 lines
1.9 KiB
Docker
FROM php:8.3-fpm-alpine
|
|
|
|
# Install system deps
|
|
RUN apk add --no-cache \
|
|
bash \
|
|
git \
|
|
icu-dev \
|
|
libzip-dev \
|
|
libxml2-dev \
|
|
oniguruma-dev \
|
|
g++ \
|
|
make \
|
|
nodejs \
|
|
npm \
|
|
shadow \
|
|
logrotate
|
|
|
|
# Install PHP extension installer
|
|
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/
|
|
|
|
# Install PHP extensions
|
|
RUN install-php-extensions \
|
|
intl \
|
|
pdo_mysql \
|
|
opcache \
|
|
zip \
|
|
tokenizer \
|
|
ctype \
|
|
iconv \
|
|
mbstring \
|
|
dom \
|
|
xml \
|
|
simplexml \
|
|
xmlreader \
|
|
xmlwriter
|
|
|
|
# Install composer
|
|
ENV COMPOSER_ALLOW_SUPERUSER=1 \
|
|
COMPOSER_HOME=/tmp/composer
|
|
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
|
|
|
|
# Configure PHP
|
|
COPY docker/php/php.ini $PHP_INI_DIR/conf.d/zz-custom.ini
|
|
|
|
# Cron daemon (BusyBox's built-in crond) for the php-cron container.
|
|
# Harmless for the php/php-worker containers too, since they never invoke crond.
|
|
COPY docker/php/crontab /etc/crontabs/root
|
|
RUN chmod 0600 /etc/crontabs/root
|
|
|
|
# Log rotation for the cron hint-check and PHP error logs: 25MB per file, kept for 3 months.
|
|
COPY docker/php/logrotate/cron-hints.conf /etc/logrotate.d/cron-hints
|
|
COPY docker/php/logrotate/php-logs.conf /etc/logrotate.d/php-logs
|
|
RUN chmod 0644 /etc/logrotate.d/cron-hints /etc/logrotate.d/php-logs
|
|
|
|
# Adjust www-data UID/GID to match host user (default 1000)
|
|
ARG USER_ID=1000
|
|
ARG GROUP_ID=1000
|
|
|
|
RUN if [ ${USER_ID:-0} -ne 0 ] && [ ${GROUP_ID:-0} -ne 0 ]; then \
|
|
userdel -f www-data &&\
|
|
if getent group www-data ; then groupdel www-data; fi &&\
|
|
groupadd -g ${GROUP_ID} www-data &&\
|
|
useradd -l -u ${USER_ID} -g www-data www-data &&\
|
|
install -d -m 0755 -o www-data -g www-data /home/www-data \
|
|
;fi
|
|
|
|
WORKDIR /var/www/html
|
|
|
|
# Set permissions for Symfony directories
|
|
RUN mkdir -p var/cache var/log/cron var/log/php var/sessions && \
|
|
chown -R www-data:www-data var
|
|
|
|
# Default command
|
|
CMD ["php-fpm"]
|