1
0
mirror of https://gitlab.com/depesz/explain.depesz.com.git synced 2024-11-30 09:06:42 +02:00

Merge branch 'master' into 'master'

Re-issue of merge request #10 after rebase

See merge request depesz/explain.depesz.com!11
This commit is contained in:
Hubert Lubaczewski 2018-08-27 06:05:32 +00:00
commit 6ef3a11b46
4 changed files with 127 additions and 48 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
log
explain.production.json
.vagrant

View File

@ -6,9 +6,9 @@ Setup
There are three ways to install your own copy:
* Using Vagrant [ VirtualBox machine, fully automated ]
* Calling `puppet apply`
* Manually
1. Using Vagrant [ VirtualBox machine, fully automated ]
1. Calling `puppet apply`
1. Manually
First get the source code:
@ -16,7 +16,8 @@ First get the source code:
## Vagrant setup
WARNING: first call `vagrant up` fetches ~400MB of vbox image from the Internet.
*WARNING:*
The first call of `vagrant up` fetches a ~400MB vbox image from the Internet.
1. Call `vagrant up`
@ -25,23 +26,23 @@ Point your browser on http://192.168.44.55 (or use `/etc/hosts` entry explain.de
## Puppet setup
1. Install puppet on your machine, e.g. Debian installation described [here](https://docs.puppetlabs.com/guides/install_puppet/install_debian_ubuntu.html).
2. Open explain.pp and fix line 5 with correct project dir value
3. Call `sudo puppet apply --logdest console explain.pp` on your working copy directory.
1. Open `explain.pp` and fix line 5 with correct project dir value
1. Call `sudo puppet apply --logdest console explain.pp` on your working copy directory.
## Manual setup
1) Mojolicious
You have to have Mojolicious installed on your server. Mojolicious is a web framework for Perl.
### 1) Mojolicious
You have to have Mojolicious installed on your server.
Mojolicious is a web framework for Perl.
http://mojolicio.us/
Installation can be accomplished with one command line:
curl -L cpanmin.us | perl - -n Mojolicious
See the "Installation" section at http://mojolicio.us/ for details.
See the `Installation` section at http://mojolicio.us/ for details.
2) Perl Dependencies:
### 2) Perl Dependencies:
You will need the following packages installed in your version of Perl:
DBD::Pg
@ -51,61 +52,77 @@ You will need the following packages installed in your version of Perl:
Email::Valid
Install the above packages using "cpan" then "i Date::Simple", "i Mail::Sender" &etc.
Install the above packages using `cpan` then `-i Date::Simple`, `-i Mail::Sender`, &etc.
Note that in case of most current Linux distributions, you can install most of
these from binary package repositories. For example, in case of Ubuntu and
Debian, you can:
apt-get install libmojolicious-perl libmail-sender-perl libdate-simple-perl libemail-valid-perl
apt-get install libmojolicious-perl \
libmail-sender-perl \
libdate-simple-perl \
libemail-valid-perl \
libxml-simple-perl \
libdbd-pg-perl
And then only add Pg::Explain via cpan.
And then only add `Pg::Explain` via CPAN.
3) PostgreSQL
### 3) PostgreSQL
You'll need to have PostgreSQL installed in order to record all the explain
plans into history. Consult the [PostgreSQL Wiki](https://wiki.postgresql.org/wiki/Detailed_installation_guides)
for more information
A) Create a new database "explain". This will be were the explain server will store the "users"
and "plans" tables in the default schema "public".
#### 3A) Create a new database `explain`
This will be were the explain server will store the `users` and `plans` tables
in the default schema `public`.
B) Run SQL scripts. Log into postgres as postgres. Switch to the "explain" database.
Execute the SQL scripts located in the "sql" directory in the following order:
#### 3B) Run SQL scripts
Log in to the `explain` database and execute the SQL scripts located in this
project's `sql` directory in the following order:
\i create.sql
\i patch-001.sql
\i patch-002.sql
The "create.sql" will create tables in the explain database "public" schema, i.e. "plans" and "users".
The `create.sql` will create tables in the `explain` database `public` schema,
i.e. `plans` and `users`.
B) Create a user role. I use "explaind" [explain daemon] and remember to provides it a password and then configure
the explain.json file to reflect this new role and password.
#### 3C) Create a user role
I use `explaind` [explain daemon], for example. Remember to provide it a
password and then configure the `explain.json` file to reflect this new role and
password.
C) Grant all rights to the tables in "explain" to your role "explaind":
CREATE USER explaind WITH PASSWORD 'explain';
grant all on plans, users to explaind;
#### 3D) Grant all rights to the tables in `explain` to your role:
D) modify /etc/postgresql-9.3/pg_hba.conf so that it has the server as "127.0.0.1"
GRANT ALL ON plans, users TO explaind;
#### 3E) modify `pg_hba.conf` so that it has the server as "127.0.0.1"
local all all 127.0.0.1 trust
If you do not want to alter /etc/postgresql-9.3/pg_hba.conf, then you might be able
to modify the explain.json.dsn setting to specify the name of the value i
n the server column from your /etc/postgresql-9.3/pg_hba.conf file, e.g. "localhost". This
alternative approach has not been tested. It would be desirable to install this project with
the minimal amount of configuration changes, so I encourage someone to come up with a solution
that removes this step "D".
If you do not want to alter `pg_hba.conf`, then you might be able to modify the
`explain.json.dsn` setting to specify the name of the value in the server column
from your `pg_hba.conf` file, e.g. "localhost". This alternative approach has
not been tested. It would be desirable to install this project with the minimal
amount of configuration changes, so I encourage someone to come up with a
solution that removes this step "E".
4) Alter configuration file explain.json making sure you have the correct values for your database connection.
See companion documentation file explain-json-notes.txt
### 4) Configure `explain.json`
Make sure you have the correct values for your database connection.
See companion documentation file `explain-json-notes.txt`
5) Shell
The explain server runs on port 3000. Make sure port 3000 is available and not in use by another process.
You may have to specify a different port, e.g. 3200. I do not know where you do that, probably in Mojolicious.
### 5) Shell
The explain server runs on port 3000. Make sure port 3000 is available and not
in use by another process. You may have to specify a different port (e.g. 3200).
I do not know where you do that, probably in Mojolicious.
In the trunk directory for this project, run in a shell:
./explain daemon
./explain.pl daemon
Then access the web page http://localhost:3000
6) when you access the web page, remember to login and create an account for yourself so that your explain plans
### 6) Browser
Then access the web page `http://localhost:3000` When you access the web page,
remember to login and create an account for yourself so that your explain plans
will be associated with your account.

