Fix SQLite docker build related issues (#458)

This commit is contained in:
Darko Gjorgjijoski
2025-09-01 02:42:07 +02:00
committed by GitHub
parent 3d327a1735
commit f1635bcef8
9 changed files with 239 additions and 75 deletions

View File

@@ -53,7 +53,7 @@ class DatabaseConfigurationController extends Controller
case 'sqlite':
$databaseData = [
'database_connection' => 'sqlite',
'database_name' => database_path('database.sqlite'),
'database_name' => config('database.connections.sqlite.database', storage_path('database.sqlite')),
];
break;

View File

@@ -1,61 +1,183 @@
<?php
use Illuminate\Support\Str;
return [
/*
|--------------------------------------------------------------------------
| Default Database Connection Name
|--------------------------------------------------------------------------
|
| Here you may specify which of the database connections below you wish
| to use as your default connection for database operations. This is
| the connection which will be utilized unless another connection
| is explicitly specified when you execute a query / statement.
|
*/
'default' => env('DB_CONNECTION', 'sqlite'),
/*
|--------------------------------------------------------------------------
| Database Connections
|--------------------------------------------------------------------------
|
| Below are all of the database connections defined for your application.
| An example configuration is provided for each database system which
| is supported by Laravel. You're free to add / remove connections.
|
*/
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'url' => env('DB_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
'busy_timeout' => null,
'journal_mode' => null,
'synchronous' => null,
'transaction_mode' => 'DEFERRED',
],
'mysql' => [
'driver' => 'mysql',
'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => '',
'prefix_indexes' => true,
'strict' => false,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'mariadb' => [
'driver' => 'mariadb',
'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'charset' => env('DB_CHARSET', 'utf8'),
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'search_path' => 'public',
'sslmode' => 'prefer',
],
'sqlsrv' => [
'driver' => 'sqlsrv',
'url' => env('DB_URL'),
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => env('DB_CHARSET', 'utf8'),
'prefix' => '',
'prefix_indexes' => true,
// 'encrypt' => env('DB_ENCRYPT', 'yes'),
// 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
],
],
/*
|--------------------------------------------------------------------------
| Migration Repository Table
|--------------------------------------------------------------------------
|
| This table keeps track of all the migrations that have already run for
| your application. Using this information, we can determine which of
| the migrations on disk haven't actually been run on the database.
|
*/
'migrations' => [
'table' => 'migrations',
'update_date_on_publish' => false, // disable to preserve original behavior for existing applications
'update_date_on_publish' => true,
],
/*
|--------------------------------------------------------------------------
| Redis Databases
|--------------------------------------------------------------------------
|
| Redis is an open source, fast, and advanced key-value store that also
| provides a richer body of commands than a typical key-value system
| such as Memcached. You may define your connection settings here.
|
*/
'redis' => [
'client' => 'predis',
'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'),
'persistent' => env('REDIS_PERSISTENT', false),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
'read_write_timeout' => 60,
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
'max_retries' => env('REDIS_MAX_RETRIES', 3),
'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_CACHE_DB', 1),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
'max_retries' => env('REDIS_MAX_RETRIES', 3),
'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'),
'backoff_base' => env('REDIS_BACKOFF_BASE', 100),
'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000),
],
],
];

View File

