Browse Source

Merge branch 'asonix/makefile' of asonix/mastodon into asonix/changes

asonix/changes
Arlo (Hyena) 3 months ago
parent
commit
40776d1c91
7 changed files with 171 additions and 103 deletions
  1. +24
    -0
      Makefile
  2. +0
    -36
      build-images.sh
  3. +67
    -0
      container/Dockerfile
  4. +2
    -67
      container/Dockerfile-deps
  5. +42
    -0
      container/build-images.sh
  6. +13
    -0
      container/pull-containers.sh
  7. +23
    -0
      container/push-containers.sh

+ 24
- 0
Makefile View File

@@ -0,0 +1,24 @@
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
IMAGE_NAME = "asonix/masto-deps"

masto: pull-deps images push-images

all: pull-base deps push-deps pull-deps images push-images

pull-base:
./container/pull-containers.sh

deps:
./container/build-images.sh container/Dockerfile-deps $(IMAGE_NAME)

push-deps:
./container/push-containers.sh $(IMAGE_NAME)

pull-deps:
./container/pull-containers.sh $(IMAGE_NAME)

images:
./container/build-images.sh container/Dockerfile "$(GIT_BRANCH)"

push-images:
./container/push-containers.sh $(GIT_BRANCH)

+ 0
- 36
build-images.sh View File

@@ -1,36 +0,0 @@
#!/usr/bin/env bash

set -xe

TAG=$1

require_input() {
input=$1
name=$2

if [ "$input" == "" ]; then
echo "Input, $name, required but not present"
exit 1;
fi
}

require_input "$TAG" "container tag"

architectures=('arm64v8' 'arm32v7' 'amd64')

for architecture in "${architectures[@]}"; do
sed "s/FROM ubuntu/FROM $architecture\/ubuntu/g" Dockerfile > "Dockerfile-$architecture"
if [ "$architecture" == arm32v7 ]; then
sed -i'' 's/x64/armv7l/g' "Dockerfile-$architecture" # for node
sed -i'' 's/amd64/armhf/g' "Dockerfile-$architecture" # for tini
fi

if [ "$architecture" == arm64v8 ]; then
sed -i'' 's/x64/arm64/g' "Dockerfile-$architecture" # for node
sed -i'' 's/amd64/arm64/g' "Dockerfile-$architecture" # for tini
fi

buildah build-using-dockerfile -f "Dockerfile-$architecture" -t "$TAG-$architecture" .

rm "Dockerfile-$architecture"
done

+ 67
- 0
container/Dockerfile View File

@@ -0,0 +1,67 @@
FROM asonix/masto-deps:amd64 as build-dep

# Use bash for the shell
SHELL ["bash", "-c"]

COPY Gemfile* package.json yarn.lock /opt/mastodon/

RUN cd /opt/mastodon && \
bundle install -j$(nproc) --deployment --without development test && \
yarn install --pure-lockfile

FROM amd64/ubuntu:18.04

# Copy over all the langs needed for runtime
COPY --from=build-dep /opt/node /opt/node
COPY --from=build-dep /opt/ruby /opt/ruby
COPY --from=build-dep /opt/jemalloc /opt/jemalloc
COPY --from=build-dep /tini /tini

RUN chmod +rx /tini

# Add more PATHs to the PATH
ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin"

