diff --git a/Dockerfile b/Dockerfile index 70034c3..467f766 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,6 +11,12 @@ ENV \ NODE_ENV=production \ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/mastodon/app/bin +ARG UID=991 +ARG GID=991 + +# mastodon v3.0.1 +ARG REPO_URL=https://github.com/tootsuite/mastodon.git +ARG REPO_REV=c4118ba71ba31e408c02d289e111326ccc6f6aa2 # install os prereq stuff to image ADD prereqs.sh /tmp/prereqs.sh @@ -25,7 +31,13 @@ RUN chpst -u mastodon:mastodon bash /tmp/install.sh ADD ./rootfs / -RUN chmod +x /usr/local/bin/* /etc/service/*/run +RUN chmod +x /etc/service/postfix/run +RUN chmod +x /etc/service/redis/run +RUN chmod +x /etc/service/postgres/run +RUN chmod +x /etc/service/startup/run +RUN chmod +x /etc/service/sidekiq/run +RUN chmod +x /etc/service/web/run +RUN chmod +x /etc/service/streaming/run VOLUME /state diff --git a/Makefile b/Makefile index cb5ea2a..98458cf 100644 --- a/Makefile +++ b/Makefile @@ -6,4 +6,5 @@ build: docker build -t $(NAME) . run: - docker run -ti $(NAME) + -docker rm -f mastodon + docker run --env WEB_DOMAIN="test123.example.com" --hostname mastodon --name mastodon -ti $(NAME) diff --git a/install.sh b/install.sh index 2386bdd..35d2a66 100644 --- a/install.sh +++ b/install.sh @@ -14,10 +14,9 @@ rbenv global 2.6.5 gem update --system gem install bundler --no-document -git clone https://github.com/tootsuite/mastodon.git /mastodon/app +git clone $REPO_URL /mastodon/app cd /mastodon/app -# v3.0.1: -git checkout c4118ba71ba31e408c02d289e111326ccc6f6aa2 +git checkout $REPO_REV bundle config build.nokogiri --use-system-libraries bundle install \ diff --git a/prereqs.sh b/prereqs.sh index c5748b1..273e14b 100644 --- a/prereqs.sh +++ b/prereqs.sh @@ -50,16 +50,19 @@ apt install -y \ libxml2-dev \ libxslt1-dev \ libyaml-dev \ + mailutils \ nginx \ nodejs \ pkg-config \ + postfix \ postgresql \ postgresql-contrib \ protobuf-compiler \ redis-server \ redis-tools \ + rsync \ yarn \ zlib1g-dev -addgroup --gid 991 mastodon -useradd --uid 991 --gid 991 -m -d /mastodon mastodon +addgroup --gid $GID mastodon +useradd --uid $UID --gid $GID --shell /bin/bash -m -d /mastodon mastodon diff --git a/rootfs/etc/service/postfix/run b/rootfs/etc/service/postfix/run index fa28a60..07daea2 100644 --- a/rootfs/etc/service/postfix/run +++ b/rootfs/etc/service/postfix/run @@ -1,5 +1,70 @@ #!/bin/bash +POSTFIX='/usr/sbin/postfix' +MONITOR_INTERVAL=10 # seconds -echo "postfix starting..." +exec 2>&1 -exec /usr/lib/postfix/master +if [[ ! -d /state/envdir ]]; then + mkdir -p /state/envdir + chown mastodon:mastodon /state/envdir +fi + +if [[ ! -e /state/envdir/WEB_DOMAIN ]]; then + if [[ -n "$WEB_DOMAIN" ]]; then + echo "$WEB_DOMAIN" > /state/envdir/WEB_DOMAIN + else + hostname --fqdn > /state/envdir/WEB_DOMAIN + fi + chown mastodon:mastodon /state/envdir/* +fi + +cat /etc/postfix/main.cf | grep -v '^myhostname' > /etc/postfix/main.new +rm /etc/postfix/main.cf +echo "myhostname = $(cat /state/envdir/WEB_DOMAIN)" >> /etc/postfix/main.cf +echo "myorigin = $(cat /state/envdir/WEB_DOMAIN)" >> /etc/postfix/main.cf +cat /etc/postfix/main.new >> /etc/postfix/main.cf +rm /etc/postfix/main.new + +running() { + pkill -0 master +} + +start() { + echo "postfix starting..." + /etc/init.d/postfix start +} + +stop() { + if running; then + echo Stopping + /etc/init.d/postfix stop + fi +} + +reload() { + echo Reloading + /etc/init.d/postfix reload +} + +check() { + echo Checking + "$POSTFIX" check +} + +status() { + "$POSTFIX" status +} + + +trap 'echo INT; stop; exit' INT +trap 'echo QUIT; stop; exit' QUIT +trap 'echo TERM; stop; exit' TERM +trap 'echo STOP; stop' STOP +trap 'echo HUP; reload' HUP +trap 'echo USR1; check' USR1 +trap 'echo USR2; status' USR2 + +while :; do + running || start + sleep $MONITOR_INTERVAL +done diff --git a/rootfs/etc/service/postgres/run b/rootfs/etc/service/postgres/run index 6854ae0..e36f1b3 100644 --- a/rootfs/etc/service/postgres/run +++ b/rootfs/etc/service/postgres/run @@ -2,7 +2,28 @@ echo "postgres starting..." -mkdir -p /state/db -chown mastodon:mastodon /state/db -exec chpst -u mastodon:mastodon /usr/lib/postgresql/bin/postmaster \ - -D /state/db 2>&1 +chown mastodon:mastodon /var/run/postgresql +chown -R mastodon:mastodon /etc/postgresql + +echo "local all all peer" > /etc/postgresql/10/main/pg_hba.conf +echo "local all mastodon peer" >> /etc/postgresql/10/main/pg_hba.conf +echo "local all root peer" >> /etc/postgresql/10/main/pg_hba.conf +echo "host all all 127.0.0.0/8 trust" >> /etc/postgresql/10/main/pg_hba.conf + +if [[ ! -d /state/db ]]; then + mkdir -p /state/db/data + rsync -a /var/lib/postgresql/10/main/ /state/db/data/ + cp -a /etc/postgresql/10/main/* /state/db/ + grep -v '^data_directory' /state/db/postgresql.conf | + grep -v "^ssl" | + grep -v "^stats_temp_directory" > /state/db/postgresql.new + echo "data_directory = '/state/db/data'" >> /state/db/postgresql.new + echo "stats_temp_directory = '/tmp'" >> /state/db/postgresql.new + mv /state/db/postgresql.new /state/db/postgresql.conf + chown -R mastodon:mastodon /state/db + chmod go-rwx /state/db/data +fi + +exec \ + chpst -u mastodon:mastodon \ + /usr/lib/postgresql/10/bin/postmaster -D /state/db 2>&1 diff --git a/rootfs/etc/service/redis/run b/rootfs/etc/service/redis/run index 308099c..3b1710e 100644 --- a/rootfs/etc/service/redis/run +++ b/rootfs/etc/service/redis/run @@ -2,4 +2,11 @@ mkdir -p /state/redis chown mastodon:mastodon /state/redis -exec chpst -u mastodon:mastodon /usr/bin/redis-server /etc/redis/redis.conf +exec chpst -u mastodon:mastodon /usr/bin/redis-server - < /state/envdir/HOME fi +if [[ ! -e /state/envdir/RAILS_ENV ]]; then + echo "production" > /state/envdir/RAILS_ENV +fi + +chown mastodon:mastodon /state/envdir /state/envdir/* + cd /mastodon/app -if [ "$RUN_DB_MIGRATIONS" == "true" ]; then +if [[ ! -e /state/envdir/OTP_SECRET ]]; then + envdir /state/envdir \ + chpst -u mastodon:mastodon \ + bash -i -c "bundle exec rake secret > /state/envdir/OTP_SECRET" +fi + +if [[ ! -e /state/envdir/SECRET_KEY_BASE ]]; then + envdir /state/envdir \ + chpst -u mastodon:mastodon \ + bash -i -c "bundle exec rake secret > /state/envdir/SECRET_KEY_BASE" +fi + +echo " + create database mastodon_production; + create user mastodon createdb; + grant all privileges on database mastodon_production to mastodon; +" | chpst -u postgres:postgres psql + +if [[ -n "$RUN_DB_MIGRATIONS" ]]; then echo "Running database migrations..." - envdir /state/envdir chpst -u mastodon:mastodon bash -c "bundle exec rake db:migrate" + envdir /state/envdir \ + chpst -u mastodon:mastodon \ + bash -i -c "bundle exec rake db:migrate" fi rm /state/.starting diff --git a/rootfs/etc/service/streaming/run b/rootfs/etc/service/streaming/run index 44f5d61..a7d3595 100644 --- a/rootfs/etc/service/streaming/run +++ b/rootfs/etc/service/streaming/run @@ -8,4 +8,7 @@ done echo "streaming starting..." cd /mastodon/app -exec envdir /state/envdir chpst -u mastodon:mastodon bash -c "npm run start" +exec \ + envdir /state/envdir \ + chpst -u mastodon:mastodon \ + bash -i -c "npm run start" diff --git a/rootfs/etc/service/web/run b/rootfs/etc/service/web/run index 6a92d54..51c4cc7 100644 --- a/rootfs/etc/service/web/run +++ b/rootfs/etc/service/web/run @@ -8,4 +8,7 @@ done echo "web starting..." cd /mastodon/app -exec envdir /state/envdir chpst -u mastodon:mastodon bash -c "bundle exec puma -C config/puma.rb" +exec \ + envdir /state/envdir \ + chpst -u mastodon:mastodon \ + bash -i -c "bundle exec puma -C config/puma.rb"