@@ -109,13 +109,13 @@ This dockerized environment comes with support for all three databases that Invo
The setup parameters/credentials for each of the supported databases are as follows.
| | MySQL | PostgreSQL | SQLite |
|---|---|---|---------------------------------------|
| **DB_USER** | invoiceshelf | invoiceshelf | Not applicable |
| **DB_PASS** | invoiceshelf | invoiceshelf | Not applicable |
| **DB_NAME** | invoiceshelf | invoiceshelf | /var/www/html/storage/database.sqlite |
| **DB_HOST** | db-mysql | db-pgsql | Not applicable |
| **DB_PORT** | 3036 | 5432 | Not applicable |
| | MySQL | PostgreSQL | SQLite |
|---|---|---|-------------------------------------------|
| **DB_USER** | invoiceshelf | invoiceshelf | Not applicable |
| **DB_PASS** | invoiceshelf | invoiceshelf | Not applicable |
| **DB_NAME** | invoiceshelf | invoiceshelf | /var/www/html/storage/app/database.sqlite |
| **DB_HOST** | db-mysql | db-pgsql | Not applicable |
| **DB_PORT** | 3036 | 5432 | Not applicable |
**Note:** The only required field for SQLite is **DB_NAME**.
@@ -135,11 +135,11 @@ To log into the MySQL or PostgresSQL, use the database information specified in
To log into the SQLite, use the following credentials:
| KEY | VALUE |
|--------------|--------------------------|
| **USERNAME** | admin |
| **PASSWORD** | admin |
| **DATABASE** | /storage/database.sqlite |
| KEY | VALUE |
|--------------|------------------------------|
| **USERNAME** | admin |
| **PASSWORD** | admin |
| **DATABASE** | /storage/app/database.sqlite |
### 4. Mailpit (fake mail)

View File

@@ -0,0 +1,46 @@
#-------------------------------------------
# InvoiceShelf SQLite docker-compose variant
# Repo : https://github.com/InvoiceShelf/docker
#-------------------------------------------
services:
webapp:
#image: invoiceshelf/invoiceshelf:nightly
build:
context: ../../
dockerfile: docker/production/Dockerfile
container_name: invoiceshelf-sqlite
ports:
- "8090:8080" # 8090 is the public port.
volumes:
- invoiceshelf_storage:/var/www/html/storage
networks:
- invoiceshelf
environment:
- APP_NAME=InvoiceShelf
- APP_ENV=production
- APP_DEBUG=false
- APP_URL=http://localhost:8090
- DB_CONNECTION=sqlite
- DB_DATABASE=/var/www/html/storage/app/database.sqlite # please don't touch this!
- CACHE_STORE=file
- SESSION_DRIVER=file
- SESSION_LIFETIME=240
- SESSION_DOMAIN=localhost
- SANCTUM_STATEFUL_DOMAINS=localhost:8090
#- MAIL_DRIVER=smtp
#- MAIL_HOST=smtp.mailtrap.io
#- MAIL_PORT=2525
#- MAIL_USERNAME=null
#- MAIL_PASSWORD=null
#- MAIL_PASSWORD_FILE=<filename>
#- MAIL_ENCRYPTION=null
restart: unless-stopped
networks:
invoiceshelf:
volumes:
invoiceshelf_storage:
invoiceshelf_sqlite:

View File

@@ -10,20 +10,19 @@ echo "
InvoiceShelf Version: $version
-------------------------------------"
if [ -n "$STARTUP_DELAY" ]
then echo "**** Delaying startup ($STARTUP_DELAY seconds)... ****"
sleep $STARTUP_DELAY
fi
cd /var/www/html
cp .env.example .env
if [ ! -e /var/www/html/.env ]; then
cp .env.example .env
echo "**** Setup initial .env values ****" && \
/inject.sh
fi
if [ "$DB_CONNECTION" = "sqlite" ] || [ -z "$DB_CONNECTION" ]; then
echo "**** Configure SQLite3 database ****"
if [ ! -n "$DB_DATABASE" ]; then
echo "**** DB_DATABASE not defined. Fall back to default /storage/database.sqlite location ****"
DB_DATABASE='/var/www/html/storage/database.sqlite'
echo "**** DB_DATABASE not defined. Fall back to default /storage/app/database.sqlite location ****"
DB_DATABASE='/var/www/html/storage/app/database.sqlite'
fi
if [ ! -e "$DB_DATABASE" ]; then
@@ -34,9 +33,6 @@ if [ "$DB_CONNECTION" = "sqlite" ] || [ -z "$DB_CONNECTION" ]; then
chown www-data:www-data "$DB_DATABASE"
fi
echo "**** Inject .env values ****" && \
/inject.sh
echo "**** Setting up artisan permissions ****"
chmod +x artisan

View File

