Skip to content

Instantly share code, notes, and snippets.

@funkotron
Last active December 18, 2019 17:56
Show Gist options
  • Star 20 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save funkotron/6025664 to your computer and use it in GitHub Desktop.
Save funkotron/6025664 to your computer and use it in GitHub Desktop.
Using Docker (requires docker to be installed http://www.docker.io/gettingstarted/ ), spawn a postgresql instance and a dynamically configured treeio instance.
#!/bin/bash
# Description: Using Docker (requires docker to be installed http://www.docker.io/gettingstarted/ ), spawn a postgresql instance and a dynamically configured treeio instance
# Also requires postgresql client tools http://www.postgresql.org/download/linux/ubuntu/
# Run chmod +x to make this file executable then run it: ./docker_create_treeio.sh
# Author: Adam Awan
# Email: adam@tree.io
# Set the port to forward for Tree.io
TREEIO_PORT="80"
# Create a PostgreSQL Instance
echo "Retrieving adam/pglite PostgreSQL Container..."
docker pull adam/pglite
echo "Running adam/pglite PostgreSQL Container..."
EXISTING_VOLUME=`cat .TREEIO_PGLITE_VOLUME_ID`
if [ -z $EXISTING_VOLUME ]; then
VOLUME_OPTION="-v /data"
else
EXISTING_VOLUME="-volumes-from $EXISTING_VOLUME"
fi
EXISTING_PASSWORD=`cat .TREEIO_PGLITE_PWD`
PGID=$(docker run -d -p 5432 $VOLUME_OPTION $EXISTING_VOLUME adam/pglite /init $EXISTING_PASSWORD)
while ! docker logs $PGID 2>/dev/null | grep PG_PASSWORD | grep -q ^PG_PASSWORD= ; do sleep 1 ; done
eval $(docker logs $PGID 2>/dev/null)
PG_PORT=$(docker port $PGID 5432)
if [ -z $EXISTING_VOLUME ]; then
# This is the first volume so save the ID and Password for later accesss
echo $PGID > $HOME/.TREEIO_PGLITE_VOLUME_ID
echo $PG_PASSWORD > $HOME/.TREEIO_PGLITE_PWD
fi
PG_HOST=`ifconfig | grep "docker" -A 1 | grep "inet" | cut -d\: -f2 | cut -d\ -f1`
echo "A new PostgreSQL instance is listening at IP $PG_HOST on port $PG_PORT. The admin user is postgres, the admin password is $PG_PASSWORD."
# Sleep for a second to give it a chance to spin up
sleep 1
echo "Pulling the treeio container..."
docker pull adam/treeio
echo "If running Vagrant you will need to forward port $TREEIO_PORT"
TREEID=$(docker run -d -p 22 -p $TREEIO_PORT:5000 adam/treeio /usr/sbin/treeio $PG_HOST $PG_PORT $PG_PASSWORD)
SSHPORT=$(docker port $TREEID 22)
echo "treeio running with container ID $TREEID"
echo "treeio SSH running on port $SSHPORT"
echo "WARNING! You must change the root password of your treeio container - currently it is 'treeio'."
echo "You can ssh to your container by running: ssh -p $SSHPORT root@localhost"
echo "Once connected run passwd to change your password."
echo "treeio is running at http://localhost:$TREEIO_PORT with username 'admin' and password 'admin'."
echo "Container setup complete."
@sermtech
Copy link

Hey funkotron. This is an amazing work from you! Thanks a lot! I've been trying to install treeio without success for two weeks now. (of course I don't have a lot of available time... anyways) I've found your script and have tried it without success twice already...

I'm using a clean ubuntu 12.04 inside a virtualbox machine. Installing Docker goes without problems. I just get a warning at the end of it saying that Docker detected local DNS server on resolv.conf then it's using default external servers, from google, I guess. But it seems to run.

Then I run your script and it shows no erros and it gives me the final msg saying that treeio is running at http://localhost with username admin... etc.

When I go to localhost on my browser, I just get a lot of errors and no login page...
These are the errors... (the headers)

OperationalError at /

Fatal: database "treeio" does not exist
Request Method: GET
Request URL: http//localhost/
Django Version: 1.3
Exception Type: OperationalError
Exception Value:

