* Embed nginx inside Docker image so all services are reversed proxied behind port 80

* Use Varnish 3 from source tarball, newer and OS Varnish could not disable telnet authentication required by Carto
* Remove sources of varnish, gdal, /cartodb/.git when no longer needed in order to make image smaller
* Dropped Nokia and GMAP basemaps, they did not work
* Dropped schema trigger installation, it is no longer needed
* Configure Carto in Python and NodeJS
* Build assets
* Use self as asset_host, assets are hosted by nginx instead of rails
This commit is contained in:
Stefan Verhoeven 2017-04-03 22:46:52 +02:00
parent 3397aed11d
commit bbf2c54325
7 changed files with 133 additions and 99 deletions

View File

@ -38,6 +38,7 @@ RUN useradd -m -d /home/cartodb -s /bin/bash cartodb && \
libproj-dev \ libproj-dev \
gdal-bin \ gdal-bin \
libgdal1-dev \ libgdal1-dev \
libgdal-dev \
postgresql-9.5 \ postgresql-9.5 \
postgresql-client-9.5 \ postgresql-client-9.5 \
postgresql-contrib-9.5 \ postgresql-contrib-9.5 \
@ -47,11 +48,11 @@ RUN useradd -m -d /home/cartodb -s /bin/bash cartodb && \
postgresql-9.5-postgis-2.2 \ postgresql-9.5-postgis-2.2 \
postgresql-9.5-postgis-scripts \ postgresql-9.5-postgis-scripts \
postgis \ postgis \
liblwgeom-2.2-5 \
ca-certificates \ ca-certificates \
redis-server \ redis-server \
python2.7-dev \ python2.7-dev \
python-setuptools \ python-setuptools \
varnish \
imagemagick \ imagemagick \
libmapnik-dev \ libmapnik-dev \
mapnik-utils \ mapnik-utils \
@ -59,6 +60,9 @@ RUN useradd -m -d /home/cartodb -s /bin/bash cartodb && \
python-argparse \ python-argparse \
python-gdal \ python-gdal \
python-chardet \ python-chardet \
python-pip \
python-all-dev \
python-docutils \
openssl \ openssl \
libreadline6 \ libreadline6 \
zlib1g \ zlib1g \
@ -86,12 +90,26 @@ RUN useradd -m -d /home/cartodb -s /bin/bash cartodb && \
libgif-dev \ libgif-dev \
libgmp-dev \ libgmp-dev \
libicu-dev \ libicu-dev \
wget \
nginx-light \
net-tools \
--no-install-recommends && \ --no-install-recommends && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
RUN git config --global user.email you@example.com RUN git config --global user.email you@example.com
RUN git config --global user.name "Your Name" RUN git config --global user.name "Your Name"
# Varnish 3, Ubuntu:16.04 comes with Varnish 4.1 which can't be run with anonymous admin telnet
RUN cd /opt && \
wget https://repo.varnish-cache.org/source/varnish-3.0.7.tar.gz && \
tar -zxf varnish-3.0.7.tar.gz && \
cd varnish-3.0.7 && \
./configure --prefix=/opt/varnish && \
make && \
make install &&
cd /opt &&
rm -rf varnish-3.0.7 varnish-3.0.7.tar.gz
# ogr2ogr2 static build, see https://github.com/CartoDB/cartodb/wiki/How-to-build-gdal-and-ogr2ogr2 # ogr2ogr2 static build, see https://github.com/CartoDB/cartodb/wiki/How-to-build-gdal-and-ogr2ogr2
# using cartodb instruction got error https://trac.osgeo.org/gdal/ticket/6073 # using cartodb instruction got error https://trac.osgeo.org/gdal/ticket/6073
# https://github.com/OSGeo/gdal/compare/trunk...CartoDB:ogr2ogr2 has no code changes, so just use latest gdal tarball # https://github.com/OSGeo/gdal/compare/trunk...CartoDB:ogr2ogr2 has no code changes, so just use latest gdal tarball
@ -102,35 +120,34 @@ cd gdal-2.1.1 && \
./configure --disable-shared && \ ./configure --disable-shared && \
make -j 4 && \ make -j 4 && \
cp apps/ogr2ogr /usr/bin/ogr2ogr2 && \ cp apps/ogr2ogr /usr/bin/ogr2ogr2 && \
rm -rf /opt/ogr2ogr2 /root/.gitconfig cd /opt && \
rm -rf /opt/ogr2ogr2 /opt/gdal-2.1.1.tar.gz /root/.gitconfig /opt/gdal-2.1.1
# Install NodeJS # Install NodeJS
RUN curl https://nodejs.org/download/release/v0.10.41/node-v0.10.41-linux-x64.tar.gz| tar -zxf - --strip-components=1 -C /usr RUN curl https://nodejs.org/download/release/v0.10.41/node-v0.10.41-linux-x64.tar.gz| tar -zxf - --strip-components=1 -C /usr && \
npm install -g grunt-cli && \
npm install -g npm@~2.14.0
# Install rvm # Install rvm
RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 && \
RUN curl -L https://get.rvm.io | bash -s stable --ruby curl -L https://get.rvm.io | bash -s stable --ruby && \
RUN echo 'source /usr/local/rvm/scripts/rvm' >> /etc/bash.bashrc echo 'source /usr/local/rvm/scripts/rvm' >> /etc/bash.bashrc && \
RUN /bin/bash -l -c rvm requirements /bin/bash -l -c rvm requirements
ENV PATH /usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ENV PATH /usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && \
RUN echo rvm_max_time_flag=15 >> ~/.rvmrc RUN echo rvm_max_time_flag=15 >> ~/.rvmrc && \
RUN /bin/bash -l -c 'rvm install 2.2.3' /bin/bash -l -c 'rvm install 2.2.3' && \
RUN /bin/bash -l -c 'rvm use 2.2.3 --default' /bin/bash -l -c 'rvm use 2.2.3 --default' && \
RUN /bin/bash -l -c 'gem install bundle archive-tar-minitar' /bin/bash -l -c 'gem install bundle archive-tar-minitar' && \
/bin/bash -l -c 'gem install bundler compass --no-doc --no-ri'
# Install bundler
RUN /bin/bash -l -c 'gem install bundler --no-doc --no-ri'
# Setting PostgreSQL # Setting PostgreSQL
RUN sed -i 's/\(peer\|md5\)/trust/' /etc/postgresql/9.5/main/pg_hba.conf RUN sed -i 's/\(peer\|md5\)/trust/' /etc/postgresql/9.5/main/pg_hba.conf && \
service postgresql start && \
createuser publicuser --no-createrole --no-createdb --no-superuser -U postgres && \
createuser tileuser --no-createrole --no-createdb --no-superuser -U postgres && \
service postgresql stop
# Install schema_triggers # Initialize template postgis db
RUN git clone https://github.com/CartoDB/pg_schema_triggers.git && \
cd pg_schema_triggers && \
make all install && \
sed -i \
"/#shared_preload/a shared_preload_libraries = 'schema_triggers.so'" \
/etc/postgresql/9.5/main/postgresql.conf
ADD ./template_postgis.sh /tmp/template_postgis.sh ADD ./template_postgis.sh /tmp/template_postgis.sh
RUN service postgresql start && /bin/su postgres -c \ RUN service postgresql start && /bin/su postgres -c \
/tmp/template_postgis.sh && service postgresql stop /tmp/template_postgis.sh && service postgresql stop
@ -138,6 +155,7 @@ RUN service postgresql start && /bin/su postgres -c \
# Install cartodb extension # Install cartodb extension
RUN git clone https://github.com/CartoDB/cartodb-postgresql && \ RUN git clone https://github.com/CartoDB/cartodb-postgresql && \
cd cartodb-postgresql && \ cd cartodb-postgresql && \
git checkout master && \
PGUSER=postgres make install PGUSER=postgres make install
ADD ./cartodb_pgsql.sh /tmp/cartodb_pgsql.sh ADD ./cartodb_pgsql.sh /tmp/cartodb_pgsql.sh
RUN service postgresql start && /bin/su postgres -c \ RUN service postgresql start && /bin/su postgres -c \
@ -145,23 +163,22 @@ RUN service postgresql start && /bin/su postgres -c \
# Install CartoDB API # Install CartoDB API
RUN git clone git://github.com/CartoDB/CartoDB-SQL-API.git && \ RUN git clone git://github.com/CartoDB/CartoDB-SQL-API.git && \
cd CartoDB-SQL-API && ./configure && npm install cd CartoDB-SQL-API && npm install
# Install Windshaft # Install Windshaft
RUN git clone git://github.com/CartoDB/Windshaft-cartodb.git && \ RUN git clone git://github.com/CartoDB/Windshaft-cartodb.git && \
cd Windshaft-cartodb && ./configure && npm install && mkdir logs cd Windshaft-cartodb && git checkout master && npm install && mkdir logs
# Install CartoDB (with the bug correction on bundle install) # Install CartoDB
RUN git clone git://github.com/CartoDB/cartodb.git && \ RUN git clone --recursive git://github.com/CartoDB/cartodb.git && \
cd cartodb && \ cd cartodb && \
perl -pi -e 's/jwt \(1\.5\.3\)/jwt (1.5.4)/' Gemfile.lock && \ git checkout master && \
/bin/bash -l -c 'bundle install' || \ npm install && \
/bin/bash -l -c "cd $(/bin/bash -l -c 'gem contents \ perl -pi -e 's/gdal==1\.10\.0/gdal==1.11.3/' python_requirements.txt && \
debugger-ruby_core_source' | grep CHANGELOG | sed -e \ pip install --no-use-wheel -r python_requirements.txt && \
's,CHANGELOG.md,,') && /bin/bash -l -c 'rake add_source \ /bin/bash -l -c 'bundle install' && \
VERSION=$(/bin/bash -l -c 'ruby --version' | awk \ /bin/bash -l -c 'bundle exec grunt --environment development' && \
'{print $2}' | sed -e 's,p55,-p55,' )' && cd /cartodb && \ rm -rf .git
/bin/bash -l -c 'bundle install'"
# Geocoder SQL client + server # Geocoder SQL client + server
RUN git clone https://github.com/CartoDB/data-services && \ RUN git clone https://github.com/CartoDB/data-services && \
@ -186,18 +203,19 @@ ADD ./config/app_config.yml /cartodb/config/app_config.yml
ADD ./config/database.yml /cartodb/config/database.yml ADD ./config/database.yml /cartodb/config/database.yml
ADD ./create_dev_user /cartodb/script/create_dev_user ADD ./create_dev_user /cartodb/script/create_dev_user
ADD ./setup_organization.sh /cartodb/script/setup_organization.sh ADD ./setup_organization.sh /cartodb/script/setup_organization.sh
ADD ./config/cartodb.nginx.proxy.conf /etc/nginx/sites-enabled/default
ADD ./config/varnish.vcl /etc/varnish.vcl
ENV PATH /usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ENV PATH /usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
RUN mkdir -p /cartodb/log && touch /cartodb/log/users_modifications RUN mkdir -p /cartodb/log && touch /cartodb/log/users_modifications && \
RUN service postgresql start && service redis-server start && \ /opt/varnish/sbin/varnishd -a :6081 -T localhost:6082 -s malloc,256m -f /etc/varnish.vcl && \
bash -l -c "cd /cartodb && bash script/create_dev_user || bash script/create_dev_user && bash script/setup_organization.sh" && \ service postgresql start && service redis-server start && \
# Enable CARTO Builder bash -l -c "cd /cartodb && bash script/create_dev_user || bash script/create_dev_user && \
# bundle exec rake cartodb:features:enable_feature_for_all_users['editor-3'] && \ bash script/setup_organization.sh" && \
# bundle exec rake cartodb:features:enable_feature_for_all_users['explore_site']" && \
service postgresql stop && service redis-server stop service postgresql stop && service redis-server stop
EXPOSE 3000 8080 8181 EXPOSE 80
ENV GDAL_DATA /usr/share/gdal/1.10 ENV GDAL_DATA /usr/share/gdal/1.11
ADD ./startup.sh /opt/startup.sh ADD ./startup.sh /opt/startup.sh

View File

@ -20,22 +20,17 @@ How to build the container:
``` ```
git clone https://github.com/sverhoeven/docker-cartodb.git git clone https://github.com/sverhoeven/docker-cartodb.git
docker build -t="sverhoeven/cartodb" docker-cartodb/ docker build -t=sverhoeven/cartodb docker-cartodb/
``` ```
How to run the container: How to run the container:
------------------------- -------------------------
``` ```
docker run -d -p 3000:3000 -p 8080:8080 -p 8181:8181 sverhoeven/cartodb docker run -d -p 80:80 sverhoeven/cartodb
``` ```
The ports the cartodb container publishes must be combined behind a single [NGINX](http://nginx.org/) web server. The CartoDB instance has been configured with the hostname `cartodb.localhost`, this means the web browser and web server need to be able to resolve `cartodb.localhost` as the machine where the web server is running.
In the GitHub repo there is an [example NGINX config file (config/cartodb.nginx.proxy.conf)](https://github.com/sverhoeven/docker-cartodb/blob/master/config/cartodb.nginx.proxy.conf), which needs to be added to /etc/nginx/conf.d/ directory, after which the web server must be restarted.
This will setup a reverse proxy for the CartoDB/imports (3000), SQL Api (8080) and Map api (8181) to default http port (80).
Alternativly use instructions at https://hub.docker.com/r/spawnthink/cartodb-nginx/ to run NGINX as a docker container with the correct config file already in it.
The CartoDB instance has been configured with the hostname `cartodb.localhost`, this means the web browser and web server need to be able to resolve `cartodb.localhost` to the machine where the web server is running.
This can be done by adding cartodb.localhost alias to your hosts file. For example This can be done by adding cartodb.localhost alias to your hosts file. For example
``` ```
sudo sh -c 'echo 127.0.1.1 cartodb.localhost >> /etc/hosts' sudo sh -c 'echo 127.0.1.1 cartodb.localhost >> /etc/hosts'

View File

@ -68,6 +68,8 @@ defaults: &defaults
app_keys: app_keys:
editor: '' editor: ''
embeds: '' embeds: ''
#fullstory:
#org: 'XXXXX'
facebook: facebook:
app_id: '' app_id: ''
admins: '' admins: ''
@ -102,6 +104,15 @@ defaults: &defaults
wizard: '' wizard: ''
filter: '' filter: ''
query: '' query: ''
applied_sql: ''
applied_cartocss: ''
modified_style_form: ''
completed_connection: ''
failed_connection: ''
created_analysis: ''
modified_analysis: ''
published_map: ''
exported_map: ''
mailing_track: mailing_track:
like_map: '' like_map: ''
trending_map: '' trending_map: ''
@ -193,6 +204,7 @@ defaults: &defaults
bucket_name: '' bucket_name: ''
url_ttl: 7200 url_ttl: 7200
async_long_uploads: false async_long_uploads: false
s3_endpoint: ''
uploads_path: 'public/uploads' # including 'uploads' assumes public path. Absolute path example: /tmp/exports/downloads uploads_path: 'public/uploads' # including 'uploads' assumes public path. Absolute path example: /tmp/exports/downloads
importer: importer:
blacklisted_ip_addr: [] blacklisted_ip_addr: []
@ -209,6 +221,7 @@ defaults: &defaults
async_long_uploads: false async_long_uploads: false
proxy_uri: proxy_uri:
use_ssl: True use_ssl: True
s3_endpoint: ''
unp_temporal_folder: '/tmp/imports/' unp_temporal_folder: '/tmp/imports/'
# It must end in `/uploads` and be accessible via HTTP, if relative will default to Rails.Root/#{uploads_path} # It must end in `/uploads` and be accessible via HTTP, if relative will default to Rails.Root/#{uploads_path}
@ -265,12 +278,18 @@ defaults: &defaults
assets: assets:
s3_bucket_name: "tests" s3_bucket_name: "tests"
max_file_size: 5242880 # 5.megabytes max_file_size: 5242880 # 5.megabytes
# Example for configuring organization assets.
# If 'aws.s3' configuration exists, S3 is used for storing assets and 'assets.organization.bucket' value is required. If 'aws.s3' config is not present, assets will be stored locally.
# organization:
# bucket: "tests" # Required if 'aws.s3' config is present. Bucket must exist beforehand. If no 'aws.s3' config is present, organization assets will be stored locally and this line is not needed.
# max_size_in_bytes: 1048576 # Optional, default is 1 MB
# location: 'organization_assets' # Optional subdirectory for local assets, default is 'organization_assets'
app_assets: app_assets:
asset_host: "//cartodb-libs.global.ssl.fastly.net/cartodbui" asset_host: "//cartodb.localhost"
avatars: avatars:
gravatar_enabled: true gravatar_enabled: true
base_url: '//cartodb-libs.global.ssl.fastly.net/cartodbui/assets/unversioned/images/avatars' base_url: '/assets/unversioned/images/avatars'
kinds: ['ghost', 'marker', 'mountain', 'pacman', 'planet', 'star'] kinds: ['ghost', 'heart', 'marker', 'mountain', 'pacman', 'planet', 'star']
colors: ['green', 'orange', 'red', 'yellow'] colors: ['green', 'orange', 'red', 'yellow']
dropbox_api_key: "" dropbox_api_key: ""
gdrive: gdrive:
@ -280,7 +299,7 @@ defaults: &defaults
# Use your Olark api id to enable it. If you remove this entry or don't define an app key, it won't be activated. # Use your Olark api id to enable it. If you remove this entry or don't define an app key, it won't be activated.
olark: olark:
app_id: '' app_id: ''
enforce_non_empty_layer_css: true enforce_non_empty_layer_css: false
users_dumps: users_dumps:
service: service:
port: 00000 port: 00000
@ -347,36 +366,10 @@ defaults: &defaults
ratelimit_concurrency: 3 ratelimit_concurrency: 3
ratelimit_ttl: 4 ratelimit_ttl: 4
ratelimit_wait_secs: 0.1 ratelimit_wait_secs: 0.1
datasources:
arcgis_enabled: false
salesforce_enabled: false
basemaps: basemaps:
Nokia:
normal_day:
url: 'https://maps.nlp.nokia.com/maptiler/v2/maptile/newest/normal.day/{z}/{x}/{y}/256/png8?lg=eng&token=A7tBPacePg9Mj_zghvKt9Q&app_id=KuYppsdXZznpffJsKT24'
minZoom: '0'
maxZoom: '21'
className: "nokia_normal_day"
attribution: "©2012 Nokia <a href='http://here.net/services/terms' target='_blank'>Terms of use</a>"
name: 'Nokia normal Day'
terrain_day:
url: 'https://maps.nlp.nokia.com/maptiler/v2/maptile/newest/terrain.day/{z}/{x}/{y}/256/png8?lg=eng&token=A7tBPacePg9Mj_zghvKt9Q&app_id=KuYppsdXZznpffJsKT24'
minZoom: '0'
maxZoom: '21'
className: "nokia_terrain_day"
attribution: "©2012 Nokia <a href='http://here.net/services/terms' target='_blank'>Terms of use</a>"
name: 'Nokia Terrain Day'
satellite_day:
url: 'https://maps.nlp.nokia.com/maptiler/v2/maptile/newest/satellite.day/{z}/{x}/{y}/256/png8?lg=eng&token=A7tBPacePg9Mj_zghvKt9Q&app_id=KuYppsdXZznpffJsKT24'
minZoom: '0'
maxZoom: '21'
className: "nokia_satellite_day"
attribution: "©2012 Nokia <a href='http://here.net/services/terms' target='_blank'>Terms of use</a>"
name: 'Nokia Satellite Day'
hybrid_day:
url: 'https://maps.nlp.nokia.com/maptiler/v2/maptile/newest/hybrid.day/{z}/{x}/{y}/256/png8?lg=eng&token=A7tBPacePg9Mj_zghvKt9Q&app_id=KuYppsdXZznpffJsKT24'
minZoom: '0'
maxZoom: '21'
className: "nokia_hybrid_day"
attribution: "©2012 Nokia <a href='http://here.net/services/terms' target='_blank'>Terms of use</a>"
name: 'Nokia hybrid Day'
CARTO: CARTO:
positron_rainbow_labels: positron_rainbow_labels:
default: true default: true
@ -526,6 +519,30 @@ defaults: &defaults
min_rows: 2000000 min_rows: 2000000
statement_timeout: 1800000 statement_timeout: 1800000
tolerance_px: 1.0 tolerance_px: 1.0
connectors:
odbc:
enabled: false
max_rows: nil
mysql:
enabled: true
max_rows: 500000
postgresql:
enabled: true
max_rows: 500000
hive:
enabled: false
max_rows: 500000
sqlserver:
enabled: false
max_rows: 500000
dataservices:
enabled:
geocoder_internal: true
hires_geocoder: false
isolines: false
routing: false
data_observatory: true
development: development:
<<: *defaults <<: *defaults
@ -538,7 +555,6 @@ development:
url_purge_command: 'url.purge' url_purge_command: 'url.purge'
retries: 5 retries: 5
timeout: 5 timeout: 5
enforce_non_empty_layer_css: false
test: test:
<<: *defaults <<: *defaults

View File

@ -29,6 +29,10 @@ server {
proxy_pass http://127.0.0.1:8080; proxy_pass http://127.0.0.1:8080;
} }
location ^~ /assets {
root /cartodb/public;
}
location / { location / {
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;

4
config/varnish.vcl Normal file
View File

@ -0,0 +1,4 @@
backend default {
.host = "127.0.0.1";
.port = "8080";
}

View File

@ -1,10 +1,9 @@
#!/bin/bash #!/bin/bash
PORT=3000
service postgresql start service postgresql start
service redis-server start service redis-server start
service varnish start /opt/varnish/sbin/varnishd -a :6081 -T localhost:6082 -s malloc,256m -f /etc/varnish.vcl
service nginx start
cd /Windshaft-cartodb cd /Windshaft-cartodb
node app.js development & node app.js development &
@ -16,5 +15,4 @@ cd /cartodb
source /usr/local/rvm/scripts/rvm source /usr/local/rvm/scripts/rvm
bundle exec script/restore_redis bundle exec script/restore_redis
bundle exec script/resque > resque.log 2>&1 & bundle exec script/resque > resque.log 2>&1 &
bundle exec rails s -p $PORT bundle exec thin start --threaded -p 3000 --threadpool-size 5

View File

@ -3,7 +3,7 @@
# Init script for template postgis # Init script for template postgis
# #
POSTGIS_SQL_PATH=`pg_config --sharedir`/contrib/postgis-2.1.2; POSTGIS_SQL_PATH=`pg_config --sharedir`/contrib/postgis-2.2;
createdb -E UTF8 template_postgis; createdb -E UTF8 template_postgis;
createlang -d template_postgis plpgsql; createlang -d template_postgis plpgsql;
psql -d postgres -c "UPDATE pg_database SET datistemplate='true' \ psql -d postgres -c "UPDATE pg_database SET datistemplate='true' \
@ -13,4 +13,3 @@ psql -d template_postgis -c "CREATE EXTENSION postgis_topology;"
psql -d template_postgis -c "GRANT ALL ON geometry_columns TO PUBLIC;" psql -d template_postgis -c "GRANT ALL ON geometry_columns TO PUBLIC;"
psql -d template_postgis -c "GRANT ALL ON spatial_ref_sys TO PUBLIC;" psql -d template_postgis -c "GRANT ALL ON spatial_ref_sys TO PUBLIC;"
psql -c "CREATE EXTENSION plpythonu;" psql -c "CREATE EXTENSION plpythonu;"
psql -c "CREATE EXTENSION schema_triggers;"