mirror of
https://github.com/Part-DB/Part-DB-server.git
synced 2026-07-27 11:41:36 +00:00
Added docker environment emulating a manual installed Part-DB on debian
Used to debug issues like #1423
This commit is contained in:
parent
805319c6b0
commit
90a5ab74ff
5 changed files with 176 additions and 0 deletions
61
.docker/debian-manual-guide/Dockerfile
Normal file
61
.docker/debian-manual-guide/Dockerfile
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
# Reproduces https://docs.part-db.de/installation/installation_guide-debian.html
|
||||||
|
# on Debian 12 (bookworm) as closely as possible, for debugging issues reported
|
||||||
|
# by users who followed that guide (Apache2 + mod_php, not the project's own
|
||||||
|
# FrankenPHP-based Dockerfile at the repo root).
|
||||||
|
FROM debian:12
|
||||||
|
|
||||||
|
ARG HOST_UID=1000
|
||||||
|
ARG HOST_GID=1000
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
# --- Prerequisites (guide: "Prerequisites Installation") ---
|
||||||
|
RUN apt-get update && apt-get upgrade -y && \
|
||||||
|
apt-get install -y --no-install-recommends \
|
||||||
|
git curl zip ca-certificates software-properties-common \
|
||||||
|
apt-transport-https lsb-release nano wget sqlite3 gnupg openssl \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# --- PHP and Apache2 (guide: "PHP and Apache2 Setup") ---
|
||||||
|
# Debian 12 ships PHP 8.2 by default, so no extra PHP repo is needed.
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
apache2 php8.2 libapache2-mod-php8.2 \
|
||||||
|
php8.2-opcache php8.2-curl php8.2-gd php8.2-mbstring \
|
||||||
|
php8.2-xml php8.2-bcmath php8.2-intl php8.2-zip php8.2-xsl \
|
||||||
|
php8.2-sqlite3 php8.2-mysql \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# --- Composer (guide: "Composer Installation") ---
|
||||||
|
RUN wget -O /tmp/composer-setup.php https://getcomposer.org/installer \
|
||||||
|
&& php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer \
|
||||||
|
&& chmod +x /usr/local/bin/composer \
|
||||||
|
&& rm /tmp/composer-setup.php
|
||||||
|
|
||||||
|
# --- Node.js and Yarn (guide: "Node.js and Yarn Setup") ---
|
||||||
|
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
|
||||||
|
&& apt-get install -y --no-install-recommends nodejs \
|
||||||
|
&& curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor -o /usr/share/keyrings/yarnkey.gpg \
|
||||||
|
&& echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" > /etc/apt/sources.list.d/yarn.list \
|
||||||
|
&& apt-get update && apt-get install -y --no-install-recommends yarn \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Map www-data to the host user's uid/gid so files created inside the
|
||||||
|
# bind-mounted repo (composer/yarn artifacts, chown'd dirs) don't end up
|
||||||
|
# owned by a foreign uid on the host.
|
||||||
|
RUN groupmod -g ${HOST_GID} www-data && usermod -u ${HOST_UID} -g ${HOST_GID} www-data \
|
||||||
|
&& mkdir -p /var/www/partdb && chown -R www-data:www-data /var/www
|
||||||
|
|
||||||
|
# --- Apache2 Configuration (guide: "Apache2 Configuration") ---
|
||||||
|
COPY partdb.conf /etc/apache2/sites-available/partdb.conf
|
||||||
|
RUN ln -sf /etc/apache2/sites-available/partdb.conf /etc/apache2/sites-enabled/partdb.conf \
|
||||||
|
&& a2enmod rewrite headers access_compat \
|
||||||
|
&& rm -f /etc/apache2/sites-enabled/000-default.conf
|
||||||
|
|
||||||
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
|
RUN chmod +x /entrypoint.sh
|
||||||
|
|
||||||
|
WORKDIR /var/www/partdb
|
||||||
|
EXPOSE 80
|
||||||
|
|
||||||
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
CMD ["apache2ctl", "-D", "FOREGROUND"]
|
||||||
41
.docker/debian-manual-guide/docker-compose.yml
Normal file
41
.docker/debian-manual-guide/docker-compose.yml
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
# Reproduces a Debian 12 install following
|
||||||
|
# https://docs.part-db.de/installation/installation_guide-debian.html
|
||||||
|
# using the repo checkout two levels up, for debugging.
|
||||||
|
#
|
||||||
|
# Usage (from this directory):
|
||||||
|
# HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up --build
|
||||||
|
#
|
||||||
|
# Then open http://localhost:8080 (login: admin / password printed in the
|
||||||
|
# container logs by doctrine:migrations:migrate on first run).
|
||||||
|
#
|
||||||
|
# vendor/, node_modules/, var/, public/build, public/media and uploads live
|
||||||
|
# in named volumes so composer/yarn/console never write into the host's own
|
||||||
|
# working copy - only src/, config/, templates/, assets/, migrations/, etc.
|
||||||
|
# are shared live for debugging.
|
||||||
|
services:
|
||||||
|
partdb:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
args:
|
||||||
|
HOST_UID: ${HOST_UID:-1000}
|
||||||
|
HOST_GID: ${HOST_GID:-1000}
|
||||||
|
container_name: partdb-debian-guide
|
||||||
|
ports:
|
||||||
|
- "8080:80"
|
||||||
|
volumes:
|
||||||
|
- ../..:/var/www/partdb
|
||||||
|
- ./env.local:/var/www/partdb/.env.local:ro
|
||||||
|
- partdb_vendor:/var/www/partdb/vendor
|
||||||
|
- partdb_node_modules:/var/www/partdb/node_modules
|
||||||
|
- partdb_var:/var/www/partdb/var
|
||||||
|
- partdb_public_build:/var/www/partdb/public/build
|
||||||
|
- partdb_public_media:/var/www/partdb/public/media
|
||||||
|
- partdb_uploads:/var/www/partdb/uploads
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
partdb_vendor:
|
||||||
|
partdb_node_modules:
|
||||||
|
partdb_var:
|
||||||
|
partdb_public_build:
|
||||||
|
partdb_public_media:
|
||||||
|
partdb_uploads:
|
||||||
48
.docker/debian-manual-guide/entrypoint.sh
Normal file
48
.docker/debian-manual-guide/entrypoint.sh
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Reproduces the app-setup steps from
|
||||||
|
# https://docs.part-db.de/installation/installation_guide-debian.html
|
||||||
|
# against the repo bind-mounted at /var/www/partdb.
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
cd /var/www/partdb
|
||||||
|
|
||||||
|
# Only chown the named-volume mount points (see docker-compose.yml) - they're
|
||||||
|
# fresh docker volumes owned by root until first use. The bind-mounted source
|
||||||
|
# tree doesn't need it (www-data's uid/gid is mapped to the host user's at
|
||||||
|
# image build time, so ownership already matches), and recursing into it
|
||||||
|
# would also try (and fail) to chown the read-only .env.local mount.
|
||||||
|
chown -R www-data:www-data \
|
||||||
|
var vendor node_modules public/build public/media uploads
|
||||||
|
|
||||||
|
as_www() {
|
||||||
|
# -p preserves the environment (APP_ENV/APP_SECRET/DATABASE_URL from
|
||||||
|
# docker-compose) across the user switch. Plain `su` resets it, which
|
||||||
|
# would silently fall back to whatever's baked into .env.local.
|
||||||
|
su -p -s /bin/bash www-data -c "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ ! -f vendor/autoload.php ] || [ "${FORCE_REINSTALL:-0}" = "1" ]; then
|
||||||
|
echo "==> composer install -o"
|
||||||
|
as_www "composer install -o"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d node_modules/.bin ] || [ "${FORCE_REINSTALL:-0}" = "1" ]; then
|
||||||
|
echo "==> yarn install"
|
||||||
|
as_www "yarn install"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f public/build/manifest.json ] || [ "${FORCE_REINSTALL:-0}" = "1" ]; then
|
||||||
|
echo "==> yarn build"
|
||||||
|
as_www "yarn build"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> cache:clear"
|
||||||
|
as_www "php bin/console cache:clear"
|
||||||
|
|
||||||
|
echo "==> partdb:check-requirements"
|
||||||
|
as_www "php bin/console partdb:check-requirements" || true
|
||||||
|
|
||||||
|
echo "==> doctrine:migrations:migrate"
|
||||||
|
as_www "php bin/console doctrine:migrations:migrate --no-interaction"
|
||||||
|
|
||||||
|
exec "$@"
|
||||||
11
.docker/debian-manual-guide/env.local
Normal file
11
.docker/debian-manual-guide/env.local
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Bind-mounted over /var/www/partdb/.env.local inside the container only.
|
||||||
|
# The host's real .env.local (dev, MySQL on 127.0.0.1) is never touched or
|
||||||
|
# read - this guarantees APP_ENV/DATABASE_URL are correct for BOTH Apache/
|
||||||
|
# mod_php web requests and CLI (console/composer) commands, without relying
|
||||||
|
# on environment variables being propagated into Apache's subprocess env
|
||||||
|
# (which is what caused the "WebProfilerBundle" dev-bundle error: web
|
||||||
|
# requests were silently falling back to the host .env.local's APP_ENV=dev,
|
||||||
|
# while --no-dev composer install never installed that bundle).
|
||||||
|
APP_ENV=prod
|
||||||
|
APP_SECRET=0000000000000000000000000000000000000000000000000000000000debug
|
||||||
|
DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"
|
||||||
15
.docker/debian-manual-guide/partdb.conf
Normal file
15
.docker/debian-manual-guide/partdb.conf
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Verbatim from https://docs.part-db.de/installation/installation_guide-debian.html
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerName partdb.lan
|
||||||
|
ServerAlias www.partdb.lan
|
||||||
|
|
||||||
|
DocumentRoot /var/www/partdb/public
|
||||||
|
<Directory /var/www/partdb/public>
|
||||||
|
AllowOverride All
|
||||||
|
Order Allow,Deny
|
||||||
|
Allow from All
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
ErrorLog /var/log/apache2/partdb_error.log
|
||||||
|
CustomLog /var/log/apache2/partdb_access.log combined
|
||||||
|
</VirtualHost>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue