diff --git a/docker-resources/docker-compose.pgsql-tuning.yml b/docker-resources/docker-compose.pgsql-tuning.yml new file mode 100644 index 000000000..7ac8c5ecd --- /dev/null +++ b/docker-resources/docker-compose.pgsql-tuning.yml @@ -0,0 +1,39 @@ +services: + db: + # If you use a config generator, use the value below for your + # "ram" size + shm_size: 4gb + command: + - "postgres" + - "-c" + - "max_connections=40" + - "-c" + - "shared_buffers=1GB" + - "-c" + - "effective_cache_size=3GB" + - "-c" + - "maintenance_work_mem=512MB" + - "-c" + - "checkpoint_completion_target=0.9" + - "-c" + - "wal_buffers=16MB" + - "-c" + - "default_statistics_target=500" + - "-c" + - "random_page_cost=1.1" + - "-c" + - "effective_io_concurrency=200" + - "-c" + - "work_mem=6553kB" + - "-c" + - "min_wal_size=4GB" + - "-c" + - "max_wal_size=16GB" + - "-c" + - "max_worker_processes=4" + - "-c" + - "max_parallel_workers_per_gather=2" + - "-c" + - "max_parallel_workers=4" + - "-c" + - "max_parallel_maintenance_workers=2" diff --git a/docker-resources/env.example b/docker-resources/env.example new file mode 100644 index 000000000..23ca15221 --- /dev/null +++ b/docker-resources/env.example @@ -0,0 +1,5 @@ +MIX_ENV=prod +ERL_EPMD_ADDRESS=127.0.0.1 +DB_NAME=akkoma +DB_USER=akkoma +DB_PASS=akkoma diff --git a/docker-resources/generate-instance.sh b/docker-resources/generate-instance.sh index 0598f5bdc..1f92d3d8d 100755 --- a/docker-resources/generate-instance.sh +++ b/docker-resources/generate-instance.sh @@ -8,9 +8,7 @@ mkdir -p pgdata docker compose run \ --rm \ -e "PLEROMA_CTL_RPC_DISABLED=true" \ - akkoma ./bin/pleroma_ctl instance gen --no-sql-user --no-db-creation --dbhost db --dbname akkoma --dbuser akkoma --dbpass akkoma --listen-ip 0.0.0.0 --listen-port 4000 --static-dir /opt/akkoma/instance/ --uploads-dir /opt/akkoma/uploads/ --db-configurable true --output /opt/akkoma/config/generated_config.exs --output-psql /opt/akkoma/config/setup_db.psql - -echo "Instance generated!" + akkoma ./bin/pleroma_ctl instance gen --no-sql-user --no-db-creation --dbhost db --dbname akkoma --dbuser akkoma --dbpass akkoma --listen-ip 0.0.0.0 --listen-port 4000 --static-dir /opt/akkoma/instance/ --uploads-dir /opt/akkoma/uploads/ --db-configurable y --output /opt/akkoma/config/generated_config.exs --output-psql /opt/akkoma/config/setup_db.psql # setup database from generated config # we run from the akkoma container to ensure we have the right environment! can't connect to a DB that doesn't exist yet... @@ -18,4 +16,11 @@ docker compose run \ --rm \ -e "PLEROMA_CTL_RPC_DISABLED=true" \ -e "PGPASSWORD=akkoma" \ - akkoma psql -h db -U akkoma -d akkoma -f /opt/akkoma/config/setup_db.psql \ No newline at end of file + akkoma psql -h db -U akkoma -d akkoma -f /opt/akkoma/config/setup_db.psql + +# stop tzdata trying to write to places it shouldn't +echo "config :tzdata, :data_dir, "/var/tmp/elixir_tzdata_storage" >> /opt/akkoma/config/generated_config.exs + +echo "Instance generated!" + +echo "Make sure you check your config and copy it to config/prod.secret.exs before starting the instance!" \ No newline at end of file diff --git a/docs/docs/installation/docker_en.md b/docs/docs/installation/docker_en.md index 9551b034a..d586876e4 100644 --- a/docs/docs/installation/docker_en.md +++ b/docs/docs/installation/docker_en.md @@ -28,31 +28,14 @@ echo "DOCKER_USER=$(id -u):$(id -g)" >> .env This probably won't need to be changed, it's only there to set basic environment variables for the docker compose file. -### Building the container - -The container provided is a thin wrapper around akkoma's dependencies, -it does not contain the code itself. This is to allow for easy updates -and debugging if required. - -```bash -./docker-resources/build.sh -``` - -This will generate a container called `akkoma` which we can use -in our compose environment. - ### Generating your instance ```bash mkdir pgdata -./docker-resources/manage.sh mix deps.get -./docker-resources/manage.sh mix compile -./docker-resources/manage.sh mix pleroma.instance gen +./docker-resources/generate-instance.sh ``` -This will ask you a few questions - the defaults are fine for most things, -the database hostname is `db`, the database password is `akkoma` -(not auto generated), and you will want to set the ip to `0.0.0.0`. +This will ask you a few questions - the defaults are fine for most things! Now we'll want to copy over the config it just created @@ -60,24 +43,6 @@ Now we'll want to copy over the config it just created cp config/generated_config.exs config/prod.secret.exs ``` -### Setting up the database - -We need to run a few commands on the database container, this isn't too bad - -```bash -docker compose run --rm --user akkoma -d db -# Note down the name it gives here, it will be something like akkoma_db_run -docker compose run --rm akkoma psql -h db -U akkoma -f config/setup_db.psql -docker stop akkoma_db_run # Replace with the name you noted down -``` - -Now we can actually run our migrations - -```bash -./docker-resources/manage.sh mix ecto.migrate -# this will recompile your files at the same time, since we changed the config -``` - ### Start the server We're going to run it in the foreground on the first run, just to make sure @@ -102,7 +67,7 @@ docker compose up -d If your instance is up and running, you can create your first user with administrative rights with the following task: ```shell -./docker-resources/manage.sh mix pleroma.user new MY_USERNAME MY_EMAIL@SOMEWHERE --admin +./docker-resources/manage.sh user new MY_USERNAME MY_EMAIL@SOMEWHERE --admin ``` And follow the prompts @@ -154,23 +119,43 @@ If you want, you can also run the reverse proxy on the host. This is a bit more Follow the guides for source install for your distribution of choice, or adapt as needed. Your standard setup can be found in the [Debian Guide](../debian_based_en/#nginx) +### Applying Postgresql optimisations + +Your postgresql server will behave better if you tune its settings to your machine. + +There is a file at `docker-resources/docker-compose.pgsql-tuning.yml` which shows you how to apply settings, for example +those generated by [PgTune](https://pgtune.leopard.in.ua/) + +You can merge this config into a `docker-compose.override.yml` file to apply them. Make sure that you generate your options +based on the shm_size you allocate! + ### You're done! All that's left is to set up your frontends. -The standard from-source commands will apply to you, just make sure you +The standard OTP commands will apply to you, just make sure you prefix them with `./docker-resources/manage.sh`! +So, for example, if an OTP command would be + +``` +./bin/pleroma_ctl user new myuser +``` + +The equivalent docker command would be + +``` +./docker-resources/manage.sh user new myuser +``` + {! installation/frontends.include !} ### Updating Docker Installs ```bash git pull -./docker-resources/build.sh -./docker-resources/manage.sh mix deps.get -./docker-resources/manage.sh mix compile -./docker-resources/manage.sh mix ecto.migrate +docker compose pull +./docker-resources/manage.sh migrate docker compose restart akkoma db ``` @@ -180,6 +165,20 @@ create a new file called `docker-compose.override.yml`. There you can add any overrides or additional services without worrying about git conflicts when a new release comes out. +### Migrating from the old docker install system + +If you were running akkoma in docker before 2024.06, you will need to do a few little migration steps. + +First off, we need to migrate our postgres installation to a newer version! + +```bash +./docker-resources/migrate-postgresql-version.sh pgdata 14 16 +``` + +This should be nice and quick. + +After that you can just `docker compose pull` and all should be fine. + #### Further reading {! installation/further_reading.include !}