@@ -9,97 +9,97 @@ function replace_or_insert() {
replace_or_insert "CONTAINERIZED" "true"
if [ "$APP_NAME" != '' ]; then
replace_or_insert "APP_NAME" "$APP_NAME"
replace_or_insert "APP_NAME" "$APP_NAME"
fi
if [ "$APP_ENV" != '' ]; then
replace_or_insert "APP_ENV" "$APP_ENV"
replace_or_insert "APP_ENV" "$APP_ENV"
fi
if [ "$APP_KEY" != '' ]; then
replace_or_insert "APP_KEY" "$APP_KEY"
replace_or_insert "APP_KEY" "$APP_KEY"
fi
if [ "$APP_DEBUG" != '' ]; then
replace_or_insert "APP_DEBUG" "$APP_DEBUG"
replace_or_insert "APP_DEBUG" "$APP_DEBUG"
fi
if [ "$APP_URL" != '' ]; then
replace_or_insert "APP_URL" "$APP_URL"
replace_or_insert "APP_URL" "$APP_URL"
fi
if [ "$APP_DIR" != '' ]; then
replace_or_insert "APP_DIR" "$APP_DIR"
replace_or_insert "APP_DIR" "$APP_DIR"
fi
if [ "$DB_CONNECTION" != '' ]; then
replace_or_insert "DB_CONNECTION" "$DB_CONNECTION"
replace_or_insert "DB_CONNECTION" "$DB_CONNECTION"
fi
if [ "$DB_HOST" != '' ]; then
replace_or_insert "DB_HOST" "$DB_HOST"
replace_or_insert "DB_HOST" "$DB_HOST"
fi
if [ "$DB_PORT" != '' ]; then
replace_or_insert "DB_PORT" "$DB_PORT"
replace_or_insert "DB_PORT" "$DB_PORT"
fi
if [ "$DB_DATABASE" != '' ]; then
replace_or_insert "DB_DATABASE" "$DB_DATABASE"
replace_or_insert "DB_DATABASE" "$DB_DATABASE"
fi
if [ "$DB_USERNAME" != '' ]; then
replace_or_insert "DB_USERNAME" "$DB_USERNAME"
replace_or_insert "DB_USERNAME" "$DB_USERNAME"
fi
if [ "$DB_PASSWORD" != '' ]; then
replace_or_insert "DB_PASSWORD" "$DB_PASSWORD"
replace_or_insert "DB_PASSWORD" "$DB_PASSWORD"
elif [ "$DB_PASSWORD_FILE" != '' ]; then
value=$(<$DB_PASSWORD_FILE)
replace_or_insert "DB_PASSWORD" "$value"
replace_or_insert "DB_PASSWORD" "$value"
fi
if [ "$TIMEZONE" != '' ]; then
replace_or_insert "TIMEZONE" "$TIMEZONE"
replace_or_insert "TIMEZONE" "$TIMEZONE"
fi
if [ "$CACHE_STORE" != '' ]; then
replace_or_insert "CACHE_STORE" "$CACHE_STORE"
replace_or_insert "CACHE_STORE" "$CACHE_STORE"
fi
if [ "$CACHE_DRIVER" != '' ]; then
replace_or_insert "CACHE_STORE" "$CACHE_DRIVER" # deprecated (will be removed later)
replace_or_insert "CACHE_STORE" "$CACHE_DRIVER" # deprecated (will be removed later)
fi
if [ "$SESSION_DRIVER" != '' ]; then
replace_or_insert "SESSION_DRIVER" "$SESSION_DRIVER"
replace_or_insert "SESSION_DRIVER" "$SESSION_DRIVER"
fi
if [ "$SESSION_LIFETIME" != '' ]; then
replace_or_insert "SESSION_LIFETIME" "$SESSION_LIFETIME"
replace_or_insert "SESSION_LIFETIME" "$SESSION_LIFETIME"
fi
if [ "$QUEUE_CONNECTION" != '' ]; then
replace_or_insert "QUEUE_CONNECTION" "$QUEUE_CONNECTION"
replace_or_insert "QUEUE_CONNECTION" "$QUEUE_CONNECTION"
fi
if [ "$BROADCAST_CONNECTION" != '' ]; then
replace_or_insert "BROADCAST_CONNECTION" "$BROADCAST_CONNECTION"
replace_or_insert "BROADCAST_CONNECTION" "$BROADCAST_CONNECTION"
fi
if [ "$MAIL_DRIVER" != '' ]; then
replace_or_insert "MAIL_MAILER" "$MAIL_DRIVER"
replace_or_insert "MAIL_MAILER" "$MAIL_DRIVER"
fi
if [ "$MAIL_MAILER" != '' ]; then
replace_or_insert "MAIL_MAILER" "$MAIL_MAILER"
replace_or_insert "MAIL_MAILER" "$MAIL_MAILER"
fi
if [ "$MAIL_HOST" != '' ]; then
replace_or_insert "MAIL_HOST" "$MAIL_HOST"
replace_or_insert "MAIL_HOST" "$MAIL_HOST"
fi
if [ "$MAIL_PORT" != '' ]; then
replace_or_insert "MAIL_PORT" "$MAIL_PORT"
replace_or_insert "MAIL_PORT" "$MAIL_PORT"
fi
if [ "$MAIL_USERNAME" != '' ]; then
replace_or_insert "MAIL_USERNAME" "$MAIL_USERNAME"
replace_or_insert "MAIL_USERNAME" "$MAIL_USERNAME"
fi
if [ "$MAIL_PASSWORD" != '' ]; then
replace_or_insert "MAIL_PASSWORD" "$MAIL_PASSWORD"
replace_or_insert "MAIL_PASSWORD" "$MAIL_PASSWORD"
elif [ "$MAIL_PASSWORD_FILE" != '' ]; then
value=$(<$MAIL_PASSWORD_FILE)
replace_or_insert "MAIL_PASSWORD" "$value"
replace_or_insert "MAIL_PASSWORD" "$value"
fi
if [ "$MAIL_SCHEME" != '' ]; then
replace_or_insert "MAIL_SCHEME" "$MAIL_SCHEME"
replace_or_insert "MAIL_SCHEME" "$MAIL_SCHEME"
fi
if [ "$MAIL_FROM_NAME" != '' ]; then
replace_or_insert "MAIL_FROM_NAME" "$MAIL_FROM_NAME"
replace_or_insert "MAIL_FROM_NAME" "$MAIL_FROM_NAME"
fi
if [ "$MAIL_FROM_ADDRESS" != '' ]; then
replace_or_insert "MAIL_FROM_ADDRESS" "$MAIL_FROM_ADDRESS"
fi
if [ "$TRUSTED_PROXIES" != '' ]; then
replace_or_insert "TRUSTED_PROXIES" "$TRUSTED_PROXIES"
replace_or_insert "TRUSTED_PROXIES" "$TRUSTED_PROXIES"
fi
if [ "$SANCTUM_STATEFUL_DOMAINS" != '' ]; then
replace_or_insert "SANCTUM_STATEFUL_DOMAINS" "$SANCTUM_STATEFUL_DOMAINS"

View File

@@ -3,7 +3,7 @@
:title="$t('wizard.install_language.title')"
:description="$t('wizard.install_language.description')"
>
<div class="w-full md:w-2/3">
<div class="w-full">
<div class="mb-6">
<BaseInputGroup
:label="$t('wizard.language')"

View File

@@ -3,7 +3,7 @@
:title="$t('wizard.req.system_req')"
:description="$t('wizard.req.system_req_desc')"
>
<div class="w-full md:w-2/3">
<div class="w-full">
<div class="mb-6">
<div
v-if="phpSupportInfo"

View File

@@ -3,7 +3,7 @@
:title="$t('wizard.verify_domain.title')"
:description="$t('wizard.verify_domain.desc')"
>
<div class="w-full md:w-2/3">
<div class="w-full">
<BaseInputGroup
:label="$t('wizard.verify_domain.app_domain')"
:error="v$.app_domain.$error && v$.app_domain.$errors[0].$message"