########## grocy — bench probes, 2026-10-10T09:41:10Z ##########

=== 0.3 the image, its tags and its architectures ===
  lscr.io/linuxserver/grocy:4.7.1 -> [('linux', 'amd64'), ('linux', 'arm64')]
  image size: 275077460 bytes (11 layers)

=== 0.6 / 4.5 the image's ports, volumes, entrypoint, user, healthcheck ===
  ExposedPorts={"443/tcp":{},"80/tcp":{}} Volumes={"/config":{}} Entrypoint=["/init"] Cmd=null User="" Healthcheck=null

=== 1.7 every start-time switch: the image's s6 oneshots, and the grocy-specific one in full ===
ci-service-check init-adduser init-config init-config-end init-crontab-config init-custom-files init-device-perms init-envfile init-folders init-grocy-config init-keygen init-migrations init-mods init-mods-end init-mods-package-install init-nginx init-nginx-end init-os-end init-permissions init-php init-samples init-services init-version-checks svc-cron svc-nginx svc-php-fpm user user2 
--- init-grocy-config/run:
#!/usr/bin/with-contenv bash
# shellcheck shell=bash

# create missing cache directory
mkdir -p /app/www/data/viewcache || :

# create symlinks
i=/app/www/data
if [[ -e "$i" && ! -L "$i" && -e /config/"$(basename "$i")" ]]; then
    rm -Rf "$i"
    ln -s /config/"$(basename "$i")" "$i"
fi
if [[ -e "$i" && ! -L "$i" ]]; then
    mv "$i" /config/"$(basename "$i")"
    ln -s /config/"$(basename "$i")" "$i"
fi

# check for config file and copy default if needed
if [[ ! -f "/config/data/config.php" ]]; then
    cp /app/www/config-dist.php /config/data/config.php
fi

if [[ ! -f "/config/data/plugins/DemoBarcodeLookupPlugin.php" ]]; then
    cp -R /defaults/plugins /config/data
fi

# permissions
lsiown -R abc:abc \
    /config

=== 4.1 which HTTP clients the image actually carries ===
  curl      /usr/bin/curl
  wget      /usr/bin/wget
  nc        /usr/bin/nc
  python3   MISSING
  perl      MISSING
  ruby      MISSING
  node      MISSING
  bash      /bin/bash
  awk       /usr/bin/awk
  sed       /bin/sed
  openssl   /usr/bin/openssl
  sqlite3   MISSING
  php       /usr/bin/php

=== 1.6 / 3.2 the hashing grocy itself uses, as the image reports it ===
PHP 8.5.6 (cli) (built: May  7 2026 16:54:58) (NTS)
  password_algos: Array
(
    [0] => 2y
    [1] => argon2i
    [2] => argon2id
)

  ext: PDO
  ext: pdo_sqlite

=== a fresh start: what exists, who owns it, which processes serve it ===
  4.3 /login answered 200 after 3s
  2.2 what it writes under /config:
    /config
    /config/.migrations
    /config/data
    /config/data/.gitignore
    /config/data/.htaccess
    /config/data/config.php
    /config/data/grocy.db
    /config/data/plugins
    /config/data/viewcache
    /config/keys
    /config/keys/cert.crt
    /config/keys/cert.key
    /config/log
    /config/log/nginx
    /config/log/php
    /config/nginx
    /config/nginx/nginx.conf
    /config/nginx/nginx.conf.sample
    /config/nginx/resolver.conf
    /config/nginx/site-confs
    /config/nginx/ssl.conf
    /config/nginx/ssl.conf.sample
    /config/nginx/worker_processes.conf
    /config/php
    /config/php/php-local.ini
    /config/php/www2.conf
    /config/www
    /config/www/index.html
  2.4 ownership:
    total 40
    drwxrwxr-x 4 abc users  4096 Oct 10 11:41 .
    drwxr-xr-x 8 abc users  4096 Oct 10 11:41 ..
    -rw-rw-r-- 1 abc users    34 Sep  4 17:51 .gitignore
    -rw-rw-r-- 1 abc users    14 Sep  4 17:51 .htaccess
    -rw-r--r-- 1 abc users 15841 Oct 10 11:41 config.php
    -rw-r--r-- 1 abc users     0 Oct 10 11:41 grocy.db
    drwxrwxr-x 2 abc users  4096 Oct 10 11:41 plugins
    drwxr-xr-x 2 abc users  4096 Oct 10 11:41 viewcache
  1.5 the processes that serve it (php-fpm + nginx = a production server; PID 1 is s6, the supervisor):
          1 root     /package/admin/s6/command/s6-svscan -d4 -- /run/service
         40 root     s6-supervise svc-php-fpm
         41 root     s6-supervise svc-nginx
        250 root     php-fpm: master process (/etc/php85/php-fpm.conf)
        251 root     nginx: master process /usr/sbin/nginx -e stderr
    php-fpm worker 28:user = abc
    php-fpm worker 29:group = abc
  1.8 MODE and DISABLE_AUTH as the running app reads them, and an unknown page:
    20:Setting('MODE', 'production');
    74:Setting('STOCK_BARCODE_LOOKUP_PLUGIN', 'OpenFoodFactsBarcodeLookupPlugin');
    86:Setting('DISABLE_AUTH', false);
    unknown page -> 404
    stack-trace markers on that page: 1