and so forth...

What I am doing wrong? could you help out?

Thanks a lot.

@funkotron
Copy link
Author

Ah, the script assumes you have the postgresql client tools installed on your machine so it can run createdb. I will try moving this inside the treeio container where it is installed but for now if you install this it should work: http://www.postgresql.org/download/linux/ubuntu/

@funkotron
Copy link
Author

@sermtech I've updated the script and the container so this should work without postgresql client tools installed. Please let me know if this fixes the issue.

@sermtech
Copy link

@funkotron Thanks again for your help. I tried the new script but it didn't work... Nothing comes up when I go online to localhost after running the script.

@sermtech
Copy link

@funkotron Is this related, somehow, to the issue found here: moby/moby#541 ?

Cause I'm getting the message that Docker detected local DNS server on resolv.conf and its using default external servers...

I really appreciate your support here. I'm not an expert in IT, just want to make a basic tree.io installation so my org can develop larger projects in a more organized way. Thanks.

@sermtech
Copy link

@funkotron It might be easier, if you don't mind, just telling me which specific version of ubuntu to use and I'll start from scratch again. I wish I could find a virtual appliance for either vmware of virtualbox containing a working version of the latest tree.io... oh well, ignorance costs me a lot of time. thanks again.

@funkotron
Copy link
Author

@sermtech A virtualbox container would be a nice idea, I'll aim to build one next week. I don't think the version of ubuntu is an issue here; the latest script should work.

It would also help if you can paste the result of docker logs TREEID where TREEID is what was printed when you ran the script: treeio running with container ID $TREEID

@sermtech
Copy link

@funkotron thanks a lot! I'm trying it again with the new script and I'll post the results here. yeah, the virtualbox VM would be perfect! I'm not sure exactly how to get the logs but I'll do my best here.. Thanks again.

@sermtech
Copy link

@funkotron No Joy, The script is stuck at
Running Jpetazzo/pglite PostgreSQL container...
WARNING: Docker detected local DNS server on resolv.conf. using default external servers: [8.8.8.8 8.8.4.4]

These are the last lines I've got... and it has been stuck there for 5 min now... and it doesn't go forward...

update... Just tried it again, with the same results... just got stuck at running jpetazzo/pglite...

@funkotron
Copy link
Author

@sermtech Sorry to hear that, it looks like this Docker issue: moby/moby#1026 maybe you can run through the steps in the comments there. You could also try version 13.04 of Ubuntu.

@sermtech
Copy link

@funkotron alright, thanks. I'll try those two suggestions and I'll post my results here for reference.

@funkotron
Copy link
Author

@sermtech the Docker container is still experimental - at the moment there is no persistence until the next Docker release (though it is available in their development code). Don't run this in production yet!

@funkotron
Copy link
Author

With the latest version of Docker this now works with a persistent database.

@sermtech
Copy link

@funkotron It works! With Ubuntu 13.04 64bit inside Virtualbox. I'm using the latest script (revision 19, I think). Great job with this! I Really appreciate it! On to setting SMTP, trying to find a way to sync calendars with google, and other good stuff. Thanks a lot!!

@funkotron
Copy link
Author

@sermtech Glad it works for you now, it was a long night modifying the pglite and treeio containers and reading the source of Docker's undocumented volume support to get everything working smoothly with persistence!

@X4
Copy link

X4 commented Jul 22, 2013

@funkotron sorry, for the delay, I had to re-compile my kernel,lxc and docker first. Was not in town over the
weekend. When I run the script it hangs on "cat" with the error "file or folder not found"