18
Vagrantfile vendored
View File

@ -12,12 +12,16 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
vb.customize ["modifyvm", :id, "--memory", "1024"]
end
config.vm.provision "puppet" do |puppet|
puppet.options = "--verbose --debug"
puppet.manifests_path = "."
puppet.manifest_file = "explain.pp"
puppet.facter = {
"use_vagrant" => true
}
if Vagrant.has_plugin?("vagrant-puppet-install")
config.vm.provision "puppet" do |puppet|
puppet.options = "--verbose --debug"
puppet.manifests_path = "."
puppet.manifest_file = "explain.pp"
puppet.facter = {
"use_vagrant" => true
}
end
else
config.vm.provision "shell", path: "vagrant_bootstrap.sh"
end
end

57
vagrant_bootstrap.sh Normal file
View File

@ -0,0 +1,57 @@
#!/bin/bash
export PGDATA="/etc/postgresql/10/main"
export APP_USER="explain"
export APP_PASS="explain"
export BASEDIR="/vagrant"
### This script *can* be run on a Docker Ubuntu VM if desired.
### To do so, additional commands need to be run:
# apt-get update
# apt-get -y -qq install make curl libclone-perl lsb-release sudo
# sed -i "s/exit.*/exit 0/" /usr/sbin/policy-rc.d
# export BASEDIR="/explain"
# Set username in explain.json
sed -i "s/\"username\" : \"explain\"/\"username\" : \"${APP_USER}\"/" ${BASEDIR}/explain.json
sed -i "s/\"password\" : \"explain\"/\"password\" : \"${APP_PASS}\"/" ${BASEDIR}/explain.json
# Install dependencies
curl -s -L cpanmin.us | perl - -n Mojolicious
apt-get -y -qq install wget ca-certificates cpanminus libmojolicious-perl libmail-sender-perl libdate-simple-perl libemail-valid-perl libxml-simple-perl libdbd-pg-perl
# Install Pg::Explain
cpanm -q Pg::Explain
# Install Postgres
echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get -y -qq update
sudo apt-get -y -qq upgrade
sudo apt-get -y -qq install postgresql-10
sed -i -e "s/peer/trust/" ${PGDATA}/pg_hba.conf
sudo -u postgres psql -tc "select pg_reload_conf()"
# Create database
createdb -U postgres explain
# Create user
psql -qU postgres explain -c "CREATE USER ${APP_USER} WITH PASSWORD '${APP_PASS}'"
# Apply patches
psql -q -f ${BASEDIR}/sql/create.sql -U postgres explain
for i in `seq -f "%03g" 1 10`
do
psql -q -f ${BASEDIR}/sql/patch-${i}.sql -U postgres explain
done
# Apply grants
psql -qU postgres explain -c "GRANT ALL ON plans, users TO ${APP_USER}"
psql -qU postgres explain -c "GRANT ALL ON SCHEMA plans TO ${APP_USER}"
for x in `echo {0..9} {A..Z} {a..z}`
do
psql -qU postgres explain -c "GRANT ALL PRIVILEGES ON plans.\"part_${x}\" TO ${APP_USER}"
done
# Done
echo "Your Vagrant box is all set up. Use 'vagrant ssh' to log in, then call '/vagrant/explain.pl daemon' to start the service"