=== 3.1 a fresh install's users table, before anything replaces the password ===
    1|admin|$argon2id$v=19$m=65536,t=4,p=1...
  the documented default admin/admin, through the app's own login route:
    admin/admin -> 302 http://127.0.0.1:18093/

=== 4.1 the compose healthcheck command, both directions ===
    against the app  rc=0
    against a dead port rc=1

=== 6.5 the tag shape upstream, and the same-tag re-push ===
    the catalog pins the plain version tag, as bookstack/code-server/radarr/sonarr do.
    digest served now for 4.7.1:
      Name:      lscr.io/linuxserver/grocy:4.7.1
      MediaType: application/vnd.oci.image.index.v1+json
      Digest:    sha256:c0d0d9d22d3a54fe3f779a743baa2d7bab96b73fad5597ff1a631e2be4b863c8

=== 0.4 / 0.5 every outbound host the source can reach (repo-wide, at the pinned tag) ===
    102:https://grocy.info
    105:https://berrnd.de
    113:https://www.sqlite.org/lang
    125:https://github.com/mike42/escpos-php
    12:https://github.com/grocy/grocy/issues
    184:http://htmlpurifier.org/live/configdoc/plain.html
    190:http://htmlpurifier.org/live/configdoc/plain.html
    19:https://grocy.example.com/
    20:https://github.com/twbs/bootstrap/issues/22753
    20:https://grocy.info
    20:https://world.openfoodfacts.org/api/v2/product/
    21:https://bugzilla.mozilla.org/show
    417:https://releases.grocy.info/demoresources/cookies.jpg
    418:https://releases.grocy.info/demoresources/cucumber.jpg
    419:https://releases.grocy.info/demoresources/gummybears.jpg
    420:https://releases.grocy.info/demoresources/paprika.jpg
    421:https://releases.grocy.info/demoresources/tomato.jpg
    422:https://releases.grocy.info/demoresources/loremipsum.pdf
    423:https://releases.grocy.info/demoresources/pizza.jpg
    424:https://releases.grocy.info/demoresources/sandwiches.jpg
    425:https://releases.grocy.info/demoresources/pancakes.jpg
    426:https://releases.grocy.info/demoresources/spaghetti.jpg
    427:https://releases.grocy.info/demoresources/chocolate
    428:https://releases.grocy.info/demoresources/pancakes
    58:https://example.com/grocy
    61:https://example.com/grocy/public/index.php/
    636:https://grocy.info
    67:https://example.com/grocy
    70:https://grocy.info/

=== 3.10 does grocy read the client address anywhere? (repo-wide grep) ===

=== 7.1 does grocy send mail? (its own settings file) ===
    matches in config-dist.php: 0

=== 0.2 Hungarian coverage of the UI, with a control ===
    de   734 strings,   0 untranslated -> 100.0 % translated
    fr   734 strings,  12 untranslated -> 98.4 % translated
    hu   734 strings,  62 untranslated -> 91.6 % translated
    (de is the control: a language that must be ~100 %. A first attempt at this count read 0 %
     for every language — a .po parser that mishandled multi-line msgstr — and the control caught it.)

########## end ##########