./docker_create_treeio.sh 
Passwort: 
Retrieving adam/pglite PostgreSQL Container...
Pulling repository adam/pglite
Pulling image 67813e834c695fa150a386ff72ad3353c2e996cab931a91f94b73d0258a4fe19 (latest) from adam/pglite
Pulling 67813e834c695fa150a386ff72ad3353c2e996cab931a91f94b73d0258a4fe19 metadata
Pulling 67813e834c695fa150a386ff72ad3353c2e996cab931a91f94b73d0258a4fe19 fs layer
Downloading 10.24 kB/10.24 kB (100%)
Pulling a5aaacb10419eb2788c454befa645bd187835a9a620bd1a2202f063f2af685a3 metadata
Pulling a5aaacb10419eb2788c454befa645bd187835a9a620bd1a2202f063f2af685a3 fs layer
Downloading 10.24 kB/10.24 kB (100%)
Pulling 7f1df3f6856c47805da7c632883f6e9d0628063f50c1078a03b429b322644119 metadata
Pulling 7f1df3f6856c47805da7c632883f6e9d0628063f50c1078a03b429b322644119 fs layer
Downloading 10.24 kB/10.24 kB (100%)
Pulling 363c0587e8354537f0d868f162f6ba7a9a1d13c7f297e1001a09be270f68f63c metadata
Pulling 363c0587e8354537f0d868f162f6ba7a9a1d13c7f297e1001a09be270f68f63c fs layer
Downloading 10.24 kB/10.24 kB (100%)
Pulling 2048f42eaa3e2f4f52840cd6f8bd655ae393dbc7990f1f990d98adfaccda8631 metadata
Pulling 2048f42eaa3e2f4f52840cd6f8bd655ae393dbc7990f1f990d98adfaccda8631 fs layer
Downloading 10.24 kB/10.24 kB (100%)
Pulling 12a3d2365ba4cd6a682232c2829934f3edbe7a2c3aa6f9339190f9df5e44a14d metadata
Pulling 12a3d2365ba4cd6a682232c2829934f3edbe7a2c3aa6f9339190f9df5e44a14d fs layer
Downloading 10.24 kB/10.24 kB (100%)
Pulling 5101726da51ecd09e9a46a13bd0e2f1974a72d2905cd29d8471cdbd4087617e6 metadata
Pulling 5101726da51ecd09e9a46a13bd0e2f1974a72d2905cd29d8471cdbd4087617e6 fs layer
Downloading 10.24 kB/10.24 kB (100%)
Pulling 397c53a7fd188ed68920200e71520444cc1b66fb3e5ccb8f241820c9cc0fd9ea metadata
Pulling 397c53a7fd188ed68920200e71520444cc1b66fb3e5ccb8f241820c9cc0fd9ea fs layer
Downloading 10.24 kB/10.24 kB (100%)
Pulling b469d908d32ea38463740643f69e725fe063e82d5149ef1cb7865530b80c93b7 metadata
Pulling b469d908d32ea38463740643f69e725fe063e82d5149ef1cb7865530b80c93b7 fs layer
Downloading 10.24 kB/10.24 kB (100%)
Pulling ef42e751d991bc90376d1f93067ab81797d221fb0195e7e662160da63bff1fb2 metadata
Pulling ef42e751d991bc90376d1f93067ab81797d221fb0195e7e662160da63bff1fb2 fs layer
Downloading 10.24 kB/10.24 kB (100%)
Pulling 9135201b285c4ea257723757c193fccce888b7ccf9634faa4fba4cd2d7d0154b metadata
Pulling 9135201b285c4ea257723757c193fccce888b7ccf9634faa4fba4cd2d7d0154b fs layer
Downloading 16.54 MB/16.54 MB (100%)
Running adam/pglite PostgreSQL Container...
cat: .TREEIO_PGLITE_VOLUME_ID: Datei oder Verzeichnis nicht gefunden
cat: .TREEIO_PGLITE_PWD: Datei oder Verzeichnis nicht gefunden
$ docker images -a
REPOSITORY          TAG                 ID                  CREATED             SIZE
adam/pglite         latest              67813e834c69        36 hours ago        25.62 kB (virtual 32.98 MB)
<none>              <none>              7f1df3f6856c        45 hours ago        32.77 kB (virtual 32.93 MB)
<none>              <none>              9135201b285c        4 weeks ago         32.72 MB (virtual 32.72 MB)
<none>              <none>              a5aaacb10419        45 hours ago        25.75 kB (virtual 32.96 MB)
<none>              <none>              b469d908d32e        4 weeks ago         24.58 kB (virtual 32.77 MB)
<none>              <none>              ef42e751d991        4 weeks ago         25.47 kB (virtual 32.75 MB)
<none>              <none>              12a3d2365ba4        47 hours ago        25.74 kB (virtual 32.85 MB)
<none>              <none>              2048f42eaa3e        46 hours ago        24.58 kB (virtual 32.87 MB)
<none>              <none>              363c0587e835        46 hours ago        25.75 kB (virtual 32.9 MB)
<none>              <none>              397c53a7fd18        4 weeks ago         24.58 kB (virtual 32.8 MB)
<none>              <none>              5101726da51e        47 hours ago        25.74 kB (virtual 32.82 MB)

