Docker
Pull and run Apphold using the official Docker image from Docker Hub. The image is built on PHP 8.2 with Apache and automatically generates the Laravel .env file from Docker environment variables, runs database migrations, and caches the configuration on startup.
Prerequisites
- Docker installed on your computer
Quick Start
Start a MySQL instance and then pull and run the Apphold image:
# Start a MySQL instance
docker run -d --name apphold-db \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=apphold \
mysql:8.0
# Pull and run the app
docker run -d --name apphold-app \
--link apphold-db:db \
-p 80:80 \
-e APP_URL=http://localhost \
-e DB_HOST=db \
-e DB_DATABASE=apphold \
-e DB_USERNAME=root \
-e DB_PASSWORD=secret \
alextselegidis/apphold:latest Docker Compose
You can use the following docker-compose.yml file to set up Apphold with a MySQL database:
services:
apphold:
image: alextselegidis/apphold:latest
restart: always
ports:
- '80:80'
environment:
- APP_NAME=Apphold
- APP_ENV=production
- APP_DEBUG=false
- APP_URL=http://localhost
- DB_CONNECTION=mysql
- DB_HOST=mysql
- DB_PORT=3306
- DB_DATABASE=apphold
- DB_USERNAME=root
- DB_PASSWORD=secret
- MAIL_MAILER=smtp
- MAIL_HOST=smtp.example.org
- MAIL_PORT=587
- MAIL_USERNAME=
- MAIL_PASSWORD=
- MAIL_ENCRYPTION=tls
- MAIL_FROM_ADDRESS=info@example.org
- MAIL_FROM_NAME=Apphold
volumes:
- apphold-storage:/var/www/html/storage
mysql:
image: mysql:8.0
restart: always
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_DATABASE=apphold
volumes:
- mysql:/var/lib/mysql
volumes:
apphold-storage:
mysql: Environment Variables
The Docker image uses standard Laravel environment variables. All variables are passed through to the .env file that is generated on container startup.
Application
| Variable | Default | Description |
|---|---|---|
APP_NAME | Apphold | Application name |
APP_ENV | production | Application environment (production, local, testing) |
APP_KEY | (auto-generated) | Application encryption key. If left empty, one is generated automatically on first start |
APP_DEBUG | false | Enable debug mode (true / false) |
APP_URL | http://localhost | The public URL of the application |
Logging
| Variable | Default | Description |
|---|---|---|
LOG_CHANNEL | stack | Laravel log channel (stack, single, daily, stderr, etc.) |
LOG_LEVEL | error | Minimum log level (debug, info, notice, warning, error, critical) |
Database
| Variable | Default | Description |
|---|---|---|
DB_CONNECTION | mysql | Database driver (mysql, pgsql, sqlite) |
DB_HOST | db | Database hostname |
DB_PORT | 3306 | Database port |
DB_DATABASE | apphold | Database name |
DB_USERNAME | root | Database username |
DB_PASSWORD | secret | Database password |
Cache & Session
| Variable | Default | Description |
|---|---|---|
CACHE_DRIVER | file | Cache driver (file, redis, memcached, database) |
SESSION_DRIVER | file | Session driver (file, redis, database, cookie) |
SESSION_LIFETIME | 120 | Session lifetime in minutes |
QUEUE_CONNECTION | sync | Queue connection (sync, redis, database) |
BROADCAST_DRIVER | log | Broadcast driver (log, redis, pusher) |
FILESYSTEM_DISK | local | Default filesystem disk |
Redis
| Variable | Default | Description |
|---|---|---|
REDIS_HOST | 127.0.0.1 | Redis hostname |
REDIS_PASSWORD | null | Redis password |
REDIS_PORT | 6379 | Redis port |
| Variable | Default | Description |
|---|---|---|
MAIL_MAILER | smtp | Mail driver (smtp, sendmail, mailgun, ses, log) |
MAIL_HOST | mailpit | SMTP hostname |
MAIL_PORT | 1025 | SMTP port |
MAIL_USERNAME | null | SMTP username |
MAIL_PASSWORD | null | SMTP password |
MAIL_ENCRYPTION | null | SMTP encryption (tls, ssl, or null) |
MAIL_FROM_ADDRESS | hello@example.com | Sender email address |
MAIL_FROM_NAME | Apphold | Sender name |
Startup Behavior
On every container start the entrypoint script will:
- Generate the Laravel
.envfile from the Docker environment variables. - Set correct permissions on
storage/andbootstrap/cache/. - Auto-generate an
APP_KEYif one was not provided. - Run
php artisan migrate --forceto apply pending database migrations. - Create the
storage:linksymbolic link. - Cache configuration, routes, and views for performance.
- Start the Apache web server.
Need Help?
If you run into issues with Docker:
- Check the Troubleshooting guide
- Ask in our Discord community
- Open an issue on GitHub