2018-12-23 21:05:55 +01:00
|
|
|
# Pleroma: A lightweight social networking server
|
|
|
|
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
|
|
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
2018-12-02 19:18:06 +01:00
|
|
|
defmodule Mix.Tasks.Pleroma.Instance do
|
2018-06-29 02:24:51 +02:00
|
|
|
use Mix.Task
|
2019-06-20 01:05:19 +02:00
|
|
|
import Mix.Pleroma
|
2018-06-29 02:24:51 +02:00
|
|
|
|
2018-12-02 19:18:06 +01:00
|
|
|
@shortdoc "Manages Pleroma instance"
|
2018-06-29 02:24:51 +02:00
|
|
|
@moduledoc """
|
2018-12-02 19:18:06 +01:00
|
|
|
Manages Pleroma instance.
|
2018-06-29 02:24:51 +02:00
|
|
|
|
2018-12-02 20:26:15 +01:00
|
|
|
## Generate a new instance config.
|
2018-12-02 19:20:50 +01:00
|
|
|
|
2018-12-04 19:00:45 +01:00
|
|
|
mix pleroma.instance gen [OPTION...]
|
2018-06-29 02:24:51 +02:00
|
|
|
|
2018-12-02 19:18:06 +01:00
|
|
|
If any options are left unspecified, you will be prompted interactively
|
2018-06-29 02:24:51 +02:00
|
|
|
|
|
|
|
## Options
|
|
|
|
|
|
|
|
- `-f`, `--force` - overwrite any output files
|
|
|
|
- `-o PATH`, `--output PATH` - the output file for the generated configuration
|
|
|
|
- `--output-psql PATH` - the output file for the generated PostgreSQL setup
|
|
|
|
- `--domain DOMAIN` - the domain of your instance
|
|
|
|
- `--instance-name INSTANCE_NAME` - the name of your instance
|
|
|
|
- `--admin-email ADMIN_EMAIL` - the email address of the instance admin
|
2019-04-10 12:57:41 +02:00
|
|
|
- `--notify-email NOTIFY_EMAIL` - email address for notifications
|
2018-06-29 02:24:51 +02:00
|
|
|
- `--dbhost HOSTNAME` - the hostname of the PostgreSQL database to use
|
|
|
|
- `--dbname DBNAME` - the name of the database to use
|
|
|
|
- `--dbuser DBUSER` - the user (aka role) to use for the database connection
|
|
|
|
- `--dbpass DBPASS` - the password to use for the database connection
|
2019-06-22 11:54:16 +02:00
|
|
|
- `--rum Y/N` - Whether to enable RUM indexes
|
2019-04-10 12:57:41 +02:00
|
|
|
- `--indexable Y/N` - Allow/disallow indexing site by search engines
|
2019-06-14 17:45:05 +02:00
|
|
|
- `--db-configurable Y/N` - Allow/disallow configuring instance from admin part
|
2019-06-20 02:59:16 +02:00
|
|
|
- `--uploads-dir` - the directory uploads go in when using a local uploader
|
|
|
|
- `--static-dir` - the directory custom public files should be read from (custom emojis, frontend bundle overrides, robots.txt, etc.)
|
2018-06-29 02:24:51 +02:00
|
|
|
"""
|
|
|
|
|
2018-12-04 19:00:45 +01:00
|
|
|
def run(["gen" | rest]) do
|
2018-06-29 02:24:51 +02:00
|
|
|
{options, [], []} =
|
|
|
|
OptionParser.parse(
|
|
|
|
rest,
|
|
|
|
strict: [
|
|
|
|
force: :boolean,
|
|
|
|
output: :string,
|
|
|
|
output_psql: :string,
|
|
|
|
domain: :string,
|
|
|
|
instance_name: :string,
|
|
|
|
admin_email: :string,
|
2019-04-10 12:57:41 +02:00
|
|
|
notify_email: :string,
|
2018-06-29 02:24:51 +02:00
|
|
|
dbhost: :string,
|
|
|
|
dbname: :string,
|
|
|
|
dbuser: :string,
|
2019-04-10 12:57:41 +02:00
|
|
|
dbpass: :string,
|
2019-06-22 11:54:16 +02:00
|
|
|
rum: :string,
|
2019-06-14 17:45:05 +02:00
|
|
|
indexable: :string,
|
2019-06-20 02:59:16 +02:00
|
|
|
db_configurable: :string,
|
|
|
|
uploads_dir: :string,
|
|
|
|
static_dir: :string
|
2018-06-29 02:24:51 +02:00
|
|
|
],
|
|
|
|
aliases: [
|
|
|
|
o: :output,
|
|
|
|
f: :force
|
|
|
|
]
|
|
|
|
)
|
|
|
|
|
|
|
|
paths =
|
|
|
|
[config_path, psql_path] = [
|
|
|
|
Keyword.get(options, :output, "config/generated_config.exs"),
|
|
|
|
Keyword.get(options, :output_psql, "config/setup_db.psql")
|
|
|
|
]
|
|
|
|
|
|
|
|
will_overwrite = Enum.filter(paths, &File.exists?/1)
|
|
|
|
proceed? = Enum.empty?(will_overwrite) or Keyword.get(options, :force, false)
|
|
|
|
|
2019-04-10 12:57:41 +02:00
|
|
|
if proceed? do
|
2018-12-15 11:00:54 +01:00
|
|
|
[domain, port | _] =
|
|
|
|
String.split(
|
2019-06-20 01:05:19 +02:00
|
|
|
get_option(
|
2018-12-15 11:00:54 +01:00
|
|
|
options,
|
|
|
|
:domain,
|
|
|
|
"What domain will your instance use? (e.g pleroma.soykaf.com)"
|
|
|
|
),
|
|
|
|
":"
|
|
|
|
) ++ [443]
|
2018-06-29 02:24:51 +02:00
|
|
|
|
|
|
|
name =
|
2019-06-20 01:05:19 +02:00
|
|
|
get_option(
|
2018-12-06 18:01:28 +01:00
|
|
|
options,
|
2018-12-29 12:43:54 +01:00
|
|
|
:instance_name,
|
2018-12-06 18:01:28 +01:00
|
|
|
"What is the name of your instance? (e.g. Pleroma/Soykaf)"
|
|
|
|
)
|
2018-06-29 02:24:51 +02:00
|
|
|
|
2019-06-20 01:05:19 +02:00
|
|
|
email = get_option(options, :admin_email, "What is your admin email address?")
|
2018-12-02 20:04:33 +01:00
|
|
|
|
2019-04-10 12:57:41 +02:00
|
|
|
notify_email =
|
2019-06-20 01:05:19 +02:00
|
|
|
get_option(
|
2019-04-10 12:57:41 +02:00
|
|
|
options,
|
|
|
|
:notify_email,
|
|
|
|
"What email address do you want to use for sending email notifications?",
|
|
|
|
email
|
|
|
|
)
|
|
|
|
|
2019-04-02 21:09:16 +02:00
|
|
|
indexable =
|
2019-06-20 01:05:19 +02:00
|
|
|
get_option(
|
2019-04-02 21:09:16 +02:00
|
|
|
options,
|
|
|
|
:indexable,
|
|
|
|
"Do you want search engines to index your site? (y/n)",
|
|
|
|
"y"
|
|
|
|
) === "y"
|
|
|
|
|
2019-06-14 17:45:05 +02:00
|
|
|
db_configurable? =
|
2019-06-20 01:05:19 +02:00
|
|
|
get_option(
|
2019-06-14 17:45:05 +02:00
|
|
|
options,
|
|
|
|
:db_configurable,
|
2019-06-20 02:59:16 +02:00
|
|
|
"Do you want to store the configuration in the database (allows controlling it from admin-fe)? (y/n)",
|
2019-06-21 05:42:04 +02:00
|
|
|
"n"
|
2019-06-14 17:45:05 +02:00
|
|
|
) === "y"
|
2018-12-02 20:04:33 +01:00
|
|
|
|
2019-06-20 01:05:19 +02:00
|
|
|
dbhost = get_option(options, :dbhost, "What is the hostname of your database?", "localhost")
|
2018-12-02 20:04:33 +01:00
|
|
|
|
2019-06-21 05:42:04 +02:00
|
|
|
dbname = get_option(options, :dbname, "What is the name of your database?", "pleroma")
|
2018-06-29 02:24:51 +02:00
|
|
|
|
|
|
|
dbuser =
|
2019-06-20 01:05:19 +02:00
|
|
|
get_option(
|
2018-12-02 20:04:33 +01:00
|
|
|
options,
|
|
|
|
:dbuser,
|
|
|
|
"What is the user used to connect to your database?",
|
|
|
|
"pleroma"
|
|
|
|
)
|
2018-06-29 02:24:51 +02:00
|
|
|
|
|
|
|
dbpass =
|
2019-06-20 01:05:19 +02:00
|
|
|
get_option(
|
2018-12-02 20:04:33 +01:00
|
|
|
options,
|
|
|
|
:dbpass,
|
|
|
|
"What is the password used to connect to your database?",
|
|
|
|
:crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64),
|
|
|
|
"autogenerated"
|
|
|
|
)
|
2018-06-29 02:24:51 +02:00
|
|
|
|
2019-06-22 11:54:16 +02:00
|
|
|
rum_enabled =
|
|
|
|
get_option(
|
|
|
|
options,
|
|
|
|
:rum,
|
|
|
|
"Would you like to use RUM indices?",
|
|
|
|
"n"
|
|
|
|
) === "y"
|
|
|
|
|
2019-06-20 02:59:16 +02:00
|
|
|
uploads_dir =
|
|
|
|
get_option(
|
|
|
|
options,
|
2019-07-05 06:19:27 +02:00
|
|
|
:uploads_dir,
|
2019-06-20 02:59:16 +02:00
|
|
|
"What directory should media uploads go in (when using the local uploader)?",
|
|
|
|
Pleroma.Config.get([Pleroma.Uploaders.Local, :uploads])
|
|
|
|
)
|
|
|
|
|
|
|
|
static_dir =
|
|
|
|
get_option(
|
|
|
|
options,
|
|
|
|
:static_dir,
|
|
|
|
"What directory should custom public files be read from (custom emojis, frontend bundle overrides, robots.txt, etc.)?",
|
|
|
|
Pleroma.Config.get([:instance, :static_dir])
|
|
|
|
)
|
|
|
|
|
2018-06-29 02:24:51 +02:00
|
|
|
secret = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64)
|
2019-04-20 14:42:19 +02:00
|
|
|
jwt_secret = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64)
|
2019-01-21 01:16:41 +01:00
|
|
|
signing_salt = :crypto.strong_rand_bytes(8) |> Base.encode64() |> binary_part(0, 8)
|
2018-12-06 18:16:51 +01:00
|
|
|
{web_push_public_key, web_push_private_key} = :crypto.generate_key(:ecdh, :prime256v1)
|
2019-06-21 18:30:25 +02:00
|
|
|
template_dir = Application.app_dir(:pleroma, "priv") <> "/templates"
|
2018-06-29 02:24:51 +02:00
|
|
|
|
|
|
|
result_config =
|
|
|
|
EEx.eval_file(
|
2019-06-21 18:30:25 +02:00
|
|
|
template_dir <> "/sample_config.eex",
|
2018-06-29 02:24:51 +02:00
|
|
|
domain: domain,
|
2018-12-15 11:00:54 +01:00
|
|
|
port: port,
|
2018-06-29 02:24:51 +02:00
|
|
|
email: email,
|
2019-04-10 12:57:41 +02:00
|
|
|
notify_email: notify_email,
|
2018-06-29 02:24:51 +02:00
|
|
|
name: name,
|
|
|
|
dbhost: dbhost,
|
|
|
|
dbname: dbname,
|
|
|
|
dbuser: dbuser,
|
|
|
|
dbpass: dbpass,
|
2018-12-06 18:16:51 +01:00
|
|
|
secret: secret,
|
2019-04-20 14:42:19 +02:00
|
|
|
jwt_secret: jwt_secret,
|
2019-01-21 01:16:41 +01:00
|
|
|
signing_salt: signing_salt,
|
2018-12-06 18:16:51 +01:00
|
|
|
web_push_public_key: Base.url_encode64(web_push_public_key, padding: false),
|
2019-06-14 17:45:05 +02:00
|
|
|
web_push_private_key: Base.url_encode64(web_push_private_key, padding: false),
|
2019-06-20 02:59:16 +02:00
|
|
|
db_configurable?: db_configurable?,
|
|
|
|
static_dir: static_dir,
|
2019-06-22 11:54:16 +02:00
|
|
|
uploads_dir: uploads_dir,
|
|
|
|
rum_enabled: rum_enabled
|
2018-06-29 02:24:51 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
result_psql =
|
|
|
|
EEx.eval_file(
|
2019-06-21 18:30:25 +02:00
|
|
|
template_dir <> "/sample_psql.eex",
|
2018-06-29 02:24:51 +02:00
|
|
|
dbname: dbname,
|
|
|
|
dbuser: dbuser,
|
2019-06-22 11:54:16 +02:00
|
|
|
dbpass: dbpass,
|
|
|
|
rum_enabled: rum_enabled
|
2018-06-29 02:24:51 +02:00
|
|
|
)
|
|
|
|
|
2019-06-22 01:07:05 +02:00
|
|
|
shell_info("Writing config to #{config_path}.")
|
2018-06-29 02:24:51 +02:00
|
|
|
|
|
|
|
File.write(config_path, result_config)
|
2019-06-22 01:07:05 +02:00
|
|
|
shell_info("Writing the postgres script to #{psql_path}.")
|
2018-06-29 02:24:51 +02:00
|
|
|
File.write(psql_path, result_psql)
|
|
|
|
|
2019-06-21 18:30:25 +02:00
|
|
|
write_robots_txt(indexable, template_dir)
|
2019-04-02 21:09:16 +02:00
|
|
|
|
2019-06-20 01:05:19 +02:00
|
|
|
shell_info(
|
2019-06-22 01:07:05 +02:00
|
|
|
"\n All files successfully written! Refer to the installation instructions for your platform for next steps"
|
2018-06-29 02:24:51 +02:00
|
|
|
)
|
|
|
|
else
|
2019-06-20 01:05:19 +02:00
|
|
|
shell_error(
|
2018-06-29 02:24:51 +02:00
|
|
|
"The task would have overwritten the following files:\n" <>
|
|
|
|
(Enum.map(paths, &"- #{&1}\n") |> Enum.join("")) <>
|
|
|
|
"Rerun with `--force` to overwrite them."
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
2019-04-02 21:09:16 +02:00
|
|
|
|
2019-06-21 18:30:25 +02:00
|
|
|
defp write_robots_txt(indexable, template_dir) do
|
2019-04-02 21:09:16 +02:00
|
|
|
robots_txt =
|
|
|
|
EEx.eval_file(
|
2019-06-21 18:30:25 +02:00
|
|
|
template_dir <> "/robots_txt.eex",
|
2019-04-02 21:09:16 +02:00
|
|
|
indexable: indexable
|
|
|
|
)
|
|
|
|
|
|
|
|
static_dir = Pleroma.Config.get([:instance, :static_dir], "instance/static/")
|
|
|
|
|
|
|
|
unless File.exists?(static_dir) do
|
|
|
|
File.mkdir_p!(static_dir)
|
|
|
|
end
|
|
|
|
|
|
|
|
robots_txt_path = Path.join(static_dir, "robots.txt")
|
|
|
|
|
|
|
|
if File.exists?(robots_txt_path) do
|
|
|
|
File.cp!(robots_txt_path, "#{robots_txt_path}.bak")
|
2019-06-20 01:05:19 +02:00
|
|
|
shell_info("Backing up existing robots.txt to #{robots_txt_path}.bak")
|
2019-04-02 21:09:16 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
File.write(robots_txt_path, robots_txt)
|
2019-06-20 01:05:19 +02:00
|
|
|
shell_info("Writing #{robots_txt_path}.")
|
2019-04-02 21:09:16 +02:00
|
|
|
end
|
2018-06-29 02:24:51 +02:00
|
|
|
end
|