$ docker ps -a
ID                  IMAGE                COMMAND             CREATED             STATUS              PORTS
c5b5331d4f69        adam/pglite:latest   /init               3 minutes ago       Exit 255                                
353678dec6b5        adam/pglite:latest   /init               3 minutes ago       Exit 255                                
ed85c4a0ecc9        adam/pglite:latest   /init               9 minutes ago       Exit 255

$ docker logs c5b5331d4f69
lxc-start: Invalid argument - pivot_root syscall failed
lxc-start: failed to setup pivot root
lxc-start: failed to set rootfs for 'c5b5331d4f699fe053a58499fa550c49f81362a6b2ba59b54c33e9e3bc1fd045'
lxc-start: failed to setup the container
lxc-start: invalid sequence number 1. expected 2
lxc-start: failed to spawn 'c5b5331d4f699fe053a58499fa550c49f81362a6b2ba59b54c33e9e3bc1fd045'
lxc-start: Device or resource busy - failed to remove cgroup '/sys/fs/cgroup/cpuset//lxc/c5b5331d4f699fe053a58499fa550c49f81362a6b2ba59b54c33e9e3bc1fd045'

Additional info:

# systemctl status docker.service
docker.service - Docker - The Linux container engine
   Loaded: loaded (/usr/lib64/systemd/system/docker.service; enabled)
   Active: active (running) since Mo 2013-07-22 02:54:27 CEST; 18s ago
  Process: 13766 ExecStop=/bin/sh -c sysctl -w net.ipv4.ip_forward=0 (code=exited, status=0/SUCCESS)
  Process: 13772 ExecStartPre=/bin/sh -c /sbin/sysctl -w net.ipv4.ip_forward=1 (code=exited, status=0/SUCCESS)
  Process: 13769 ExecStartPre=/bin/sh -c mount --make-rprivate / (code=exited, status=0/SUCCESS)
 Main PID: 13775 (docker)
   CGroup: name=systemd:/system/docker.service
           └─13775 /usr/bin/docker -d -p /run/docker.pid -D

Jul 22 02:54:43 SGC-Abydoss.local sh[13775]: [debug] api.go:907 Calling POST /containers/{name:.*}/attach from 127.0.0.1:50847
Jul 22 02:54:43 SGC-Abydoss.local sh[13775]: 2013/07/22 02:54:43 POST /v1.3/containers/9fb2dcc8206f/attach?logs=1&stdout=1
Jul 22 02:54:43 SGC-Abydoss.local sh[13775]: [debug] api.go:907 Calling POST /containers/{name:.*}/attach from 127.0.0.1:50848
Jul 22 02:54:43 SGC-Abydoss.local sh[13775]: 2013/07/22 02:54:43 POST /v1.3/containers/9fb2dcc8206f/attach?logs=1&stderr=1
Jul 22 02:54:44 SGC-Abydoss.local sh[13775]: [debug] network.go:318 Releasing 49153
Jul 22 02:54:44 SGC-Abydoss.local sh[13775]: 2013/07/22 02:54:44 9fb2dcc8206ff835c03fee2318aec80a749906445426b8ee6a507f915c34fe45: Failed to umount filesystem: device...source busy
Jul 22 02:54:45 SGC-Abydoss.local sh[13775]: [debug] api.go:907 Calling POST /containers/{name:.*}/attach from 127.0.0.1:50849
Jul 22 02:54:45 SGC-Abydoss.local sh[13775]: 2013/07/22 02:54:45 POST /v1.3/containers/9fb2dcc8206f/attach?logs=1&stdout=1
Jul 22 02:54:45 SGC-Abydoss.local sh[13775]: [debug] api.go:907 Calling POST /containers/{name:.*}/attach from 127.0.0.1:50850
Jul 22 02:54:45 SGC-Abydoss.local sh[13775]: 2013/07/22 02:54:45 POST /v1.3/containers/9fb2dcc8206f/attach?logs=1&stderr=1

