Deploying an Amber site seems like it might be really straightforward because it comes with a Dockerfile right out of the generator, but that Dockerfile is designed for use as a development environment.
In order to speed up deployments and reuse code across deployments, I built an Amber image which has the amber binary already built, and nodejs pre-installed. It’s available on Docker Hub.
FROM crystallang/crystal:0.23.1 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -qq && apt-get install -y --no-install-recommends libpq-dev libsqlite3-dev libmysqlclient-dev libreadline-dev git curl RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - RUN apt-get install -y --no-install-recommends nodejs WORKDIR /amber RUN echo '\ name: amber_binary \n\ version: 0.0.1 \n\ crystal: 0.23.1 \n\ \n\ targets: \n\ amber: \n\ main: lib/amber/src/amber/cli.cr \n\ \n\ dependencies: \n\ amber: \n\ github: amberframework/amber \n\ \n\ ' >> /amber/shard.yml RUN shards build amber RUN ln -s /amber/bin/amber /usr/local/bin
Importantly, this links amber
into the path for use with migrations and other tasks.
Then, a Dockerfile for releasing any given Amber site is fairly straightforward:
FROM robacarp/amber_build:latest WORKDIR /app COPY package.json . RUN npm install COPY config ./config COPY db ./db COPY public ./public COPY src ./src COPY shard.yml . COPY shard.lock . COPY app.json . RUN shards install RUN npm run release RUN shards build my_app --production ENV AMBER_ENV production ENV DATABASE_URL postgres://my_app:@docker.for.mac.localhost:5432/app_development ENV REDIS_URL redis://docker.for.mac.localhost:6379/1 EXPOSE 3000 ENTRYPOINT ["/bin/sh","-c"] CMD ["bin/my_app"]
This Dockerfile is organized specifically with npm install
at the top to make it unlikely it’ll ever need to be run.
DATABASE_URL
and REDIS_URL
are both pre-set for use with docker for mac, assuming that the databases are hosted on the mac and not some other docker container. These should be over-ridden at deployment.