Here is what worked for me to install Discourse on an isolated CentOS 7 server. In a nutshell, on a machine with internet access I prepared:
- the Git repos that Discourse setup needs:
- the two Docker images:
- the complete Ruby Gem cache that
bundle installdownloads during bootstrap.
I copied these to the isolated server, and used them to install offline; below are the full details.I hope this helps.
1. Preparation on a machine with internet access
With Docker-CE and Git installed, run these commands:
mkdir -p ~/local/github.com mkdir -p ~/local/rubygems.org mkdir -p ~/local/docker-images # 1 git clone --bare https://github.com/SamSaffron/pups.git ~/local/github.com/SamSaffron/pups.git git clone --bare https://github.com/discourse/discourse.git ~/local/github.com/discourse/discourse.git git clone --bare https://github.com/discourse/discourse_docker.git ~/local/github.com/discourse/discourse_docker.git git clone --bare https://github.com/discourse/docker_manager.git ~/local/github.com/discourse/docker_manager.git #2 sudo mkdir -p /var/discourse sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse
Step #1 clones the required Discourse GitHub repositories locally.
Step #2 prepares for the local installation of Discourse, which must run once, to extract Ruby GEMs from the Discourse image (step #4 below).
/var/discourse/launcher to find the line starting with
Two Docker images are needed:
discourse/base with the version above, and
docker-gc. To get them locally, run:
#3 docker pull discourse/base:2.0.20171008 docker pull samsaffron/docker-gc docker save -o ~/local/docker-images/discourse_base discourse/base:2.0.20171008 docker save -o ~/local/docker-images/docker-gc samsaffron/docker-gc
Step #3 downloads the images and exports them to files under
~/local folder now has local copies of the Discourse code, and Docker images required for installation.
However, local copies of the Ruby GEMs that Discourse downloads as part of its bootstrap process are still needed. IMHO it would be much easier if they were just included in the
discourse/base Docker image.
Discourse needs to be bootstrapped to get these files. Follow the official instructions, but stop at the Start Discourse step. That is, configure and bootstrap Discourse, up to the point where the Docker container
local_discourse/app is created.
Then run the following commands:
# 4 docker run -it -v ~/local/rubygems.org:/local-rubygems local_discourse/app /bin/bash # the commands below run inside the Discourse 'app' container cp -r /var/www/discourse/vendor/bundle/ruby /local-rubygems exit
Step #4 copies the full Ruby GEM cache out of the Discourse image into the
Now everything required to set up Discourse offline is available in the
~/local folder. Copy this folder to the target machine.
2. Install Discourse on the target machine, with no internet access
~/local folder prepared above to the target machine that has no internet access, e.g. to
You will need to be
root through the rest of the setup and bootstrap process:
Import the two Docker images:
docker load -i /root/local/docker-images/discourse_base docker load -i /root/local/docker-images/docker-gc
Configure Git to use the
/root/local/github.com/ folder instead of going out to
git config --global url."file:///root/local/github.com/".insteadOf https://github.com/
Create the Discourse folder and clone
mkdir -p /var/discourse git clone https://github.com/discourse/discourse_docker.git /var/discourse/
./discourse-setup to generate your Discourse configuration. At the end of the configuration process, when you see the message Updates successful. Rebuilding in 5 seconds., press
cd /var/discourse/ ./discourse-setup
/var/discourse/launcher file and disable updating
pups (the version bundled with Discourse will be used instead), changing from:
if [[ ! "false" = $update_pups ]]; then run_command="$run_command git pull &&" fi
# if [[ ! "false" = $update_pups ]]; then # run_command="$run_command git pull &&" # fi
/var/discourse/containers/app.yml file and update the
volumes section as follows:
volumes: # these two volumes are already defined - volume: host: /var/discourse/shared/standalone guest: /shared - volume: host: /var/discourse/shared/standalone/log/var-log guest: /var/log # ADD THE TWO VOLUMES BELOW, making the local copies of github.com repos and Ruby GEM cache # available inside the Discourse container when it is built - volume: host: /root/local/github.com guest: /local-github.com - volume: host: /root/local/rubygems.org guest: /local-rubygems.org
This makes the local GitHub repo clones, and the Ruby GEM cache, available to the Discourse container.
/var/discourse/templates/web.template.yml file, and make the following changes.
(1) Disable updating Bundler (using the version bundled with Discourse instead) by commenting-out the
gem update bundler line, from:
- exec: cd: $home hook: web cmd: # ensure we are on latest bundler - gem update bundler - chown -R discourse $home
- exec: cd: $home hook: web cmd: # ensure we are on latest bundler #- gem update bundler - git config --global url."file:///local-github.com/".insteadOf https://github.com/ - chown -R discourse $home
Instead of updating bundler, Git (the one inside the container) is configured to use the local folder instead of going out to
bundle install to use the local Ruby GEM cache and not connect to
rubygems.org by changing these lines from:
- exec: cd: $home hook: bundle_exec cmd: - su discourse -c 'bundle install --deployment --verbose --without test --without development' - su discourse -c 'bundle exec rake db:migrate' - su discourse -c 'bundle exec rake assets:precompile'
- exec: cd: $home hook: bundle_exec cmd: # copy the locally-cached Ruby GEMS to /var/www/discourse/vendor/... - cp -rv /local-rubygems.org/ $home/vendor/bundle/ruby/ # install GEMs from local cache only, using `--local` (see http://bundler.io/v1.15/bundle_install.html) - su discourse -c 'bundle install --local --deployment --verbose --without test --without development' - su discourse -c 'bundle exec rake db:migrate' - su discourse -c 'bundle exec rake assets:precompile'
And that’s it. Run
./launcher bootstrap app and, hopefully, enjoy your offline Discourse!