@X4
Copy link

X4 commented Jul 22, 2013

The error in that script starts on line 13:

EXISTING_VOLUME=`cat .TREEIO_PGLITE_VOLUME_ID`
if [ -z $EXISTING_VOLUME ]; then
    VOLUME_OPTION="-v /data"
else
    EXISTING_VOLUME="-volumes-from $EXISTING_VOLUME"
fi
EXISTING_PASSWORD=`cat .TREEIO_PGLITE_PWD`
...

Because the files .TREEIO_PGLITE_VOLUME_ID and .TREEIO_PGLITE_PWD don't exist on my machine.

@sermtech
Copy link

@funkotron Man, thanks so much. I really hope more people realize the relevance of this script. Tree.io is a great project, one of the most complete for project management (and free) and your script made it effortless to install. Thanks again.

@funkotron
Copy link
Author

@X4 I apologise I've only just seen your comment. For some reason I don't get notifications of comments on this page.

I don't think that is the error. It's expected if those files don't exist the command will not store anything in the variables but should not crash.

I believe it hangs on the next command which waits for the pglite container to be run and greps for the password that gets returned via stdout:

PGID=$(docker run -d -p 5432 $VOLUME_OPTION $EXISTING_VOLUME adam/pglite /init $EXISTING_PASSWORD)
while ! docker logs $PGID 2>/dev/null | grep PG_PASSWORD | grep -q ^PG_PASSWORD= ; do sleep 1 ; done

I will add more print statements in between to confirm this and will try and re-run on my machine with the dot files deleted.

@funkotron
Copy link
Author

They really need to add notifications for gists isaacs/github#21

@dtk1985
Copy link

dtk1985 commented Nov 27, 2013

Hi

Thanks for releasing treeio in docker container. I've run your script, it created the container successfully but I'm getting errors when i try to view the app in browser. (ubuntu server 13.04 x64)

OperationalError at /

invalid port number: "0.0.0.0:49153"

Request Method: GET
Request URL: http://derzsidavid.tk/
Django Version: 1.3
Exception Type: OperationalError
Exception Value:

invalid port number: "0.0.0.0:49153"

Exception Location: /usr/local/lib/python2.7/dist-packages/psycopg2/init.py in connect, line 164
Python Executable: /usr/bin/python
Python Version: 2.7.3
Python Path:

['/usr/local/bin',
'/srv/treeio',
'/srv/treeio/treeio',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-linux2',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PIL',
'/usr/lib/pymodules/python2.7']

Server time: Wed, 27 Nov 2013 12:16:50 +0000

it looks like the port is 0.0.0.0:49153 instead of just 49153. what do i need to modify to use the correct port?

ffound the solution @http://docs.docker.io/en/latest/use/basics/

| awk -F: '{ print $2 }') goes before the end bracket in lines PG_PORT & SSHPORT. thanks again

thanks
David

@dimaape
Copy link

dimaape commented Jan 22, 2014

Hi, funkotron! Thanks for the greate container! Installation was such a joy. But now i cant upload any file, cant generate pdfs, chat dont work =/ Do you have any suggestions how to solve this?
Thank you in advance!

@davidbasswwu
Copy link

Hi funkotron - your Docker image is not listed in https://index.docker.io/search?q=treeio

Copy link

ghost commented Mar 25, 2014

Hi funkotron, I am trying to install a modified tree.io via docker . Can you suggest the best approach ?

@acpmasquerade
Copy link

Does the script assume that it is being run my home directory. Because I see these two errors
cat: .TREEIO_PGLITE_VOLUME_ID: No such file or directory
cat: .TREEIO_PGLITE_PWD: No such file or directory

and when I checked from another shell, these two files were created on user ~ home directory.

@hideadesign
Copy link

Hi ! How can I install this on heroku ? any idea or any help ? thanks in advance

@alfawalidou
Copy link

Hello every body, could you please confirm if should be work on latest ubuntu version, i had alot of errors during the installation

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment