Picstome

Picstome

Docker app from Jomom50's Repository

Overview

Self-hosted galleries, contracts, invoicing and client management for photographers. Everything runs in one container: web server, PHP, queue worker, scheduler, SQLite database and MinIO photo storage.

Installation

This project is a standard Laravel application; it is based on Laravel 12 and uses Livewire, Tailwind CSS, and TallStackUI for the frontend. If you are familiar with Laravel, you should feel comfortable working on this project.

For local development, you can use the following requirements:

  • PHP 8.3 with SQLite, GD, and other common extensions.
  • Node.js 16 or later.

Note for production: If you expect users to download large galleries or files, you should increase the request_terminate_timeout setting in your PHP-FPM pool configuration (usually in /etc/php/8.3/fpm/pool.d/www.conf). For example:

request_terminate_timeout = 1200

This prevents PHP-FPM from killing long-running download requests. Make sure to reload PHP-FPM after changing this setting.

Large uploads copied to S3 from the application can also exceed PHP's default execution limit. The gallery upload action raises the PHP limit to 5 minutes, but the PHP-FPM pool's request_terminate_timeout must allow that longer request too.

If you meet these requirements, you can start by cloning the repository and installing the dependencies.

Using Composer and NPM:

composer install
npm install

After that, set up your .env file:

cp .env.example .env

php artisan key:generate

Set up your database, run the migrations and the seeder:

touch database/database.sqlite

php artisan migrate:fresh --seed

Link the storage to the public folder.

php artisan storage:link

In a separate terminal, build the assets in watch mode and start the development server:

composer run dev

Download Statistics

121
Total Downloads

Related apps

Explore more like this

Explore all

Details

Repository
jomom50/picstome:latest
Last Updated2026-11-14
First Seen2026-11-14

Runtime arguments

Web UI
http://[IP]:[PORT:80]/
Network
bridge
Shell
bash
Privileged
false

Template configuration

WebUI PortPorttcp

Port for the Picstome web interface. Container port is 80.

Target
80
Default
8282
Value
8282
Photo Storage PortPorttcp

MinIO S3 endpoint. Browsers download gallery photos from this port, so it must be reachable from client devices.

Target
9000
Default
9000
Value
9000
AppdataPathrw

The only path that has to persist: database, logs and generated secrets (plus photos, unless the optional path below is mapped). Any directory works — on Unraid the usual choice is /mnt/user/appdata/picstome; on another host use something like /srv/picstome.

Target
/data
Default
/mnt/user/appdata/picstome
Value
/mnt/user/appdata/picstome
Photo Storage PathPathrw

Optional. A separate directory for gallery photos, handy for keeping them out of appdata backups or on a bigger disk. Any path works and it can be changed or removed later; if it is removed, photos stay under Appdata. The object store keeps its own layout, so the files are not browsable as plain images.

Target
/data/minio
Default
/mnt/user/appdata/picstome/minio
Value
/mnt/user/appdata/picstome/minio
Public URLVariable

Address used in emails, share links and contracts. Use the exact public URL, including https:// when behind a TLS reverse proxy.

Target
APP_URL
Default
http://[IP]:[PORT:80]
Value
http://[IP]:[PORT:80]
Photo Storage URLVariable

Public address of the S3 photo endpoint, without the bucket name. Behind a reverse proxy use a dedicated hostname such as https://photos.example.com.

Target
PICSTOME_PHOTOS_URL
Default
http://[IP]:[PORT:9000]
Value
http://[IP]:[PORT:9000]
Admin EmailVariable

Email of the admin account created on first start. This address also grants admin access later.

Target
PICSTOME_ADMIN_EMAIL
Admin NameVariable

Display name for the first admin account and its studio.

Target
PICSTOME_ADMIN_NAME
Default
Picstome Admin
Value
Picstome Admin
Admin PasswordVariable

Password for the first admin account. Only used when no user exists yet. Leave empty to generate one into the appdata folder.

Target
PICSTOME_ADMIN_PASSWORD
SMTP HostVariable

Mail server for account verification, gallery and contract emails. Only needed when Mail Transport is smtp — leave it empty to install without mail and set it later.

Target
MAIL_HOST
SMTP PortVariable

587 for STARTTLS, 465 for implicit TLS.

Target
MAIL_PORT
Default
587
Value
587
SMTP EncryptionVariable

smtp for port 587 (STARTTLS), smtps for port 465.

Target
MAIL_SCHEME
Default
smtp
Value
smtp
SMTP UsernameVariable

Usually the full email address for your mail provider.

Target
MAIL_USERNAME
SMTP PasswordVariable

Password or app password from your mail provider.

Target
MAIL_PASSWORD
From AddressVariable

Sender address shown on outgoing email. Leave empty to use the admin email.

Target
MAIL_FROM_ADDRESS
From NameVariable

Sender name shown on outgoing email.

Target
MAIL_FROM_NAME
Default
Picstome
Value
Picstome
Mail TransportVariable

smtp sends real email. log writes messages to the container log instead, useful while testing.

Target
MAIL_MAILER
Default
smtp
Value
smtp
TimezoneVariable

Application timezone, for example Europe/Madrid. Affects reminders and contract dates.

Target
APP_TIMEZONE
Default
UTC
Value
UTC
LanguageVariable

Default interface language: en or es.

Target
APP_LOCALE
Default
en
Value
en
Max Upload SizeVariable

Maximum size of a single upload, applied to both nginx and PHP. Raise it if you upload large videos.

Target
UPLOAD_MAX_SIZE
Default
512M
Value
512M
PHP Memory LimitVariable

Memory allowed per PHP process.

Target
PHP_MEMORY_LIMIT
Default
512M
Value
512M
PHP TimeoutVariable

Seconds a web request may run. Large gallery downloads are handled separately.

Target
PHP_MAX_EXECUTION_TIME
Default
300
Value
300
Photo CDN ModeVariable

bunny serves photos directly from your own storage (recommended, nothing leaves your server). wsrv.nl resizes images through a third-party CDN, which must be able to reach your Photo Storage URL.

Target
PICSTOME_PHOTO_CDN_DOMAIN
Default
bunny
Value
bunny
Trusted ProxiesVariable

Reverse proxies allowed to send X-Forwarded headers. * accepts any proxy, which is normal on a home network. Set the proxy IP for a stricter setup.

Target
TRUSTED_PROXIES
Default
*
Value
*
Landing PageVariable

Optional. Send anonymous visitors who open the root URL to this public page instead of the login screen, for example /@yourhandle/portfolio. Signed-in users still reach the dashboard. Leave empty to keep the default behaviour.

Target
LANDING_REDIRECT
Run MigrationsVariable

Apply database migrations on every start. Leave enabled so updates always migrate.

Target
AUTO_MIGRATE
Default
true
Value
true
Log LevelVariable

Laravel log level: debug, info, warning or error.

Target
LOG_LEVEL
Default
warning
Value
warning
S3 BucketVariable

Name of the bucket inside the bundled object store. It is created on first start, so changing it is safe; existing photos stay under the old bucket.

Target
S3_BUCKET
Default
picstome
Value
picstome
S3 RegionVariable

Region reported to the S3 client. MinIO accepts us-east-1 by default.

Target
S3_REGION
Default
us-east-1
Value
us-east-1
Queue Worker TimeoutVariable

Seconds the queue worker allows per job. Must stay above the gallery archive timeout of 3600.

Target
QUEUE_WORKER_TIMEOUT
Default
3700
Value
3700