Merge pull request #52 from investbrainapp/optimize-dockerfile

Optimize Docker Image
This commit is contained in:
hackerESQ
2025-01-26 21:59:56 -06:00
committed by GitHub
15 changed files with 834 additions and 549 deletions
+7 -1
View File
@@ -7,4 +7,10 @@ tests
.DS_Store
vapor.yml
.vapor
storage
storage/app/livewire-tmp/*
storage/app/public/profile-photos/*
storage/framework/cache/*
storage/framework/sessions/*
storage/framework/testing/*
storage/framework/views/*
storage/framework/logs/*
+24 -9
View File
@@ -1,24 +1,35 @@
APP_NAME=Investbrain
APP_ENV=production
# Generate a secure key using `openssl rand -base64 32`
APP_KEY=
APP_DEBUG=true
APP_TIMEZONE=UTC
# Port for NGINX to listen on
APP_PORT=8000
# Used internally to generate absolute links
APP_URL="http://localhost:${APP_PORT}"
SELF_HOSTED=true
# Webroot for static assets (css, js, images, etc)
ASSET_URL="${APP_URL}"
# Enables or disables new user registration
REGISTRATION_ENABLED=true
# ASSET_URL="http://localhost:8000" # (optional) webroot for static assets (css, js, images, etc)
# Enable or disable AI chat feature
AI_CHAT_ENABLED=false
# API key for OpenAI (for Llama support, see docs)
OPENAI_API_KEY=
OPENAI_ORGANIZATION=
# Market data provider to use (comma separated list)
MARKET_DATA_PROVIDER=yahoo
MARKET_DATA_REFRESH=30
ALPHAVANTAGE_API_KEY=
FINNHUB_API_KEY=
# Cadence to refresh market data (in minutes)
MARKET_DATA_REFRESH=30
DAILY_CHANGE_TIME=
#### Advanced configurations ####
ENABLED_LOGIN_PROVIDERS=
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
@@ -29,9 +40,13 @@ LINKEDIN_CLIENT_SECRET=
FACEBOOK_CLIENT_ID=
FACEBOOK_CLIENT_SECRET=
APP_NAME=Investbrain
APP_TIMEZONE=UTC
APP_ENV=production
APP_DEBUG=true
APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US
SELF_HOSTED=true
DB_CONNECTION=mysql
DB_HOST=investbrain-mysql
+14 -13
View File
@@ -32,27 +32,27 @@ Investbrain is a Laravel PHP web application that leverages Livewire and Tailwin
## Self hosting
For ease of installation, we _highly recommend_ installing Investbrain using the provided [Docker Compose](https://github.com/investbrainapp/investbrain/blob/main/docker-compose.yml) file, which downloads all the necessary dependencies and seamlessly builds everything you need to get started quickly!
For ease of installation, we _highly recommend_ installing Investbrain using the provided [Docker Compose](https://github.com/investbrainapp/investbrain/blob/main/docker-compose.yml) file, which uses the official Investbrain Docker image and includes all the necessary dependencies to seamlessly build everything you need to get started quickly!
Before getting started, you should already have the following installed on your machine: [Docker Engine](https://docs.docker.com/engine/install/), [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git), and a wild sense of adventure.
Before getting started, you should already have [Docker Engine](https://docs.docker.com/engine/install/) installed on your machine.
Ready? Let's get started!
First, you can clone this repository:
**1. Copy Docker Compose file**
```bash
git clone https://github.com/investbrainapp/investbrain.git && cd investbrain
```
Grab a copy of the [docker-compose.yml](https://github.com/investbrainapp/investbrain/blob/main/docker-compose.yml)** file and paste the contents into the directory where you plan to install Investbrain.
Then, build the Docker image and bring up the container (this will take a few minutes):
**2. Set your environment**
```bash
docker compose up
```
Adjust the `environment` properties in the Docker Compose file to your preferences.
In the previous step, all of the default configurations are set automatically. This includes creating a .env file and setting the required Laravel `APP_KEY`.
_Particularly_, you need to set the `APP_KEY` value to a complex random value. If you're unsure, you can run `openssl rand -base64 32` from your terminal to generate a strong application key.
If everything worked as expected, you should now be able to access Investbrain in the browser at. You should create an account by visiting:
> Tip: Want to know what options are available? You can reference the [.env.example](https://github.com/investbrainapp/investbrain/blob/main/.env.example) file in this respository for available environment configurations.
**3. Run `docker compose up`**
This might take a few minutes. But if everything worked as expected, you should now be able to access Investbrain in the browser by visiting:
```bash
http://localhost:8000/register
@@ -135,6 +135,7 @@ There are several optional configurations available when installing using the re
| ------------- | ------------- | ------------- |
| APP_URL | The URL where your Investbrain installation will be accessible | http://localhost |
| APP_PORT | The HTTP port exposed by the NGINX container | 8000 |
| APP_KEY | Must be set during install - encryption key for various security-related functions | `null` |
| MARKET_DATA_PROVIDER | The market data provider to use (either `yahoo`, `alphavantage`, or `finnhub`) | yahoo |
| ALPHAVANTAGE_API_KEY | If using the Alpha Vantage provider | `null` |
| FINNHUB_API_KEY | If using the Finnhub provider | `null` |
@@ -149,7 +150,7 @@ There are several optional configurations available when installing using the re
| REGISTRATION_ENABLED | Whether to enable registration of new users | `true` |
> Note: These options affect the [docker-compose.yml](https://github.com/investbrainapp/investbrain/blob/main/docker-compose.yml) file, so if you decide to make any changes to these default configurations, you'll have to restart the Docker containers before your changes take effect.
> Note: These options affect the [docker-compose.yml](https://github.com/investbrainapp/investbrain/blob/main/docker-compose.yml) file and are cached during run-time. If change any .env values, you'll have to restart the containers before your changes take effect.
## Updating
+4 -1
View File
@@ -5,7 +5,10 @@
"keywords": ["stocks", "dividends", "investments", "tracking"],
"license": "CC-BY-NC 4.0",
"require": {
"php": "^8.2",
"php": "^8.3",
"ext-gd": "*",
"ext-mbstring": "*",
"ext-zip": "*",
"finnhub/client": "master@dev",
"laravel/framework": "^11.35",
"laravel/jetstream": "^5.1",
Generated
+200 -193
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -13,7 +13,7 @@ return [
|
*/
'name' => env('APP_NAME', 'Laravel'),
'name' => env('APP_NAME', 'Investbrain'),
/*
|--------------------------------------------------------------------------
+1 -1
View File
@@ -143,7 +143,7 @@ return [
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'client' => env('REDIS_CLIENT', 'predis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
+1 -1
View File
@@ -110,7 +110,7 @@ return [
'from' => [
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
'name' => env('MAIL_FROM_NAME', 'Example'),
'name' => env('MAIL_FROM_NAME', 'Investbrain'),
],
];
+19 -18
View File
@@ -7,10 +7,24 @@ services:
container_name: investbrain-app
restart: unless-stopped
tty: true
expose:
- "9000"
ports:
- "${APP_PORT:-8000}:80"
environment:
- APP_KEY= # Generate a key using `openssl rand -base64 32`
- APP_URL="http://localhost:8000"
- ASSET_URL="http://localhost:8000"
- DB_CONNECTION=mysql
- DB_HOST=investbrain-mysql
- DB_PORT=3306
- DB_DATABASE=investbrain
- DB_USERNAME=investbrain
- DB_PASSWORD=investbrain
- SESSION_DRIVER=redis
- QUEUE_CONNECTION=redis
- CACHE_STORE=redis
- REDIS_HOST=investbrain-redis
volumes:
- .:/var/www/app:delegated
- ./storage:/var/www/app/storage:delegated
depends_on:
- mysql
- redis
@@ -25,20 +39,6 @@ services:
- investbrain-network
volumes:
- investbrain-redis:/data
nginx:
image: nginx:alpine
container_name: investbrain-nginx
restart: unless-stopped
tty: true
ports:
- "${APP_PORT:-8000}:80"
volumes:
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
- .:/var/www/app:delegated
depends_on:
- app
networks:
- investbrain-network
mysql:
image: mysql:8.0
container_name: investbrain-mysql
@@ -48,8 +48,9 @@ services:
MYSQL_USER: ${DB_USERNAME:-investbrain}
MYSQL_PASSWORD: ${DB_PASSWORD:-investbrain}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-investbrain}
command:
- --cte-max-recursion-depth=25000
volumes:
- ./docker/mysql.conf:/etc/mysql/conf.d/my.cnf
- investbrain-mysql:/var/lib/mysql
networks:
- investbrain-network
+38 -24
View File
@@ -1,45 +1,59 @@
FROM php:8.3-fpm
ENV DEBIAN_FRONTEND=noninteractive
ENV APP_NAME=Investbrain
ENV VITE_APP_NAME=Investbrain
ENV APP_DEBUG=true
ENV SELF_HOSTED=true
# Set the working directory
COPY . /var/www/app
WORKDIR /var/www/app
# Set permissions
RUN chown -R www-data:www-data . \
&& chmod -R 775 ./storage \
&& chmod +x ./docker/entrypoint.sh \
# Install common php extension dependencies
&& apt-get update && apt-get install -y \
RUN apt-get update && apt-get install -y \
nginx \
libfreetype-dev \
libjpeg62-turbo-dev \
libpng-dev \
zlib1g-dev \
libzip-dev \
unzip \
libicu-dev \
git \
curl \
libpq-dev \
supervisor \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) \
gd \
zip \
pdo_mysql \
mysqli \
intl \
# Install Node.js and npm
&& curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
&& apt-get install -y nodejs \
&& npm install -g npm@latest
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) \
gd pgsql bcmath zip pdo_mysql mysqli intl \
&& apt-get -y autoremove \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Copy over supervisor configuration
# Set permissions
RUN chown -R www-data:www-data . \
&& chmod -R 775 ./storage \
&& chmod +x ./docker/entrypoint.sh \
&& usermod -s /bin/bash www-data
# Install Composer and Node.js
RUN apt-get update && apt-get install -y \
curl \
unzip \
git \
nodejs \
npm \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Install PHP dependencies and build front end assets
RUN composer install --no-scripts --optimize-autoloader \
&& npm install && npm run build
# Remove default nginx config
RUN rm /etc/nginx/sites-enabled/default
# Copy over configs
COPY ./docker/nginx.conf /etc/nginx/conf.d/default.conf
COPY ./docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# Install composer
COPY --from=composer:2.6.5 /usr/bin/composer /usr/local/bin/composer
# Serve on port 80
EXPOSE 80
@@ -48,4 +62,4 @@ HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD curl -f http://localhos
# Run everything else
ENTRYPOINT ["/bin/bash", "./docker/entrypoint.sh"]
CMD ["./docker/entrypoint.sh"]
+33 -30
View File
@@ -2,53 +2,56 @@
cd /var/www/app
echo -e "\n====================== Running entrypoint script... ====================== "
if [ ! -f ".env" ]; then
echo " > Ope, gotta create an .env file!"
cp .env.example .env
fi
echo -e "\n====================== Installing Composer dependencies... ====================== "
/usr/local/bin/composer install
echo -e "\n====================== Validating environment... ====================== "
if [ $(stat -c '%U' .) != "www-data" ]; then
echo " > Setting correct permissions for pwd..."
chown -R www-data:www-data .
if [[ -z "$APP_KEY" ]]; then
echo -e "\n > Oops! The required APP_KEY configuration is missing in your environment! "
echo -e "\n > Generating a key (see below) but this will NOT be persisted between container restarts. "
echo -e "\n > You should set this APP_KEY in your .env file! "
draw_box() {
local text="$1"
local length=${#text}
local border=$(printf '%*s' "$((length + 4))" | tr ' ' '*')
echo -e "\n\n$border"
echo "* $text *"
echo "$border"
}
export APP_KEY=base64:$(openssl rand -base64 32)
draw_box $APP_KEY
fi
if ( ! grep -q "^APP_KEY=" ".env" || grep -q "^APP_KEY=$" ".env"); then
echo " > Ah, APP_KEY is missing in .env file. Generating a new key!"
/usr/local/bin/php artisan key:generate --force
fi
for dir in storage/framework/cache storage/framework/sessions storage/framework/views; do
if [ ! -d "$dir" ]; then
echo -e "\n > $dir is missing. Creating scaffold for storage directory... "
mkdir -p storage/framework/{cache,sessions,views}
chmod -R 775 storage
chown -R www-data:www-data storage
fi
done
if [ ! -L "public/storage" ]; then
echo " > Creating symbolic link for app public storage..."
echo -e "\n > Creating symbolic link for app public storage... "
/usr/local/bin/php artisan storage:link
/usr/local/bin/php /var/www/app/artisan storage:link
fi
echo -e "\n====================== Installing NPM dependencies and building frontend... ====================== "
/usr/bin/npm install
/usr/bin/npm run build
echo -e "\n====================== Running migrations... ====================== "
run_migrations() {
/usr/local/bin/php artisan migrate --force
/usr/local/bin/php /var/www/app/artisan migrate --force
}
RETRIES=30
RETRIES=10
DELAY=5
until run_migrations; do
RETRIES=$((RETRIES-1))
if [ $RETRIES -le 0 ]; then
echo " > Database is not ready after multiple attempts. Exiting..."
echo -e "\n > Database is not ready after $RETRIES attempts. Exiting... "
exit 1
fi
echo " > Waiting for database to be ready... retrying in $DELAY seconds."
echo -e "\n > Waiting for database to be ready... retrying in $DELAY seconds. "
sleep $DELAY
done
echo -e "\n====================== Spinning up Supervisor daemon... ====================== "
exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
echo -e "\n====================== Spinning up Supervisor daemon... ====================== \n"
exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
-2
View File
@@ -1,2 +0,0 @@
[mysqld]
cte_max_recursion_depth = 25000
+1 -1
View File
@@ -14,7 +14,7 @@ server {
fastcgi_param HTTPS $http_x_forwarded_proto;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass investbrain-app:9000;
fastcgi_pass 127.0.0.1:9000;
}
location ~ /\.ht {
+11 -11
View File
@@ -1,34 +1,34 @@
[supervisord]
nodaemon=true
user=root
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
[program:nginx]
command=nginx -g 'daemon off;'
autostart=true
autorestart=true
redirect_stderr=true
redirect_stdout=true
[program:php]
command=php-fpm -F
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/php.log
stderr_logfile=/var/log/supervisor/php_error.log
redirect_stderr=true
redirect_stdout=true
[program:scheduler]
command=php artisan schedule:work
autorestart=true
redirect_stderr=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
redirect_stdout=true
[program:queue-worker]
command=php artisan queue:work --sleep=3 --tries=1 --memory=256 --timeout=3600
process_name=%(program_name)s_%(process_num)02d
autorestart=true
redirect_stderr=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
redirect_stdout=true
numprocs=2
[supervisorctl]
+480 -243
View File
File diff suppressed because it is too large Load Diff