Initial commit

This commit is contained in:
Raoul Snyman 2022-12-09 08:31:45 -07:00
commit a785e9eff5
7 changed files with 234 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
# In case you end up running it from this repository
.env
data

28
Dockerfile Normal file
View File

@ -0,0 +1,28 @@
FROM alpine
# Install packages
RUN awk 'NR==2' /etc/apk/repositories | sed 's/main/community/' | tee -a /etc/apk/repositories
RUN apk update && apk add curl exiftool ffmpeg imagemagick libmagic openssl1.1-compat postgresql14-client su-exec unzip
# Create user and directories
RUN addgroup pleroma && adduser --system -G pleroma --shell /bin/false --home /opt/pleroma pleroma
RUN mkdir -p /uploads
RUN mkdir -p /static
RUN mkdir -p /config
# Download and install Pleroma
RUN curl 'https://git.pleroma.social/api/v4/projects/2/jobs/artifacts/stable/download?job=amd64-musl' -o /tmp/pleroma.zip
RUN unzip /tmp/pleroma.zip -d /tmp/
RUN mv /tmp/release/* /opt/pleroma
RUN rmdir /tmp/release && rm /tmp/pleroma.zip
# Add entrypoint script and base config
COPY ./docker-entrypoint.sh /usr/local/bin/
COPY ./config.dist.exs /opt/pleroma/
WORKDIR /opt/pleroma
ENV PLEROMA_CONFIG_PATH=/config/config.exs
VOLUME ["/uploads", "/static", "/config"]
EXPOSE 4000
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
CMD ["/opt/pleroma/bin/pleroma", "start"]

67
README.rst Normal file
View File

@ -0,0 +1,67 @@
Docker image of Pleroma
=======================
This is a Pleroma image that I created for myself. Feel free to use it if you wish.
This image will create the configuration for Pleroma, and then migrate the configuration to the database.
Set Up
------
You'll need an environment file and a Compose file.
.env
~~~~
.. code-block:: shell
POSTGRES_HOST=postgres
POSTGRES_USER=pleroma
POSTGRES_PASSWORD=pleroma
POSTGRES_DB=pleroma
DOMAIN=pleroma.yourdomain.com
PORT=443
SCHEME=https
INSTANCE_NAME=Pleroma
ADMIN_EMAIL=admin@yourdomain.com
NOTIFY_EMAIL=notify@yourdomain.com
docker-compose.yaml
~~~~~~~~~~~~~~~~~~~
.. code-block:: yaml
version: '3'
services:
postgres:
image: postgres:14
environment:
- POSTGRES_USER=${POSTGRES_USER:-pleroma}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB:-pleroma}
restart: unless-stopped
volumes:
- "./data/postgres:/var/lib/postgresql"
pleroma:
image: raoulsnyman/pleroma:latest
environment:
- POSTGRES_HOST=${POSTGRES_HOST:-postgres}
- POSTGRES_USER=${POSTGRES_USER:-pleroma}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB:-pleroma}
- DOMAIN=${DOMAIN:-localhost}
- SCHEME=${SCHEME:-http}
- PORT=${PORT:-8001}
- ADMIN_EMAIL=${ADMIN_EMAIL:-info@example.com}
- NOTIFY_EMAIL=${NOTIFY_EMAIL:-info@example.com}
- INSTANCE_NAME=${INSTANCE_NAME:-Pleroma}
restart: unless-stopped
volumes:
- "./data/config:/config"
- "./data/static:/static"
- "./data/uploads:/uploads"
ports:
- "127.0.0.1:8001:4000"
depends_on:
- postgres

67
config.dist.exs Normal file
View File

@ -0,0 +1,67 @@
import Config
config :pleroma, Pleroma.Web.Endpoint,
url: [host: System.get_env("DOMAIN", "localhost"), scheme: System.get_env("SCHEME", "http"), port: System.get_env("PORT", "8001")],
http: [ip: {0, 0, 0, 0}, port: 4000]
config :pleroma, :instance,
name: System.get_env("INSTANCE_NAME", "Pleroma"),
email: System.get_env("ADMIN_EMAIL", "info@example.com"),
notify_email: System.get_env("NOTIFY_EMAIL", "info@example.com"),
limit: 5000,
registrations_open: true,
federating: true,
healthcheck: true
config :pleroma, :media_proxy,
enabled: false,
redirect_on_failure: true,
base_url: "https://cache.domain.tld"
config :pleroma, Pleroma.Repo,
adapter: Ecto.Adapters.Postgres,
username: System.get_env("POSTGRES_USER", "pleroma"),
password: System.fetch_env!("POSTGRES_PASSWORD"),
database: System.get_env("POSTGRES_DB", "pleroma"),
hostname: System.get_env("POSTGRES_HOST", "postgres"),
pool_size: 10
config :web_push_encryption, :vapid_details, subject: "mailto:#{System.get_env("NOTIFY_EMAIL")}"
config :pleroma, :database, rum_enabled: false
config :pleroma, :instance, static_dir: "/static"
config :pleroma, Pleroma.Uploaders.Local, uploads: "/uploads"
if not File.exists?("/config/secret.exs") do
secret = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64)
signing_salt = :crypto.strong_rand_bytes(8) |> Base.encode64() |> binary_part(0, 8)
{web_push_public_key, web_push_private_key} = :crypto.generate_key(:ecdh, :prime256v1)
secret_file =
EEx.eval_string(
"""
import Config
config :pleroma, Pleroma.Web.Endpoint,
secret_key_base: "<%= secret %>",
signing_salt: "<%= signing_salt %>"
config :web_push_encryption, :vapid_details,
public_key: "<%= web_push_public_key %>",
private_key: "<%= web_push_private_key %>"
""",
secret: secret,
signing_salt: signing_salt,
web_push_public_key: Base.url_encode64(web_push_public_key, padding: false),
web_push_private_key: Base.url_encode64(web_push_private_key, padding: false)
)
File.write("/config/secret.exs", secret_file)
end
import_config("/config/secret.exs")
# For additional user config
if File.exists?("/config/config-override.exs") do
import_config("/config/config-override.exs")
end

34
docker-compose.yaml Normal file
View File

@ -0,0 +1,34 @@
version: '3'
services:
postgres:
image: postgres:14
environment:
- POSTGRES_USER=${POSTGRES_USER:-pleroma}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB:-pleroma}
restart: unless-stopped
volumes:
- "./data/postgres:/var/lib/postgresql"
pleroma:
build:
context: .
environment:
- POSTGRES_HOST=${POSTGRES_HOST:-postgres}
- POSTGRES_USER=${POSTGRES_USER:-pleroma}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB:-pleroma}
- DOMAIN=${DOMAIN:-localhost}
- SCHEME=${SCHEME:-http}
- PORT=${PORT:-8001}
- ADMIN_EMAIL=${ADMIN_EMAIL:-info@example.com}
- NOTIFY_EMAIL=${NOTIFY_EMAIL:-info@example.com}
- INSTANCE_NAME=${INSTANCE_NAME:-Pleroma}
restart: unless-stopped
volumes:
- "./data/config:/config"
- "./data/static:/static"
- "./data/uploads:/uploads"
ports:
- "127.0.0.1:8001:4000"
depends_on:
- postgres

25
docker-entrypoint.sh Executable file
View File

@ -0,0 +1,25 @@
#!/bin/sh
set -e
# Wait for DB
while ! pg_isready -U ${POSTGRES_USER:-pleroma} -d postgres://${POSTGRES_HOST:-postgres}:${POSTGRES_PORT:-5432}/${POSTGRES_DB:-pleroma} -t 1; do
echo "Waiting for ${POSTGRES_HOST} to come up..."
sleep 1
done
# Fix the user on the config directory and re-run the script as the pleroma user
chown pleroma:pleroma -R /config /uploads /static /opt/pleroma
# Create config file, if necessary
if [ ! -f "/config/config.exs" ]; then
/sbin/su-exec pleroma cp /opt/pleroma/config.dist.exs /config/config.exs
/sbin/su-exec pleroma /opt/pleroma/bin/pleroma_ctl migrate
/sbin/su-exec pleroma /opt/pleroma/bin/pleroma_ctl config migrate_to_db
/sbin/su-exec pleroma echo "config :pleroma, configurable_from_database: true" >> /config/config.exs
fi
# Migrate database
/sbin/su-exec pleroma /opt/pleroma/bin/pleroma_ctl migrate
# Run Pleroma as the "pleroma" user
exec /sbin/su-exec pleroma "$@"

10
example.env Normal file
View File

@ -0,0 +1,10 @@
POSTGRES_HOST=postgres
POSTGRES_USER=pleroma
POSTGRES_PASSWORD=pleroma
POSTGRES_DB=pleroma
DOMAIN=pleroma.example.com
PORT=443
SCHEME=https
INSTANCE_NAME=Pleroma
ADMIN_EMAIL=info@example.com
NOTIFY_EMAIL=info@example.com