# Create the mastodon user
ARG UID=991
ARG GID=991
RUN apt update && \
echo "Etc/UTC" > /etc/localtime && \
ln -s /opt/jemalloc/lib/* /usr/lib/ && \
apt install -y whois wget && \
addgroup --gid $GID mastodon && \
useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \
echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd

# Install mastodon runtime deps
RUN apt -y --no-install-recommends install \
libssl1.1 libpq5 imagemagick ffmpeg \
libicu60 libprotobuf10 libidn11 libyaml-0-2 \
file ca-certificates tzdata libreadline7 && \
apt -y install gcc && \
ln -s /opt/mastodon /mastodon && \
gem install bundler

# Copy over mastodon source, and dependencies from building, and set permissions
COPY --chown=mastodon:mastodon . /opt/mastodon
COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon

# Run mastodon services in prod mode
ENV RAILS_ENV="production"
ENV NODE_ENV="production"

# Tell rails to serve static files
ENV RAILS_SERVE_STATIC_FILES="true"
ENV BIND="0.0.0.0"

# Set the run user
USER mastodon

# Precompile assets
RUN cd ~ && \
OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \
yarn cache clean

# Set the work dir and the container entry point
WORKDIR /opt/mastodon
ENTRYPOINT ["/tini", "--"]

Dockerfile → container/Dockerfile-deps View File

@@ -1,7 +1,4 @@
FROM ubuntu:18.04 as build-dep

# Use bash for the shell
SHELL ["bash", "-c"]
FROM amd64/ubuntu:18.04

# Install Node
ENV NODE_VER="12.11.1"
@@ -56,42 +53,6 @@ RUN npm install -g yarn && \
apt -y install git libicu-dev libidn11-dev \
libpq-dev libprotobuf-dev protobuf-compiler

COPY Gemfile* package.json yarn.lock /opt/mastodon/

RUN cd /opt/mastodon && \
bundle install -j$(nproc) --deployment --without development test && \
yarn install --pure-lockfile

FROM ubuntu:18.04

# Copy over all the langs needed for runtime
COPY --from=build-dep /opt/node /opt/node
COPY --from=build-dep /opt/ruby /opt/ruby
COPY --from=build-dep /opt/jemalloc /opt/jemalloc

# Add more PATHs to the PATH
ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin"

# Create the mastodon user
ARG UID=991
ARG GID=991
RUN apt update && \
echo "Etc/UTC" > /etc/localtime && \
ln -s /opt/jemalloc/lib/* /usr/lib/ && \
apt install -y whois wget && \
addgroup --gid $GID mastodon && \
useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \
echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd

# Install mastodon runtime deps
RUN apt -y --no-install-recommends install \
libssl1.1 libpq5 imagemagick ffmpeg \
libicu60 libprotobuf10 libidn11 libyaml-0-2 \
file ca-certificates tzdata libreadline7 && \
apt -y install gcc && \
ln -s /opt/mastodon /mastodon && \
gem install bundler

# Add tini
ENV TINI_VERSION="0.18.0"
ENV TINI_ARCH="amd64"
@@ -99,9 +60,7 @@ ADD https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini-${TI
ADD https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini-${TINI_ARCH}.asc /tini.asc

RUN apt update && \
apt -y --no-install-recommends install gpg gpg-agent dirmngr && \
rm -rf /var/cache && \
rm -rf /var/lib/apt/lists/*
apt -y --no-install-recommends install gpg gpg-agent dirmngr

RUN gpg --batch \
--keyserver hkp://p80.pool.sks-keyservers.net:80 \
@@ -109,27 +68,3 @@ RUN gpg --batch \
gpg --batch --verify /tini.asc /tini

RUN chmod +rx /tini

# Copy over mastodon source, and dependencies from building, and set permissions
COPY --chown=mastodon:mastodon . /opt/mastodon
COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon

# Run mastodon services in prod mode
ENV RAILS_ENV="production"
ENV NODE_ENV="production"

# Tell rails to serve static files
ENV RAILS_SERVE_STATIC_FILES="true"
ENV BIND="0.0.0.0"

# Set the run user
USER mastodon

# Precompile assets
RUN cd ~ && \
OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \
yarn cache clean

# Set the work dir and the container entry point
WORKDIR /opt/mastodon
ENTRYPOINT ["/tini", "--"]

+ 42
- 0
container/build-images.sh View File

@@ -0,0 +1,42 @@
#!/usr/bin/env bash

set -xe

SOURCE=$1
TAG=$2

require_input() {
input=$1
name=$2

if [ "$input" == "" ]; then
echo "Input, $name, required but not present"
exit 1;
fi
}

require_input "$SOURCE" "Dockerfile"
require_input "$TAG" "container tag"

ARCHITECTURES=('arm64v8' 'arm32v7' 'amd64')

for architecture in "${ARCHITECTURES[@]}"; do
cp "$SOURCE" "$SOURCE-$architecture"
if [ "$architecture" == arm32v7 ]; then
sed -i'' 's/:amd64/:arm32v7/g' "$SOURCE-$architecture" # source image
sed -i'' 's/FROM amd64/FROM arm32v7/g' "$SOURCE-$architecture" # source image
sed -i'' 's/x64/armv7l/g' "$SOURCE-$architecture" # for node
sed -i'' 's/amd64/armhf/g' "$SOURCE-$architecture" # for tini
fi

if [ "$architecture" == arm64v8 ]; then
sed -i'' 's/:amd64/:arm64v8/g' "$SOURCE-$architecture" # source image
sed -i'' 's/FROM amd64/FROM arm64v8/g' "$SOURCE-$architecture" # source image
sed -i'' 's/x64/arm64/g' "$SOURCE-$architecture" # for node
sed -i'' 's/amd64/arm64/g' "$SOURCE-$architecture" # for tini
fi

buildah build-using-dockerfile -f "$SOURCE-$architecture" -t "$TAG:$architecture" .

rm "$SOURCE-$architecture"
done

+ 13
- 0
container/pull-containers.sh View File

@@ -0,0 +1,13 @@
#!/usr/bin/env bash

set -xe

architectures=('arm64v8' 'arm32v7' 'amd64')

for architecture in "${architectures[@]}"; do
if [ "$1" == "" ]; then
podman pull "$architecture/ubuntu:18.04"
else
podman pull "$1:$architecture"
fi
done

+ 23
- 0
container/push-containers.sh View File

@@ -0,0 +1,23 @@
#!/usr/bin/env bash

set -xe

TAG=$1

require_input() {
input=$1
name=$2

if [ "$input" == "" ]; then
echo "Input, $name, required but not present"
exit 1;
fi
}

require_input "$TAG" "container tag"

ARCHITECTURES=('arm64v8' 'arm32v7' 'amd64')

for arch in "${ARCHITECTURES[@]}"; do
podman push "$TAG:$arch" "docker://docker.io/$TAG:$arch"
done

Loading…
Cancel
Save