From ebb50ec04fb55070dac8d0a958412a7112963f60 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Wed, 12 Apr 2017 15:58:26 +0200 Subject: [PATCH 01/26] Update Docker image to be based on Ubuntu 16.04 --- .dockerignore | 5 ++++ Dockerfile | 64 ++++++++++++++++++++++----------------------------- 2 files changed, 32 insertions(+), 37 deletions(-) diff --git a/.dockerignore b/.dockerignore index 6b8710a..3992f87 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,6 @@ .git +.stuff/* +tmp/* +log/* +target +uploads/* diff --git a/Dockerfile b/Dockerfile index 485317f..a68e836 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ -FROM ubuntu:14.04 +FROM ubuntu:16.04 MAINTAINER Bartosz Ptaszynski +MAINTAINER Marcin Kulik # A quickstart: # @@ -15,52 +16,44 @@ MAINTAINER Bartosz Ptaszynski # # Assuming you are running Docker Toolbox and VirtualBox: go to http://192.168.99.100:3000/ and enjoy. -ENV RUBY_VERSION 2.1.7 EXPOSE 3000 -# get ruby in the house -RUN mkdir /app && \ +ARG DEBIAN_FRONTEND=noninteractive +ARG NODE_VERSION=node_6.x +ARG DISTRO=xenial + +RUN apt-get update && \ + apt-get install -y wget software-properties-common apt-transport-https && \ + add-apt-repository ppa:brightbox/ruby-ng && \ + echo "deb https://deb.nodesource.com/$NODE_VERSION $DISTRO main" >/etc/apt/sources.list.d/nodesource.list && \ + wget --quiet -O - https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \ apt-get update && \ apt-get install -y \ autoconf \ build-essential \ - curl \ git-core \ - libcurl4-openssl-dev \ - libffi-dev \ + libfontconfig1 \ libpq-dev \ - libreadline-dev \ - libsqlite3-dev \ - libssl-dev \ libtool \ libxml2-dev \ libxslt1-dev \ - libyaml-dev \ + nodejs \ pkg-config \ - postgresql \ - python-software-properties \ + ruby2.1 \ + ruby2.1-dev \ sendmail \ - software-properties-common \ - sqlite3 \ - zlib1g-dev + ttf-bitstream-vera -ENV PATH /usr/local/rbenv/bin:/usr/local/rbenv/plugins/ruby-build/bin:$PATH +# autoconf, libtool and pkg-config for libtsm -# install ruby -RUN mkdir /usr/local/rbenv && \ - git clone git://github.com/sstephenson/rbenv.git /usr/local/rbenv && \ - git clone git://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build && \ - git clone https://github.com/sstephenson/rbenv-gem-rehash.git /usr/local/rbenv/plugins/rbenv-gem-rehash && \ - rbenv install $RUBY_VERSION && \ - rbenv global $RUBY_VERSION && \ - rbenv rehash +RUN gem install bundler -# get asciinema dependencies -RUN curl --silent --location https://deb.nodesource.com/setup_4.x | sudo bash - && \ - add-apt-repository ppa:tanguy-patte/phantomjs && \ - apt-get update && \ - apt-get install -y phantomjs nodejs && \ - rbenv exec gem install bundler +ARG PHANTOMJS_VERSION=2.1.1 + +RUN wget --quiet -O /opt/phantomjs.tar.bz2 https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 && \ + tar xjf /opt/phantomjs.tar.bz2 -C /opt && \ + rm /opt/phantomjs.tar.bz2 && \ + ln -sf /opt/phantomjs-$PHANTOMJS_VERSION-linux-x86_64/bin/phantomjs /usr/local/bin # get libtsm RUN git clone git://people.freedesktop.org/~dvdhrm/libtsm /tmp/libtsm && \ @@ -69,16 +62,14 @@ RUN git clone git://people.freedesktop.org/~dvdhrm/libtsm /tmp/libtsm && \ test -f ./configure || NOCONFIGURE=1 ./autogen.sh && \ ./configure --prefix=/usr/local && \ make && \ - sudo make install && \ - sudo ldconfig + make install && \ + ldconfig # install asciinema ADD . /app WORKDIR /app -RUN rbenv local $RUBY_VERSION && \ - cd /app/src && \ - eval "$(rbenv init -)" && \ +RUN cd /app/src && \ make && \ cd /app && \ rm -f log/* && \ @@ -99,7 +90,6 @@ ENV RAILS_ENV "development" # for ex. asciinema.example.com ENV HOST "localhost:3000" -ENTRYPOINT ["rbenv", "exec"] CMD ["bundle", "exec", "rails", "server"] # bundle exec rake db:setup # bundle exec sidekiq OR ruby start_sidekiq.rb (to start sidekiq with sendmail) From 265fc002a6d96964f020c887afe787c2469a8e2e Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Wed, 12 Apr 2017 21:18:38 +0200 Subject: [PATCH 02/26] Clear libtsm checkout after installing the lib --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a68e836..db741ca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -63,7 +63,8 @@ RUN git clone git://people.freedesktop.org/~dvdhrm/libtsm /tmp/libtsm && \ ./configure --prefix=/usr/local && \ make && \ make install && \ - ldconfig + ldconfig && \ + rm -rf /tmp/libtsm # install asciinema ADD . /app From 200d6e1c24b8bb142968e24dffc302573a6501dd Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Wed, 12 Apr 2017 21:22:12 +0200 Subject: [PATCH 03/26] Use asciinema's libtsm fork --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index db741ca..a13df88 100644 --- a/Dockerfile +++ b/Dockerfile @@ -56,9 +56,9 @@ RUN wget --quiet -O /opt/phantomjs.tar.bz2 https://bitbucket.org/ariya/phantomjs ln -sf /opt/phantomjs-$PHANTOMJS_VERSION-linux-x86_64/bin/phantomjs /usr/local/bin # get libtsm -RUN git clone git://people.freedesktop.org/~dvdhrm/libtsm /tmp/libtsm && \ +RUN git clone https://github.com/asciinema/libtsm.git /tmp/libtsm && \ cd /tmp/libtsm && \ - git checkout libtsm-3 && \ + git checkout asciinema && \ test -f ./configure || NOCONFIGURE=1 ./autogen.sh && \ ./configure --prefix=/usr/local && \ make && \ From 5353055d587e37f207fe34191354ec60772ca82d Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Wed, 12 Apr 2017 21:43:32 +0200 Subject: [PATCH 04/26] Run bundle install before adding whole app source tree to prevent cache busting --- Dockerfile | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index a13df88..29cea3f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -67,14 +67,17 @@ RUN git clone https://github.com/asciinema/libtsm.git /tmp/libtsm && \ rm -rf /tmp/libtsm # install asciinema -ADD . /app +RUN mkdir /app WORKDIR /app -RUN cd /app/src && \ - make && \ - cd /app && \ - rm -f log/* && \ - bundle install && \ +ADD Gemfile* /app/ +RUN bundle install + +ADD . /app + +RUN cd src && make + +RUN rm -f log/* && \ mkdir -p tmp && \ ln -s /app/vendor/assets/javascripts/asciinema-player.js /app/a2png/ && \ ln -s /app/vendor/assets/stylesheets/asciinema-player.css /app/a2png/ && \ From f4f831e114a9ba1c669b23810517bf8be1a90b54 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Wed, 12 Apr 2017 21:48:24 +0200 Subject: [PATCH 05/26] No need to delete log/* --- Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 29cea3f..675be25 100644 --- a/Dockerfile +++ b/Dockerfile @@ -77,8 +77,7 @@ ADD . /app RUN cd src && make -RUN rm -f log/* && \ - mkdir -p tmp && \ +RUN mkdir -p tmp log && \ ln -s /app/vendor/assets/javascripts/asciinema-player.js /app/a2png/ && \ ln -s /app/vendor/assets/stylesheets/asciinema-player.css /app/a2png/ && \ touch tmp/restart.txt From 6509f741927fc47c7b88e4d47d147c238bf55569 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Wed, 12 Apr 2017 21:48:58 +0200 Subject: [PATCH 06/26] No need to create tmp/restart.txt --- Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 675be25..d0e3e4f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -79,8 +79,7 @@ RUN cd src && make RUN mkdir -p tmp log && \ ln -s /app/vendor/assets/javascripts/asciinema-player.js /app/a2png/ && \ - ln -s /app/vendor/assets/stylesheets/asciinema-player.css /app/a2png/ && \ - touch tmp/restart.txt + ln -s /app/vendor/assets/stylesheets/asciinema-player.css /app/a2png/ VOLUME ["/app/config", "/app/log", "/app/uploads"] From 9e96ac01f3d22257e6893e481e71531d6e907818 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 11:26:22 +0200 Subject: [PATCH 07/26] Properly build a2png --- .dockerignore | 4 ++++ Dockerfile | 24 ++++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/.dockerignore b/.dockerignore index 3992f87..4fcb71b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,3 +4,7 @@ tmp/* log/* target uploads/* +Dockerfile +a2png/main.js +a2png/page/page.js +a2png/target diff --git a/Dockerfile b/Dockerfile index d0e3e4f..97a424b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,20 +66,36 @@ RUN git clone https://github.com/asciinema/libtsm.git /tmp/libtsm && \ ldconfig && \ rm -rf /tmp/libtsm +# install JDK + +RUN wget --quiet -O /opt/jdk-8u111-linux-x64.tar.gz --no-check-certificate --no-cookies --header 'Cookie: oraclelicense=accept-securebackup-cookie' http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111-linux-x64.tar.gz && \ + tar xzf /opt/jdk-8u111-linux-x64.tar.gz -C /opt && \ + rm /opt/jdk-8u111-linux-x64.tar.gz && \ + update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_111/bin/java 1000 + +# install leiningen + +RUN wget --quiet -O /usr/local/bin/lein https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein && \ + chmod a+x /usr/local/bin/lein + +ARG LEIN_ROOT=yes + # install asciinema -RUN mkdir /app + +RUN mkdir -p /app/tmp /app/log WORKDIR /app ADD Gemfile* /app/ RUN bundle install +ADD a2png/project.clj /app/a2png/ +RUN cd a2png && lein deps + ADD . /app RUN cd src && make -RUN mkdir -p tmp log && \ - ln -s /app/vendor/assets/javascripts/asciinema-player.js /app/a2png/ && \ - ln -s /app/vendor/assets/stylesheets/asciinema-player.css /app/a2png/ +RUN cd a2png && lein cljsbuild once main && lein cljsbuild once page VOLUME ["/app/config", "/app/log", "/app/uploads"] From 0823c79b5479434053e7ef0f80becd7a218a1c13 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 11:27:10 +0200 Subject: [PATCH 08/26] Comments --- Dockerfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 97a424b..033de97 100644 --- a/Dockerfile +++ b/Dockerfile @@ -46,8 +46,12 @@ RUN apt-get update && \ # autoconf, libtool and pkg-config for libtsm +# install Bundler + RUN gem install bundler +# install PhantomJS + ARG PHANTOMJS_VERSION=2.1.1 RUN wget --quiet -O /opt/phantomjs.tar.bz2 https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 && \ @@ -55,7 +59,8 @@ RUN wget --quiet -O /opt/phantomjs.tar.bz2 https://bitbucket.org/ariya/phantomjs rm /opt/phantomjs.tar.bz2 && \ ln -sf /opt/phantomjs-$PHANTOMJS_VERSION-linux-x86_64/bin/phantomjs /usr/local/bin -# get libtsm +# install libtsm + RUN git clone https://github.com/asciinema/libtsm.git /tmp/libtsm && \ cd /tmp/libtsm && \ git checkout asciinema && \ From 442a68bb21f386d22f8ede44734f7ab2b2023487 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 13:03:51 +0200 Subject: [PATCH 09/26] Put Nginx in front of Rails --- Dockerfile | 17 ++++++++++++++--- docker/nginx/asciinema.conf | 28 ++++++++++++++++++++++++++++ docker/supervisor/asciinema.conf | 11 +++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 docker/nginx/asciinema.conf create mode 100644 docker/supervisor/asciinema.conf diff --git a/Dockerfile b/Dockerfile index 033de97..f015967 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,8 +16,6 @@ MAINTAINER Marcin Kulik # # Assuming you are running Docker Toolbox and VirtualBox: go to http://192.168.99.100:3000/ and enjoy. -EXPOSE 3000 - ARG DEBIAN_FRONTEND=noninteractive ARG NODE_VERSION=node_6.x ARG DISTRO=xenial @@ -37,11 +35,13 @@ RUN apt-get update && \ libtool \ libxml2-dev \ libxslt1-dev \ + nginx \ nodejs \ pkg-config \ ruby2.1 \ ruby2.1-dev \ sendmail \ + supervisor \ ttf-bitstream-vera # autoconf, libtool and pkg-config for libtsm @@ -102,6 +102,15 @@ RUN cd src && make RUN cd a2png && lein cljsbuild once main && lein cljsbuild once page +# configure Nginx + +COPY docker/nginx/asciinema.conf /etc/nginx/sites-available/default + +# configure Supervisor + +RUN mkdir -p /var/log/supervisor +COPY docker/supervisor/asciinema.conf /etc/supervisor/conf.d/asciinema.conf + VOLUME ["/app/config", "/app/log", "/app/uploads"] # 172.17.42.1 is the docker0 address @@ -113,6 +122,8 @@ ENV RAILS_ENV "development" # for ex. asciinema.example.com ENV HOST "localhost:3000" -CMD ["bundle", "exec", "rails", "server"] +CMD ["/usr/bin/supervisord"] # bundle exec rake db:setup # bundle exec sidekiq OR ruby start_sidekiq.rb (to start sidekiq with sendmail) + +EXPOSE 80 diff --git a/docker/nginx/asciinema.conf b/docker/nginx/asciinema.conf new file mode 100644 index 0000000..981aa6e --- /dev/null +++ b/docker/nginx/asciinema.conf @@ -0,0 +1,28 @@ +upstream rails-server { + server 127.0.0.1:3000 fail_timeout=0; +} + +server { + listen 80 default_server; + listen [::]:80 default_server; + + server_name _; + + root /app/public; + + client_max_body_size 16m; + + location / { + try_files $uri $uri/index.html $uri.html @rails; + } + + location @rails { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_pass http://rails-server; + proxy_redirect off; + error_page 500 502 504 /500.html; # Rails error pages + } +} diff --git a/docker/supervisor/asciinema.conf b/docker/supervisor/asciinema.conf new file mode 100644 index 0000000..2dc2c30 --- /dev/null +++ b/docker/supervisor/asciinema.conf @@ -0,0 +1,11 @@ +[supervisord] +nodaemon=true + +[program:nginx] +command=/usr/sbin/nginx -g "daemon off;" +redirect_stderr=true + +[program:rails] +command=bundle exec rails server +redirect_stderr=true +directory=/app \ No newline at end of file From 23130c3bfc9bb9bd40e96f34dcb9f3acefba4099 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 14:37:40 +0200 Subject: [PATCH 10/26] Run Rails app in production env --- Dockerfile | 7 ++++--- docker/nginx/asciinema.conf | 8 ++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index f015967..1946e20 100644 --- a/Dockerfile +++ b/Dockerfile @@ -87,11 +87,13 @@ ARG LEIN_ROOT=yes # install asciinema +ENV RAILS_ENV "production" + RUN mkdir -p /app/tmp /app/log WORKDIR /app ADD Gemfile* /app/ -RUN bundle install +RUN bundle install --deployment --without development test ADD a2png/project.clj /app/a2png/ RUN cd a2png && lein deps @@ -99,7 +101,7 @@ RUN cd a2png && lein deps ADD . /app RUN cd src && make - +RUN bundle exec rake assets:precompile RUN cd a2png && lein cljsbuild once main && lein cljsbuild once page # configure Nginx @@ -116,7 +118,6 @@ VOLUME ["/app/config", "/app/log", "/app/uploads"] # 172.17.42.1 is the docker0 address ENV DATABASE_URL "postgresql://postgres:mypass@172.17.42.1/asciinema" ENV REDIS_URL "redis://172.17.42.1:6379" -ENV RAILS_ENV "development" # when using Docker Toolbox/Virtualbox this is going to be your address # set to whatever FQDN/address you want asciinema to advertise itself as # for ex. asciinema.example.com diff --git a/docker/nginx/asciinema.conf b/docker/nginx/asciinema.conf index 981aa6e..6e92331 100644 --- a/docker/nginx/asciinema.conf +++ b/docker/nginx/asciinema.conf @@ -16,6 +16,14 @@ server { try_files $uri $uri/index.html $uri.html @rails; } + location ~ ^/assets/ { + expires 1y; + add_header Cache-Control public; + + add_header ETag ""; + break; + } + location @rails { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; From 2ff6275a3c7ed379ca8f70da09ff29eae2253eff Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 15:56:37 +0200 Subject: [PATCH 11/26] Whitespace --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 398537a..2626e44 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,9 +11,11 @@ services: postgres: image: postgres container_name: postgres + redis: image: redis container_name: redis + sidekiq: image: asciinema/asciinema.org links: From 392ae14be2d98b1b56e71da4efb5753a501f883b Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 15:56:50 +0200 Subject: [PATCH 12/26] Fix port mapping in docker-compose --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2626e44..e2db3b3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,7 +42,7 @@ services: REDIS_URL: "redis://redis:6379" HOST: "localhost:3000" # replace with actual hostname/ip.... ${HOSTNAME} doesn't seem to work.. ports: - - "3000:3000" + - "3000:80" volumes: - /tmp/asciinema/uploads:/app/uploads From 0e6b2366eb5ee38378e6c323e221ad01598e42cf Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 16:21:33 +0200 Subject: [PATCH 13/26] Update Dockerfile comments wrt deprecation of Docker Toolbox --- Dockerfile | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1946e20..13476ea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,15 +6,13 @@ MAINTAINER Marcin Kulik # # docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=mypass --name=postgres postgres # docker run -d -p 6379:6379 --name=redis redis -# docker run --rm -e DATABASE_URL="postgresql://postgres:mypass@172.17.42.1/asciinema" foobarto/asciinema.org bundle exec rake db:setup +# docker run --rm -e DATABASE_URL="postgresql://postgres:mypass@postgres/asciinema" asciinema/asciinema.org bundle exec rake db:setup # # starting sidekiq using the provided start_sidekiq.rb file will also start sendmail service if you don't want to use SMTP # # otherwise start sidekiq by starting: bundle exec sidekiq -# docker run -d -e DATABASE_URL="postgresql://postgres:mypass@172.17.42.1/asciinema" foobarto/asciinema.org ruby start_sidekiq.rb -# docker run -d -e DATABASE_URL="postgresql://postgres:mypass@172.17.42.1/asciinema" -p 3000:3000 foobarto/asciinema.org +# docker run -d -e DATABASE_URL="postgresql://postgres:mypass@postgres/asciinema" asciinema/asciinema.org ruby start_sidekiq.rb +# docker run -d -e DATABASE_URL="postgresql://postgres:mypass@postgres/asciinema" -p 3000:80 asciinema/asciinema.org # # You can override the address/port that is sent in email with login token by passing HOST="host:port" environment variable when starting the web server. -# -# Assuming you are running Docker Toolbox and VirtualBox: go to http://192.168.99.100:3000/ and enjoy. ARG DEBIAN_FRONTEND=noninteractive ARG NODE_VERSION=node_6.x @@ -115,12 +113,9 @@ COPY docker/supervisor/asciinema.conf /etc/supervisor/conf.d/asciinema.conf VOLUME ["/app/config", "/app/log", "/app/uploads"] -# 172.17.42.1 is the docker0 address -ENV DATABASE_URL "postgresql://postgres:mypass@172.17.42.1/asciinema" -ENV REDIS_URL "redis://172.17.42.1:6379" -# when using Docker Toolbox/Virtualbox this is going to be your address -# set to whatever FQDN/address you want asciinema to advertise itself as -# for ex. asciinema.example.com +ENV DATABASE_URL "postgresql://postgres:mypass@postgres/asciinema" +ENV REDIS_URL "redis://redis:6379" + ENV HOST "localhost:3000" CMD ["/usr/bin/supervisord"] From e134fd78983ac8804e4f9544aef656c292a25a5e Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 16:27:30 +0200 Subject: [PATCH 14/26] No need to link to redis container when setting up db --- docker-compose.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e2db3b3..d90de6b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -49,9 +49,7 @@ services: db_init: image: asciinema/asciinema.org links: - - redis - postgres environment: DATABASE_URL: "postgresql://postgres:mypass@postgres/asciinema" - REDIS_URL: "redis://redis:6379" command: "bundle exec rake db:setup" From 4a6f6cb7cad18eb40a429c2339c206ac35b7c03c Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 16:44:35 +0200 Subject: [PATCH 15/26] Rename docker containers & services --- README.md | 10 ++++++---- docker-compose.yml | 15 ++++++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 548b7fa..de07919 100644 --- a/README.md +++ b/README.md @@ -24,18 +24,20 @@ your organization. ### Quickstart Using Docker Compose Required: - - [Docker](https://docs.docker.com/engine/getstarted/step_one/#step-1-get-docker) - - [docker-compose 1.5+](https://docs.docker.com/compose/install/) + +- [Docker](https://docs.docker.com/engine/getstarted/step_one/#step-1-get-docker) +- [docker-compose 1.5+](https://docs.docker.com/compose/install/) + ```bash $ wget https://raw.githubusercontent.com/asciinema/asciinema.org/master/docker-compose.yml -$ docker-compose up -d asciinema +$ docker-compose up -d web $ docker-compose run --rm db_init ``` You can override the address/port that is sent in email with login token by passing HOST="host:port" environment variable when starting the web server. -Assuming you are running Docker Toolbox and VirtualBox: go to http://192.168.99.100:3000/ and enjoy. +Assuming you are running Docker Toolbox and VirtualBox: go to http://your-docker-host:3000/ and enjoy. ### Manual setup diff --git a/docker-compose.yml b/docker-compose.yml index d90de6b..338192a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,23 +1,24 @@ version: '2' # Quickstart: -# docker-compose up -d asciinema -# docker-compose run --rm db_init +# docker-compose up -d web +# docker-compose run --rm db_init # To cleanup: -# docker-compose stop && docker-compose rm +# docker-compose stop && docker-compose rm services: postgres: image: postgres - container_name: postgres + container_name: asciinema_postgres redis: image: redis - container_name: redis + container_name: asciinema_redis sidekiq: image: asciinema/asciinema.org + container_name: asciinema_worker links: - redis - postgres @@ -29,9 +30,9 @@ services: volumes: - /tmp/asciinema/uploads:/app/uploads - asciinema: + web: image: asciinema/asciinema.org - container_name: asciinema + container_name: asciinema_web links: - redis - postgres From c5730d914dd1545299fccdb578528aa8971c9c7d Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 18:08:06 +0200 Subject: [PATCH 16/26] Use unicorn in Docker container --- config/unicorn.rb | 55 ++++++++++++++++++++++++++++++++ docker/supervisor/asciinema.conf | 2 +- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 config/unicorn.rb diff --git a/config/unicorn.rb b/config/unicorn.rb new file mode 100644 index 0000000..5810026 --- /dev/null +++ b/config/unicorn.rb @@ -0,0 +1,55 @@ +ASCIINEMA_HOME = ENV["ASCIINEMA_HOME"] || Dir.pwd +UNICORN_WORKERS = (ENV["UNICORN_WORKERS"] || "4").to_i + +# Use at least one worker per core if you're on a dedicated server, +# more will usually help for _short_ waits on databases/caches. +worker_processes UNICORN_WORKERS + +# Help ensure your application will always spawn in the symlinked +# "current" directory that Capistrano sets up. +working_directory ASCIINEMA_HOME + +listen 3000, :tcp_nopush => true + +# nuke workers after 60 seconds +timeout 60 + +# feel free to point this anywhere accessible on the filesystem +pid "#{ASCIINEMA_HOME}/tmp/unicorn.pid" + +preload_app true + +# Enable this flag to have unicorn test client connections by writing the +# beginning of the HTTP headers before calling the application. This +# prevents calling the application for connections that have disconnected +# while queued. This is only guaranteed to detect clients on the same +# host unicorn runs on, and unlikely to detect disconnects even on a +# fast LAN. +check_client_connection false + +before_exec do |server| + ENV["BUNDLE_GEMFILE"] = "#{ASCIINEMA_HOME}/Gemfile" +end + +before_fork do |server, worker| + if defined?(ActiveRecord::Base) + ActiveRecord::Base.connection.disconnect! + Rails.logger.info('Disconnected from ActiveRecord') + end + + old_pid = "#{server.config[:pid]}.oldbin" + if old_pid != server.pid + begin + sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU + Process.kill(sig, File.read(old_pid).to_i) + rescue Errno::ENOENT, Errno::ESRCH + end + end +end + +after_fork do |server, worker| + if defined?(ActiveRecord::Base) + ActiveRecord::Base.establish_connection + Rails.logger.info('Connected to ActiveRecord') + end +end diff --git a/docker/supervisor/asciinema.conf b/docker/supervisor/asciinema.conf index 2dc2c30..aee1738 100644 --- a/docker/supervisor/asciinema.conf +++ b/docker/supervisor/asciinema.conf @@ -6,6 +6,6 @@ command=/usr/sbin/nginx -g "daemon off;" redirect_stderr=true [program:rails] -command=bundle exec rails server +command=bundle exec unicorn -p 3000 -c config/unicorn.rb redirect_stderr=true directory=/app \ No newline at end of file From fe4653445e6917c2f542f9b5ce8f51c91ad8c393 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 18:08:42 +0200 Subject: [PATCH 17/26] Add more patterns to .dockerignore --- .dockerignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 4fcb71b..463de6d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,10 +1,14 @@ .git -.stuff/* +.stuff +.bundle tmp/* log/* target uploads/* +coverage Dockerfile a2png/main.js a2png/page/page.js a2png/target +config/asciinema.yml +config/database.yml From fe71ae95158c386a46a27180c89f90d14d0481a1 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 18:09:13 +0200 Subject: [PATCH 18/26] Make supervisor log its children stdout/stderr to its own stdout/stderr --- docker/supervisor/asciinema.conf | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docker/supervisor/asciinema.conf b/docker/supervisor/asciinema.conf index aee1738..0857a41 100644 --- a/docker/supervisor/asciinema.conf +++ b/docker/supervisor/asciinema.conf @@ -3,9 +3,15 @@ nodaemon=true [program:nginx] command=/usr/sbin/nginx -g "daemon off;" -redirect_stderr=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 [program:rails] -command=bundle exec unicorn -p 3000 -c config/unicorn.rb -redirect_stderr=true -directory=/app \ No newline at end of file +command=bundle exec unicorn -c config/unicorn.rb +directory=/app +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 \ No newline at end of file From 3922068b3c88a5d57145a29554538f55a529687b Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 18:10:23 +0200 Subject: [PATCH 19/26] Compile a2png before adding whole source tree --- Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 13476ea..fd8a88c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -93,14 +93,16 @@ WORKDIR /app ADD Gemfile* /app/ RUN bundle install --deployment --without development test -ADD a2png/project.clj /app/a2png/ +COPY a2png/project.clj /app/a2png/ RUN cd a2png && lein deps +COPY a2png /app/a2png +RUN cd a2png && lein cljsbuild once main && lein cljsbuild once page + ADD . /app RUN cd src && make RUN bundle exec rake assets:precompile -RUN cd a2png && lein cljsbuild once main && lein cljsbuild once page # configure Nginx From 1edd77b677cc4c503ad6391d4f35160880ebdb28 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 18:12:45 +0200 Subject: [PATCH 20/26] Fix assets compilation without database.yml --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index fd8a88c..fe5b97c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -101,6 +101,9 @@ RUN cd a2png && lein cljsbuild once main && lein cljsbuild once page ADD . /app +ENV DATABASE_URL "postgresql://postgres:mypass@postgres/asciinema" +ENV REDIS_URL "redis://redis:6379" + RUN cd src && make RUN bundle exec rake assets:precompile @@ -115,9 +118,6 @@ COPY docker/supervisor/asciinema.conf /etc/supervisor/conf.d/asciinema.conf VOLUME ["/app/config", "/app/log", "/app/uploads"] -ENV DATABASE_URL "postgresql://postgres:mypass@postgres/asciinema" -ENV REDIS_URL "redis://redis:6379" - ENV HOST "localhost:3000" CMD ["/usr/bin/supervisord"] From fc412ccf81a2f42bc4199b74c9d379f87a6cf366 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 18:13:30 +0200 Subject: [PATCH 21/26] Do not expose Rails config dir as volume --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index fe5b97c..9c7b946 100644 --- a/Dockerfile +++ b/Dockerfile @@ -116,7 +116,7 @@ COPY docker/nginx/asciinema.conf /etc/nginx/sites-available/default RUN mkdir -p /var/log/supervisor COPY docker/supervisor/asciinema.conf /etc/supervisor/conf.d/asciinema.conf -VOLUME ["/app/config", "/app/log", "/app/uploads"] +VOLUME ["/app/log", "/app/uploads"] ENV HOST "localhost:3000" From 5714656e9d77a6abd219abdde65e2075c321e510 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 19:37:02 +0200 Subject: [PATCH 22/26] Document dependencies in Dockerfile --- Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9c7b946..4dfd865 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,7 +42,10 @@ RUN apt-get update && \ supervisor \ ttf-bitstream-vera -# autoconf, libtool and pkg-config for libtsm +# Packages required for: +# autoconf, libtool and pkg-config for libtsm +# libfontconfig1 for PhantomJS +# ttf-bitstream-vera for a2png # install Bundler From ecdc8a463e2e29c3275102291777dc8cb27ee5b9 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 20:10:19 +0200 Subject: [PATCH 23/26] Add missing imagemagick dependency to Docker image --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index 4dfd865..a5f81e7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,6 +28,7 @@ RUN apt-get update && \ autoconf \ build-essential \ git-core \ + imagemagick \ libfontconfig1 \ libpq-dev \ libtool \ @@ -46,6 +47,7 @@ RUN apt-get update && \ # autoconf, libtool and pkg-config for libtsm # libfontconfig1 for PhantomJS # ttf-bitstream-vera for a2png +# imagemagick (identify) for PNG generator (Ruby) # install Bundler From a43363ab0f8955bf104a64ed30aadc85e720ecd0 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 20:22:26 +0200 Subject: [PATCH 24/26] Dockerignore more files in a2png/ --- .dockerignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.dockerignore b/.dockerignore index 463de6d..82933d8 100644 --- a/.dockerignore +++ b/.dockerignore @@ -10,5 +10,7 @@ Dockerfile a2png/main.js a2png/page/page.js a2png/target +a2png/node_modules +a2png/target config/asciinema.yml config/database.yml From 9f511e30fa4a98ac1fc74c1c0666af61188adc1f Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 20:22:47 +0200 Subject: [PATCH 25/26] ADD -> COPY --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index a5f81e7..92805ce 100644 --- a/Dockerfile +++ b/Dockerfile @@ -95,7 +95,7 @@ ENV RAILS_ENV "production" RUN mkdir -p /app/tmp /app/log WORKDIR /app -ADD Gemfile* /app/ +COPY Gemfile* /app/ RUN bundle install --deployment --without development test COPY a2png/project.clj /app/a2png/ @@ -104,7 +104,7 @@ RUN cd a2png && lein deps COPY a2png /app/a2png RUN cd a2png && lein cljsbuild once main && lein cljsbuild once page -ADD . /app +COPY . /app ENV DATABASE_URL "postgresql://postgres:mypass@postgres/asciinema" ENV REDIS_URL "redis://redis:6379" From a524b1ac70f729932b6d7f7bfeeb0a1c92638a16 Mon Sep 17 00:00:00 2001 From: Marcin Kulik Date: Thu, 13 Apr 2017 20:45:33 +0200 Subject: [PATCH 26/26] Fix order of docker-compose commands to prevent "no such database" errors --- README.md | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index de07919..4b6e029 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,8 @@ Required: ```bash $ wget https://raw.githubusercontent.com/asciinema/asciinema.org/master/docker-compose.yml -$ docker-compose up -d web $ docker-compose run --rm db_init +$ docker-compose up -d web ``` diff --git a/docker-compose.yml b/docker-compose.yml index 338192a..093d34c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,8 @@ version: '2' # Quickstart: +# docker-compose run --rm -b_init # docker-compose up -d web -# docker-compose run --rm db_init # To cleanup: # docker-compose stop && docker-compose rm