diff --git a/.env b/.env new file mode 100644 index 00000000..d38b7b00 --- /dev/null +++ b/.env @@ -0,0 +1,19 @@ +DB_USERNAME=easyapp +DB_NAME=easyapp + +# before deploying to production change to harder password, and don't commit it to git +DB_PASSWORD=veryhardpassword + +# change to your installation address +APP_URL=localhost +APP_HOST=0.0.0.0 +APP_PORT=80 + +# email settings - set to 'smtp' and provide SMTP settings if you want to send emails +EMAIL_PROTOCOL=mail +SMTP_HOST=smtp.gmail.com +SMTP_USER=user +SMTP_PASS=password +SMTP_CRYPTO=ssl +SMTP_PORT=25 + diff --git a/Dockerfile b/Dockerfile index 2545f434..4c4b60f5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,14 @@ -FROM tutum/apache-php +FROM php:7.0-apache -MAINTAINER Alex Tselegidis +ENV PROJECT_DIR=/var/www/html \ + APP_URL=localhost -EXPOSE 80 +RUN docker-php-ext-install mysqli gettext + +COPY ./src $PROJECT_DIR +COPY docker-entrypoint.sh /entrypoint.sh + +VOLUME $PROJECT_DIR/storage + +ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] +CMD ["run"] diff --git a/README.md b/README.md index 15f925a5..3ac9d5f3 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,25 @@ If you have problems installing or configuring the application take a look on th You can also report problems on the [issues page](https://github.com/alextselegidis/easyappointments/issues) and help the development progress. +### Docker +To start Easy!Appointments using Docker in development configuration, with source files mounted into container, run: +``` +docker-compose up +``` + +Production deployment can be made by changing required values in .env file (DB_PASSWORD, APP_URL, APP_PORT) and running: +``` +docker-compose -f docker-compose.prod.yml up -d +``` + +Database data will be stored in named volume `easyappointments_easy-appointments-data`, and app storage (logs, cache, uploads) in `easyappointments_easy-appointments-storage`. +To find where exactly they are stored, you can run +``` +docker volume inspect easyappointments_easy-appointments-storage +``` + +Production containers will automatically be restarted in case of crash / server reboot. For more info, take a look into `docker-compose.prod.yml` file. + ### User Feedback Whether it is new ideas or defects, your feedback is highly appreciated and will be taken into consideration for the following releases of the project. Share your experience and discuss your diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 00000000..712bedf4 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,31 @@ +version: '2' +services: + database: + image: mysql + environment: + - MYSQL_ROOT_PASSWORD=${DB_PASSWORD} + - MYSQL_DATABASE=${DB_NAME} + - MYSQL_USER=${DB_USERNAME} + - MYSQL_PASSWORD=${DB_PASSWORD} + volumes: + - easy-appointments-data:/var/lib/mysql + restart: always + + + application: + image: easyappointments + build: + context: . + ports: + - 80:80 + environment: + - DB_HOST=database:3306 + env_file: + - .env + volumes: + - easy-appointments-storage:/var/www/html/src/storage + restart: always + +volumes: + easy-appointments-data: + easy-appointments-storage: diff --git a/docker-compose.yml b/docker-compose.yml index 7a63f0f1..cdc03837 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,23 +1,27 @@ -storage: - image: 'busybox:latest' - volumes: - - /var/lib/mysql - - ./src:/app - command: sleep 3153600000 -database: - image: mysql:5.7 - environment: - MYSQL_ROOT_PASSWORD: root - MYSQL_DATABASE: easyappointments - volumes_from: - - storage - restart: always - mem_limit: 200m -app: - build: ./ - ports: - - 80:80 - links: - - database:database - volumes_from: - - storage +version: '2' +services: + database: + image: mysql + environment: + - MYSQL_ROOT_PASSWORD=veryhardpassword + - MYSQL_DATABASE=easyapp + - MYSQL_USER=easyapp + - MYSQL_PASSWORD=veryhardpassword + + application: + image: easyappointments + build: + context: . + volumes: + - ./src:/var/www/html + command: dev + ports: + - ${APP_HOST}:80:80 + environment: + - DB_HOST=database:3306 + - APP_URL=localhost + depends_on: + - database + env_file: + - .env + restart: always diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 00000000..cf82c818 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env sh + +createAppSettings() { + cp $PROJECT_DIR/config-sample.php $PROJECT_DIR/config.php + sed -i "s/DB_HOST = ''/DB_HOST = '$DB_HOST'/g" $PROJECT_DIR/config.php + sed -i "s/DB_USERNAME = ''/DB_USERNAME = '$DB_USERNAME'/g" $PROJECT_DIR/config.php + sed -i "s/DB_PASSWORD = ''/DB_PASSWORD = '$DB_PASSWORD'/g" $PROJECT_DIR/config.php + sed -i "s/DB_NAME = ''/DB_NAME = '$DB_NAME'/g" $PROJECT_DIR/config.php + if [ "$EMAIL_PROTOCOL" = "smtp" ]; then + echo "Setting up email..." + sed -i "s/\$config\['protocol'\] = 'mail'/\$config['protocol'] = 'smtp'/g" $PROJECT_DIR/application/config/email.php + sed -i "s#// \$config\['smtp_host'\] = ''#\$config['smtp_host'] = '$SMTP_HOST'#g" $PROJECT_DIR/application/config/email.php + sed -i "s#// \$config\['smtp_user'\] = ''#\$config['smtp_user'] = '$SMTP_USER'#g" $PROJECT_DIR/application/config/email.php + sed -i "s#// \$config\['smtp_pass'\] = ''#\$config['smtp_pass'] = '$SMTP_PASS'#g" $PROJECT_DIR/application/config/email.php + sed -i "s#// \$config\['smtp_crypto'\] = 'ssl'#\$config['smtp_crypto'] = '$SMTP_CRYPTO'#g" $PROJECT_DIR/application/config/email.php + sed -i "s#// \$config\['smtp_port'\] = 25#\$config['smtp_port'] = $SMTP_PORT#g" $PROJECT_DIR/application/config/email.php + fi + sed -i "s/url-to-easyappointments-directory/$APP_URL/g" $PROJECT_DIR/config.php + + chown -R www-data $PROJECT_DIR +} + + +if [ "$1" = "run" ]; then + + echo "Preparing Easy!Appointments production configuration.." + + createAppSettings + + echo "Starting Easy!Appointments production server.." + + exec docker-php-entrypoint apache2-foreground + +elif [ "$1" = "dev" ]; then + + echo "Preparing Easy!Appointments development configuration.." + + + createAppSettings + sed -i "s/DEBUG_MODE = FALSE/DEBUG_MODE = TRUE/g" $PROJECT_DIR/config.php + + echo "Starting Easy!Appointments production server.." + + exec docker-php-entrypoint apache2-foreground +fi + +exec $@