Last active
February 21, 2019 14:31
-
-
Save andreslucena/e998518fe510918d5504fe8bab2c2d4b to your computer and use it in GitHub Desktop.
Decidim One Command Magick Installer v0.2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# | |
# Decidim installation script on Ubuntu 18.04 LTS | |
# It should also work on other Operating Systems that supports docker / docker-compose | |
# | |
# This is a BETA and as such you should be aware that this could break your environment (if you have any) | |
# This will use the docker image from Docker Hub and set-up a docker-compose environment for you to try Decidim | |
# It'll take 15 minutes depending on your network connection | |
# | |
# This is also proposal to merge to upstream, to fix the docker-compose/Dockerfile/README | |
# If this is merged then we don't need the copy-* functions | |
# | |
set -e # Exit script if anything fails | |
set -u # unset variables cause an error | |
set -o pipefail # https://coderwall.com/p/fkfaqq/safer-bash-scripts-with-set-euxo-pipefail | |
#set -x # for debugging each command | |
DECIDIM_VERSION=0.15.1 | |
RUBY_VERSION=2.5.3 | |
DOCKER_COMPOSE_VERSION=1.23.2 | |
SEEDS=true | |
APP_NAME=${@:-DemoApp} | |
export DEBIAN_FRONTEND="noninteractive" | |
function check_dependency { | |
command=$1 | |
if ! [ -x "$(command -v ${command})" ]; then | |
echo "Error: ${command} is not installed." >&2 | |
install_dependency ${command} | |
fi | |
} | |
function install_dependency { | |
dependency=$1 | |
case ${dependency} in | |
"docker") | |
# https://docs.docker.com/install/linux/docker-ce/ubuntu/ | |
sudo apt-get update -qq | |
sudo apt-get install -y \ | |
apt-transport-https \ | |
ca-certificates \ | |
curl \ | |
gnupg-agent \ | |
software-properties-common | |
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - | |
sudo add-apt-repository \ | |
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \ | |
$(lsb_release -cs) \ | |
stable" | |
sudo apt-get update -qq | |
sudo apt-get install -y docker-ce docker-ce-cli containerd.io | |
sudo gpasswd -a $USER docker | |
# reloads the group so we don't need to respawn other bash process | |
newgrp docker | |
# disables verbose docker pull images with | cat | |
docker run hello-world | cat | |
;; | |
"docker-compose") | |
# https://docs.docker.com/compose/install/ | |
sudo curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose | |
sudo chmod +x /usr/local/bin/docker-compose | |
;; | |
esac | |
} | |
function check_dependencies { | |
check_dependency docker | |
check_dependency docker-compose | |
} | |
function banner_decidim { | |
echo -e "\e[91m ████████ \e[0m" | |
echo -e "\e[91m ████████ \e[0m" | |
echo -e "\e[91m ████████ \e[0m" | |
echo -e "\e[91m ██████ ████████ \e[0m" | |
echo -e "\e[91m ███████ ████████ \e[0m" | |
echo -e "\e[91m ███████ ████████ \e[0m" | |
echo -e "\e[91m ███████ ████████ \e[0m" | |
echo -e "\e[91m ███████ ████████ ██ ██, :██ ██ \e[0m" | |
echo -e "\e[91m ███████ ████████ ██ :██ \e[0m" | |
echo -e "\e[91m ███████ ████████ ██████ ██████ ██████ ██████ ██ ███████ ██ ███████████ \e[0m" | |
echo -e "\e[91m ███████ ████████ ████████ ██ ██ ███████ ██ , ██ ,██ ███ ██ ██, ██ ██,\e[0m" | |
echo -e "\e[91m ███████ ████████ ████████ ██ ██ ██~ ██ ██ :██ ███ ██ ██, ██ ██,\e[0m" | |
echo -e "\e[91m ~██████ ████████ ██████ ██████ ██████ ██████ ██ ███████ ██ ██, ██ ██,\e[0m" | |
echo -e "\e[91m ,~ ~~ ~: ~ \e[0m" | |
} | |
function banner_start { | |
banner_decidim | |
echo " Welcome to Decidim installation" | |
echo " This is a BETA" | |
echo " This will install decidim on a new directory ==> ${APP_NAME}/" | |
echo " It'll take from 10 to 30 minutes depending on your network connection" | |
echo "************************************************************************************************" | |
echo "Starting on 5 seconds. Press CTRL+C to cancel" | |
sleep 5 | |
} | |
function banner_end { | |
banner_decidim | |
echo " Decidim installation process finished. All is OK!" | |
echo "************************************************************************************************" | |
echo " You can go to http://localhost:3000 and see the website." | |
echo " It'll take a few minutes to start up the first time. Be patient. " | |
if [ $SEEDS ] ; then | |
echo "************************************************************************************************" | |
echo " ------------------------------------------------------------------------------------------" | |
echo " | Email | Password | URL | Role |" | |
echo " ------------------------------------------------------------------------------------------" | |
echo " | [email protected] | decidim123456 | http://localhost:3000/session/new | Regular user |" | |
echo " | [email protected] | decidim123456 | http://localhost:3000/admin | Admin user |" | |
echo " ------------------------------------------------------------------------------------------" | |
fi | |
echo "************************************************************************************************" | |
echo " To stop the server you need to go to the new directory and stop docker-compose" | |
echo " cd ${APP_NAME} ; docker-compose down " | |
} | |
function bootstrap_docker_app { | |
# disables verbose docker pull images with | cat | |
docker run -v "$(pwd):/code" decidim/decidim:${DECIDIM_VERSION} ${APP_NAME} | cat | |
# FIXME: we shouldn't have to chown nor sudo :/ | |
sudo chown -R $(whoami): ${APP_NAME} | |
cd ${APP_NAME} | |
if ! [ -x "$(command -v git)" ]; then | |
git init | |
git add . | |
git commit -m "Initialized with Decidim v${DECIDIM_VERSION}" | |
fi | |
#echo 'gem "sidekiq", "~> 5.2" # if you want to enable worker' >> Gemfile | |
copy-env-file | |
copy-dockerfile | |
copy-docker-compose | |
copy-readme | |
docker-compose up -d | |
docker-compose run app rails db:create | |
docker-compose run app rails db:migrate | |
$SEEDS && docker-compose run app rails db:seed | |
} | |
function copy-readme { | |
# TODO: remove when it's on upstream decidim/decidim | |
cat <<EOF > README.md | |
# ${APP_NAME} | |
Free Open-Source participatory democracy, citizen participation and open government for cities and organizations | |
This is the open-source repository for ${APP_NAME}, based on [Decidim](https://decidim.org). | |
## Starting the application | |
\`````bash | |
docker-compose up -d | |
\````` | |
## Stoping the application | |
\`````bash | |
docker-compose down | |
\````` | |
## Upgrading | |
Update your Gemfile, where 0.16.0 is the [last published version](https://github.com/decidim/decidim/releases). | |
\`````ruby | |
DECIDIM_VERSION = "0.16.0" | |
gem "decidim", DECIDIM_VERSION | |
gem "decidim-dev", DECIDIM_VERSION | |
\````` | |
Run these commands to upgrade and make sure you get all the latest migrations: | |
\`````bash | |
docker-compose run app bundle update decidim | |
docker-compose run app rails decidim:upgrade | |
docker-compose run app rails db:migrate | |
\````` | |
## Setting up the application | |
### Development | |
For quick-starting on development environment, we recommend on using the demo data (seeds). You can use them with: | |
\`````bash | |
docker-compose run app rails db:seed | |
\````` | |
### Production | |
For production environment, you will want to start on a new database. | |
You will need to do some steps before having the app working properly once you've deployed it: | |
1. Open a Rails console in the server: \`bundle exec rails console\` | |
2. Create a System Admin user: | |
\`````ruby | |
user = Decidim::System::Admin.new(email: <email>, password: <password>, password_confirmation: <password>) | |
user.save! | |
\````` | |
3. Visit \`<your app url>/system\` and login with your system admin credentials | |
4. Create a new organization. Check the locales you want to use for that organization, and select a default locale. | |
5. Set the correct default host for the organization, otherwise the app will not work properly. Note that you need to include any subdomain you might be using. | |
6. Fill the rest of the form and submit it. | |
You're good to go! | |
## Documentation | |
* [Functions and Features](https://docs.decidim.org/features/en/general-description/) - How Decidim works, a detailed feature description, and the roadmap for 2017/2018. | |
* [Decidim’s Social Contract](https://docs.decidim.org/social-contract/en/social-contract/) - Code for democratic guarantees and open collaboration | |
* [Developers manual](https://docs.decidim.org/develop/en/introduction/) | |
* [Checklist](https://docs.decidim.org/develop/en/checklist/) | |
## Modules | |
TODO | |
## License | |
TODO | |
Happy Hacking! | |
EOF | |
} | |
function copy-dockerfile { | |
# TODO: remove when it's on upstream | |
cat <<EOF > Dockerfile | |
# Decidim Application Dockerfile | |
# | |
# This is an image to be used with docker-compose, to develop Decidim (https://decidim.org) locally. | |
# | |
# | |
# Starts with a clean ruby image from Debian (slim) | |
FROM ruby:${RUBY_VERSION} | |
# Installs system dependencies | |
ENV DEBIAN_FRONTEND noninteractive | |
RUN apt-get update -qq && apt-get install -y \\ | |
build-essential \\ | |
libpq-dev \\ | |
nodejs \\ | |
imagemagick | |
# Bleeding edge, I have some doubts with Alpine and glibc | |
## | |
## Starts with a clean ruby image from Alpine Linux | |
#FROM ruby:${RUBY_VERSION}-alpine | |
# | |
## Installs system dependencies | |
#RUN apk add --update --no-cache \\ | |
# build-base \\ | |
# file \\ | |
# imagemagick \\ | |
# libc6-compat \\ | |
# nodejs \\ | |
# postgresql-dev \\ | |
# tzdata \\ | |
# xz-libs | |
# Sets workdir as /app | |
RUN mkdir /app | |
WORKDIR /app | |
# Installs bundler dependencies | |
ENV BUNDLE_PATH=/app/vendor/bundle \\ | |
BUNDLE_BIN=/app/vendor/bundle/bin \\ | |
BUNDLE_JOBS=5 \\ | |
BUNDLE_RETRY=3 \\ | |
GEM_HOME=/bundle | |
ENV PATH="\${BUNDLE_BIN}:\${PATH}" | |
ADD Gemfile /app/Gemfile | |
ADD Gemfile.lock /app/Gemfile.lock | |
RUN bundle install | |
# Copy all the code to /app | |
ADD . /app | |
EOF | |
} | |
function copy-env-file { | |
# TODO: remove when it's on upstream | |
cat << EOF > .env | |
DATABASE_HOST=pg | |
DATABASE_PASSWORD= | |
DATABASE_PORT=5432 | |
#DATABASE_URL= | |
DATABASE_USERNAME=postgres | |
GEOCODER_LOOKUP_APP_CODE= | |
GEOCODER_LOOKUP_APP_ID= | |
OMNIAUTH_FACEBOOK_APP_ID= | |
OMNIAUTH_FACEBOOK_APP_SECRET= | |
OMNIAUTH_GOOGLE_CLIENT_ID= | |
OMNIAUTH_GOOGLE_CLIENT_SECRET= | |
OMNIAUTH_TWITTER_API_KEY= | |
OMNIAUTH_TWITTER_API_SECRET= | |
PORT=3000 | |
RAILS_ENV=development | |
RAILS_MAX_THREADS=5 | |
RAILS_SERVE_STATIC_FILES=false | |
REDIS_URL=redis://redis:6379 | |
SECRET_KEY_BASE= | |
SMTP_ADDRESS= | |
SMTP_DOMAIN= | |
SMTP_PASSWORD= | |
SMTP_USERNAME= | |
WEB_CONCURRENCY=2 | |
EOF | |
} | |
function copy-docker-compose { | |
# TODO: remove when it's on upstream | |
cat << EOF > docker-compose.yml | |
version: '3' | |
services: | |
app: | |
build: . | |
volumes: | |
- .:/app | |
- app_assets:/app/public/assets/ | |
- app_bundle:/app/vendor/bundle | |
- app_file_storage:/app/public/system/ | |
- app_logs:/app/logs/ | |
ports: | |
- 3000:3000 | |
links: | |
- pg | |
command: bundle exec puma | |
depends_on: | |
- pg | |
- redis | |
env_file: .env | |
#worker: | |
# build: . | |
# volumes: | |
# - .:/app | |
# - app_assets:/app/public/assets/ | |
# - app_bundle:/app/vendor/bundle | |
# - app_file_storage:/app/public/system/ | |
# - app_logs:/app/logs/ | |
# links: | |
# - pg | |
# - redis | |
# command: bundle exec sidekiq | |
# depends_on: | |
# - pg | |
# - redis | |
# env_file: .env | |
pg: | |
image: postgres | |
restart: always | |
volumes: | |
- pg-data:/var/lib/postgresql/data | |
redis: | |
image: redis | |
restart: always | |
volumes: | |
- redis-data:/data | |
volumes: | |
app_assets: {} | |
app_bundle: {} | |
app_file_storage: {} | |
app_logs: {} | |
pg-data: {} | |
redis-data: {} | |
EOF | |
} | |
function main { | |
banner_start | |
check_dependencies | |
bootstrap_docker_app | |
banner_end | |
} | |
main |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
You can use it with these commands:
Dependencies:
If you want to do it on a virtual machine, you can execute this with a Vagrantfile like:
And executing: