Fix setup for development with docker (PR #523)
This commit is contained in:
parent
3b18dc7532
commit
5e4f3fb730
9 changed files with 241 additions and 190 deletions
39
Dockerfile-dev
Normal file
39
Dockerfile-dev
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
FROM ruby:2.3
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN deps='libmagic-dev xvfb qt5-default libqt5webkit5-dev gstreamer1.0-plugins-base gstreamer1.0-tools gstreamer1.0-x' && \
|
||||||
|
apt-get update && \
|
||||||
|
apt-get install --no-install-recommends -y $deps && \
|
||||||
|
rm -Rf /var/lib/apt/lists/* /var/cache/apt/*
|
||||||
|
|
||||||
|
ENV PORT=3000 \
|
||||||
|
SMTP_SERVER_PORT=2525 \
|
||||||
|
RAILS_ENV=development \
|
||||||
|
RAILS_LOG_TO_STDOUT=true \
|
||||||
|
RAILS_SERVE_STATIC_FILES=true \
|
||||||
|
\
|
||||||
|
BUNDLE_PATH=/home/app/bundle \
|
||||||
|
BUNDLE_APP_CONFIG=/home/app/bundle/config
|
||||||
|
|
||||||
|
# Run app and all commands as user 'app'. This avoids changing permissions
|
||||||
|
# for files in mounted volume. Symlink for similarity with production image.
|
||||||
|
RUN adduser --gecos GECOS --disabled-password --shell /bin/bash app && \
|
||||||
|
ln -s /home/app/src /usr/src/app
|
||||||
|
USER app
|
||||||
|
|
||||||
|
WORKDIR /home/app/src
|
||||||
|
|
||||||
|
# Copy files needed for installing gem dependencies, and install them.
|
||||||
|
COPY Gemfile Gemfile.lock ./
|
||||||
|
COPY plugins ./plugins
|
||||||
|
RUN bundle config build.nokogiri "--use-system-libraries" && \
|
||||||
|
bundle install -j 4
|
||||||
|
|
||||||
|
# Copy the application code
|
||||||
|
COPY . ./
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
# cleanup, and by default start web process from Procfile
|
||||||
|
ENTRYPOINT ["./docker-entrypoint.sh"]
|
||||||
|
CMD ["./proc-start", "web"]
|
2
bin/test
2
bin/test
|
@ -11,7 +11,7 @@ Xvfb $DISPLAY -nolisten tcp &
|
||||||
XVFB_PID=$!
|
XVFB_PID=$!
|
||||||
|
|
||||||
# Start tests
|
# Start tests
|
||||||
rspec
|
rspec $@
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
kill $XVFB_PID
|
kill $XVFB_PID
|
||||||
|
|
|
@ -1,60 +0,0 @@
|
||||||
# Deployment
|
|
||||||
|
|
||||||
## Docker
|
|
||||||
|
|
||||||
_This section is a work in progress._
|
|
||||||
|
|
||||||
### Build
|
|
||||||
|
|
||||||
To build the docker image, run:
|
|
||||||
|
|
||||||
docker build --tag foodsoft:dev --rm .
|
|
||||||
|
|
||||||
There is also an [official production docker image](https://hub.docker.com/r/foodcoops/foodsoft/),
|
|
||||||
which will let you avoid this step.
|
|
||||||
|
|
||||||
### Run (basic)
|
|
||||||
|
|
||||||
You'll need to set at least the following environment variables:
|
|
||||||
|
|
||||||
* `SECRET_KEY_BASE` - random string of 30+ characters, try `rake secret`
|
|
||||||
* `DATABASE_URL` - pointing to your MySQL installation (`mysql2://user:pass@mysql.host/foodsoftdb?encoding=utf8`)
|
|
||||||
* `REDIS_URL` - pointing to your Redis instance (`redis://redis.host:6379`)
|
|
||||||
|
|
||||||
You'll also need to supply the Foodsoft configuration file, for example by
|
|
||||||
mounting it as a volume. Copy `config/app_config.yml.SAMPLE` to `config/app_config.yml`
|
|
||||||
and customize the settings.
|
|
||||||
|
|
||||||
Then run the webserver, exposing port 3000 on the current host:
|
|
||||||
|
|
||||||
docker run --name foodsoft_web -p 3000 \
|
|
||||||
-e SECRET_KEY_BASE -e DATABASE_URL -e REDIS_URL -e RAILS_FORCE_SSL=false \
|
|
||||||
-v `pwd`/config/app_config.yml:/usr/src/app/config/app_config.yml:ro \
|
|
||||||
foodsoft:dev
|
|
||||||
|
|
||||||
This should get you started. But first you'll need to populate the database:
|
|
||||||
|
|
||||||
docker run --name foodsoft_setup --rm \
|
|
||||||
-e SECRET_KEY_BASE -e DATABASE_URL -e REDIS_URL \
|
|
||||||
-v `pwd`/config/app_config.yml:/usr/src/app/config/app_config.yml:ro \
|
|
||||||
foodsoft:dev bundle exec rake db:setup
|
|
||||||
|
|
||||||
To run the worker (recommended!), supply a different command
|
|
||||||
(see [Procfile](../Procfile) for other types):
|
|
||||||
|
|
||||||
docker run --name foodsoft_worker \
|
|
||||||
-e SECRET_KEY_BASE -e DATABASE_URL -e REDIS_URL \
|
|
||||||
-v `pwd`/config/app_config.yml:/usr/src/app/config/app_config.yml:ro \
|
|
||||||
foodsoft:dev ./proc-start worker
|
|
||||||
|
|
||||||
To also run the cronjobs, start the previous command but substituting
|
|
||||||
`mail` with `cron`. That should give you the ingredients for a production-setup.
|
|
||||||
With the help of a front-end webserver doing ssl, of course.
|
|
||||||
|
|
||||||
|
|
||||||
### Run (docker-compose)
|
|
||||||
|
|
||||||
In practice, you'd probably want to use docker-compose. If you know Docker well enough,
|
|
||||||
you'll have no problem to set this up. For inspiration, look at the
|
|
||||||
[foodcoops.net production setup](https://github.com/foodcoops/foodcoops.net).
|
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
Getting foodsoft running for development
|
# Getting Foodsoft running for development
|
||||||
========================================
|
|
||||||
|
|
||||||
Gratulations, if you read this file locally, you have successfully cloned the
|
Gratulations, if you read this file locally, you have successfully cloned the
|
||||||
foodsoft project from the git repository. Now you are only a few steps away
|
foodsoft project from the git repository. Now you are only a few steps away
|
||||||
from trying it out and then jumping into development.
|
from trying it out and then jumping into development.
|
||||||
|
|
||||||
This document describes how to setup Foodsoft for development on your local system.
|
This document describes how to setup Foodsoft for development within your local
|
||||||
Alternatively, you [run Foodsoft using Docker](SETUP_DOCKER.md). Or if you just want to
|
system. Another option is to use [docker for development](SETUP_DEVELOPMENT_DOCKER.md).
|
||||||
run Foodsoft without changing its code, the
|
If instead you just want to run Foodsoft without changing its code, please refer to
|
||||||
[Turnkey Linux Foodsoft appliance](http://www.turnkeylinux.org/foodsoft) may be useful.
|
[hosting](https://foodcoops.github.io/foodsoft-hosting/) or
|
||||||
|
[deployment](https://github.com/foodcoops/foodsoft/wiki/Deployment-notes).
|
||||||
|
|
||||||
**System requirements**:
|
**System requirements**:
|
||||||
[RVM](https://rvm.io/rvm/install),
|
[RVM](https://rvm.io/rvm/install),
|
||||||
|
@ -20,8 +19,7 @@ run Foodsoft without changing its code, the
|
||||||
**Optional**:
|
**Optional**:
|
||||||
[Redis](http://redis.io/).
|
[Redis](http://redis.io/).
|
||||||
|
|
||||||
Getting started
|
### Getting started
|
||||||
---------------
|
|
||||||
|
|
||||||
0. Clone the repository from GitHub:
|
0. Clone the repository from GitHub:
|
||||||
|
|
||||||
|
@ -100,9 +98,7 @@ Getting started
|
||||||
9. Have phun!
|
9. Have phun!
|
||||||
|
|
||||||
|
|
||||||
|
### Manual configuration
|
||||||
Manual configuration
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
The rake task `foodsoft:setup_development` helps you to setup foodsoft.
|
The rake task `foodsoft:setup_development` helps you to setup foodsoft.
|
||||||
If you want to have more control, you can do these steps manually as
|
If you want to have more control, you can do these steps manually as
|
||||||
|
@ -173,3 +169,13 @@ explained here.
|
||||||
From now on you have a smtp server listening on 1025. To see the emails go to
|
From now on you have a smtp server listening on 1025. To see the emails go to
|
||||||
|
|
||||||
http://localhost:1080
|
http://localhost:1080
|
||||||
|
|
||||||
|
|
||||||
|
## Docker
|
||||||
|
|
||||||
|
To avoid having to go through setting up all dependencies, you can also run Foodsoft
|
||||||
|
within a docker image. While the default [`Dockerfile`](../Dockerfile) is setup for production,
|
||||||
|
[`Dockerfile.dev`](../Dockerfile.dev) is meant for development. Even better, you can
|
||||||
|
use docker-compose (using [`docker-compose.dev.yml`](../docker-compose.dev.yml)) to
|
||||||
|
setup the whole stack at once.
|
||||||
|
|
||||||
|
|
82
doc/SETUP_DEVELOPMENT_DOCKER.md
Normal file
82
doc/SETUP_DEVELOPMENT_DOCKER.md
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
# Foodsoft on Docker
|
||||||
|
|
||||||
|
This document explains setting up Foodsoft with Docker for development.
|
||||||
|
system. Another option is to run it [within an existing system](SETUP_DEVELOPMENT.md).
|
||||||
|
If instead you just want to run Foodsoft without changing its code, please refer to
|
||||||
|
[hosting](https://foodcoops.github.io/foodsoft-hosting/) or
|
||||||
|
[deployment](https://github.com/foodcoops/foodsoft/wiki/Deployment-notes).
|
||||||
|
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
* Docker (=> 1.9.1)
|
||||||
|
* Docker Compose (=> 1.4)
|
||||||
|
* Nothing more, no Ruby, MySQL, Redis etc!
|
||||||
|
|
||||||
|
For installing instructions see https://docs.docker.com/installation/.
|
||||||
|
Docker runs on every modern Linux kernel, but also with a little help on MacOS
|
||||||
|
and Windows!
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Then setup foodsoft development (this will take some time, containers needs
|
||||||
|
to be pulled from docker registry and a lot dependencies needs to be installed)
|
||||||
|
|
||||||
|
docker-compose -f docker-compose-dev.yml run foodsoft rake foodsoft:setup_development
|
||||||
|
|
||||||
|
Do not enable mailcatcher, because this is already included as a docker image.
|
||||||
|
|
||||||
|
To avoid having to pass the `-f` argument all the time, it is recommended to setup
|
||||||
|
an alias, e.g. by adding the following line to your ~/.bashrc
|
||||||
|
|
||||||
|
alias docker-compose-dev='docker-compose -f docker-compose-dev.yml'
|
||||||
|
|
||||||
|
then reload it by executing `. ~/.bashrc`. Following commands assume this is setup.
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Start containers (in foreground, stop them with `Ctrl-C`)
|
||||||
|
|
||||||
|
docker-compose-dev up
|
||||||
|
|
||||||
|
Run a rails/rake command
|
||||||
|
|
||||||
|
docker-compose-dev run --rm foodsoft rake db:migrate
|
||||||
|
|
||||||
|
Open a rails console
|
||||||
|
|
||||||
|
docker-compose-dev run --rm foodsoft rails c
|
||||||
|
|
||||||
|
Setup the test database
|
||||||
|
|
||||||
|
docker-compose-dev run --rm foodsoft rake db:setup RAILS_ENV=test DATABASE_URL=mysql2://root:secret@mariadb/test
|
||||||
|
|
||||||
|
Run the tests
|
||||||
|
|
||||||
|
docker-compose-dev run --rm foodsoft ./bin/test
|
||||||
|
|
||||||
|
Jump in a running container for debugging.
|
||||||
|
|
||||||
|
docker exec -ti foodsoft_foodsoft_1 bash
|
||||||
|
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
### Receiving mails
|
||||||
|
|
||||||
|
Go to [http://localhost:1080](http://localhost:1080)
|
||||||
|
|
||||||
|
### Gemfile updates
|
||||||
|
|
||||||
|
As the gem bundle is stored in a volume, you can run
|
||||||
|
|
||||||
|
docker-compose-dev run foodsoft bundle install
|
||||||
|
docker-compose-dev restart foodsoft foodsoft_worker
|
||||||
|
|
||||||
|
Do this each time you update your `Gemfile`.
|
||||||
|
|
||||||
|
### Database configuration
|
||||||
|
|
||||||
|
To make this easier we use the environment variable `DATABASE_URL`
|
||||||
|
(and `TEST_DATABASE_URL` when using the testing script).
|
|
@ -1,66 +0,0 @@
|
||||||
# Foodsoft on Docker
|
|
||||||
|
|
||||||
This document explains setting up and using Foodsoft with Docker.
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
* Docker (=> 1.9.1)
|
|
||||||
* Docker Compose (=> 1.4)
|
|
||||||
* Nothing more, no ruby, mysql, redis etc!
|
|
||||||
|
|
||||||
For installing instructions see https://docs.docker.com/installation/.
|
|
||||||
Docker runs on every modern linux kernel, but also with a little help on MacOS
|
|
||||||
and Windows!
|
|
||||||
|
|
||||||
## Setup
|
|
||||||
|
|
||||||
Create docker volume for mysql data:
|
|
||||||
|
|
||||||
mkdir -p ~/.docker-volumes/foodsoft/mysql
|
|
||||||
|
|
||||||
Setup foodsoft development data: (This will take some time, containers needs
|
|
||||||
to be pulled from docker registry and a lot dependencies needs to be installed.)
|
|
||||||
|
|
||||||
docker-compose run app rake foodsoft:setup_development
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Start containers (in foreground, stop them with `CTRL-C`)
|
|
||||||
|
|
||||||
docker-compose up
|
|
||||||
|
|
||||||
Run a rails/rake command
|
|
||||||
|
|
||||||
docker-compose run app rake db:migrate
|
|
||||||
|
|
||||||
Open a rails console
|
|
||||||
|
|
||||||
docker-compose run app rails c
|
|
||||||
|
|
||||||
Setup the test database
|
|
||||||
|
|
||||||
docker-compose run app rake db:setup RAILS_ENV=test DATABASE_URL=mysql2://root:secret@mysql/test
|
|
||||||
|
|
||||||
Run the tests
|
|
||||||
|
|
||||||
docker-compose run app ./bin/test
|
|
||||||
|
|
||||||
Jump in a running container for debugging.
|
|
||||||
|
|
||||||
docker exec -ti foodsoft_app_1 bash
|
|
||||||
|
|
||||||
Receiving mails
|
|
||||||
|
|
||||||
Go to http://localhost:1080.
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
### Gemfile updates
|
|
||||||
|
|
||||||
As we use a special container (`bundle`, see `docker-compose.yml`) you only
|
|
||||||
have to run the bundle command as normally: `docker-compose run app bundle`
|
|
||||||
|
|
||||||
### Database configuration
|
|
||||||
|
|
||||||
To make this easier we use the environment variable `DATABASE_URL`
|
|
||||||
(and `TEST_DATABASE_URL` when using the testing script).
|
|
|
@ -1,9 +1,62 @@
|
||||||
Running Foodsoft in production
|
# Deployment
|
||||||
==============================
|
|
||||||
|
|
||||||
As you might have noticed, documentation is scarce and insufficient. If you
|
The recommended way to run Foodsoft in production is using docker. Alternative options are
|
||||||
intend to deploy foodsoft in production, we would love to guide you through the
|
discussed [in the wiki](https://github.com/foodcoops/foodsoft/wiki/Deployment-notes). If you
|
||||||
process. You can contact the mailing list
|
have any questions, please contact the mailing list [foodsoft-discuss](http://foodsoft.51229.x6.nabble.com/foodsoft-discuss-f5.html).
|
||||||
[foodsoft-discuss](http://foodsoft.51229.x6.nabble.com/foodsoft-discuss-f5.html).
|
|
||||||
|
## Docker
|
||||||
|
|
||||||
|
_This section is a work in progress._
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
You can use the [official production docker image](https://hub.docker.com/r/foodcoops/foodsoft/).
|
||||||
|
If you want to build the image yourself instead, run:
|
||||||
|
|
||||||
|
docker build --tag foodsoft:latest --rm .
|
||||||
|
|
||||||
|
### Run (basic)
|
||||||
|
|
||||||
|
You'll need to set at least the following environment variables:
|
||||||
|
|
||||||
|
* `SECRET_KEY_BASE` - random string of 30+ characters, try `rake secret`
|
||||||
|
* `DATABASE_URL` - pointing to your MySQL installation (`mysql2://user:pass@mysql.host/foodsoftdb?encoding=utf8`)
|
||||||
|
* `REDIS_URL` - pointing to your Redis instance (`redis://redis.host:6379`)
|
||||||
|
|
||||||
|
You'll also need to supply the Foodsoft configuration file, for example by
|
||||||
|
mounting it as a volume. Copy `config/app_config.yml.SAMPLE` to `config/app_config.yml`
|
||||||
|
and customize the settings.
|
||||||
|
|
||||||
|
Then run the webserver, exposing port 3000 on the current host:
|
||||||
|
|
||||||
|
docker run --name foodsoft_web -p 3000 \
|
||||||
|
-e SECRET_KEY_BASE -e DATABASE_URL -e REDIS_URL -e RAILS_FORCE_SSL=false \
|
||||||
|
-v `pwd`/config/app_config.yml:/usr/src/app/config/app_config.yml:ro \
|
||||||
|
foodsoft:latest
|
||||||
|
|
||||||
|
This should get you started. But first you'll need to populate the database:
|
||||||
|
|
||||||
|
docker run --name foodsoft_setup --rm \
|
||||||
|
-e SECRET_KEY_BASE -e DATABASE_URL -e REDIS_URL \
|
||||||
|
-v `pwd`/config/app_config.yml:/usr/src/app/config/app_config.yml:ro \
|
||||||
|
foodsoft:latest bundle exec rake db:setup
|
||||||
|
|
||||||
|
To run the worker (recommended!), supply a different command
|
||||||
|
(see [Procfile](../Procfile) for other types):
|
||||||
|
|
||||||
|
docker run --name foodsoft_worker \
|
||||||
|
-e SECRET_KEY_BASE -e DATABASE_URL -e REDIS_URL \
|
||||||
|
-v `pwd`/config/app_config.yml:/usr/src/app/config/app_config.yml:ro \
|
||||||
|
foodsoft:latest ./proc-start worker
|
||||||
|
|
||||||
|
To also run the cronjobs, start the previous command but substituting
|
||||||
|
`mail` with `cron`. That should give you the ingredients for a production-setup.
|
||||||
|
With the help of a front-end webserver doing ssl, of course.
|
||||||
|
|
||||||
|
|
||||||
|
### Run (docker-compose)
|
||||||
|
|
||||||
|
In practice, you'd probably want to use docker-compose. If you know Docker well enough,
|
||||||
|
you'll have no problem to set this up. For inspiration, look at the
|
||||||
|
[foodcoops.net production setup](https://github.com/foodcoops/foodcoops.net).
|
||||||
|
|
||||||
Please see our wiki page: [Deployment notes](https://github.com/foodcoops/foodsoft/wiki/Deployment-notes).
|
|
||||||
|
|
41
docker-compose-dev.yml
Normal file
41
docker-compose-dev.yml
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
|
||||||
|
foodsoft:
|
||||||
|
extends: foodsoft_worker
|
||||||
|
command: ./proc-start web
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
|
||||||
|
foodsoft_worker:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile-dev
|
||||||
|
command: ./proc-start worker
|
||||||
|
volumes:
|
||||||
|
- bundle:/home/app/bundle
|
||||||
|
- .:/home/app/src
|
||||||
|
environment:
|
||||||
|
- DATABASE_URL=mysql2://root:secret@mariadb/development?encoding=utf8
|
||||||
|
- REDIS_URL=redis://redis:6379
|
||||||
|
- QUEUE=foodsoft_notifier
|
||||||
|
- TEST_DATABASE_URL=mysql2://root:secret@mariadb/test?encoding=utf8
|
||||||
|
|
||||||
|
mailcatcher:
|
||||||
|
image: aboutsource/mailcatcher
|
||||||
|
ports:
|
||||||
|
- "1080:1080"
|
||||||
|
|
||||||
|
mariadb:
|
||||||
|
image: mariadb:10.1
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD=secret
|
||||||
|
volumes:
|
||||||
|
- mariadb:/var/lib/mysql
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:3.2-alpine
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
bundle:
|
||||||
|
mariadb:
|
|
@ -1,44 +0,0 @@
|
||||||
bundle:
|
|
||||||
image: foodsoft_app
|
|
||||||
command: /bin/true
|
|
||||||
volumes:
|
|
||||||
- /home/app/bundle
|
|
||||||
|
|
||||||
app: &app
|
|
||||||
build: .
|
|
||||||
command: bundle exec rails server --binding 0.0.0.0
|
|
||||||
volumes_from:
|
|
||||||
- bundle
|
|
||||||
volumes:
|
|
||||||
- .:/home/app/src
|
|
||||||
ports:
|
|
||||||
- "3000:3000"
|
|
||||||
links:
|
|
||||||
- mysql
|
|
||||||
- redis
|
|
||||||
- mailcatcher
|
|
||||||
environment:
|
|
||||||
- DATABASE_URL=mysql2://root:secret@mysql/development?encoding=utf8
|
|
||||||
- REDIS_URL=redis://redis:6379
|
|
||||||
- QUEUE=foodsoft_notifier
|
|
||||||
- TEST_DATABASE_URL=mysql2://root:secret@mysql/test?encoding=utf8
|
|
||||||
|
|
||||||
resque:
|
|
||||||
<<: *app
|
|
||||||
command: rake resque:work
|
|
||||||
ports: []
|
|
||||||
|
|
||||||
mailcatcher:
|
|
||||||
image: aboutsource/mailcatcher
|
|
||||||
ports:
|
|
||||||
- "1080:1080"
|
|
||||||
|
|
||||||
mysql:
|
|
||||||
image: mysql:5.5
|
|
||||||
volumes:
|
|
||||||
- ~/.docker-volumes/foodsoft/mysql:/var/lib/mysql
|
|
||||||
environment:
|
|
||||||
- MYSQL_ROOT_PASSWORD=secret
|
|
||||||
|
|
||||||
redis:
|
|
||||||
image: redis:2.8
|
|
Loading…
Reference in a new issue