Assumptions
- You started off from the basic storage config:
- Regular data is in filesystem.
- mam (xep0313) message archive is in SQLite3.
- You want to transition to using just PostgreSQL.
- PostgreSQL version is 9.4.
Installation
# # largest version of pgsql you have
~# apt install postgresql-9.4-client
# # get lua-dbi module for pgsql
~# apt install lua-dbi-postgresql
Creating PostgreSQL user
# # PostgreSQL trusts users connecting over unix domain socket to be the
# # same as their local account.
# # Therefore, become postgres -- the admin account.
user:~$ sudo su postgres
# # run user creation
postgres:~$ createuser --interactive
# # name: prosody
# # no other administrative options
# # run postgresql client
postgres:~$ psql
-- create database
CREATE DATABASE prosody;
-- give the prosody user all rights on it
GRANT ALL ON DATABASE prosody TO prosody;
-- in case of connecting over network and using md5 trust,
-- set prosody account password:
ALTER ROLE prosody WITH ENCRYPTED PASSWORD 'here_some_password';
Over network?
Assuming you want to connect over the network, edit /etc/postgresql/9.4/main/pg_hba.conf
. Append:
# type, database, user, address, auth method
host prosody prosody 172.16.0.0/16 md5
- Try to minimize your permitted netmask.
- Can you configure a more secure auth method than
md5
? Do so.
Migrate data from filesystem
# # as prosody local user
prosody:$ cd prosody-hg/tools/migrator
# # overwrite the config.
prosody:$ cat > migrator.cfg.lua << _EOF
local data_path = "../../data";
input {
type = "prosody_files";
path = data_path;
}
output {
type = "prosody_sql";
driver = "PostgreSQL";
database = "prosody";
username = "prosody";
password = "here_some_password";
host = "database.host.here"; -- this assumes network connection; migration with local user credentials was not attempted.
}
_EOF
# # run the migrator in ~/prosody-hg/tools/migrator
prosody:$ lua prosody-migrator.lua input output
Migrate mam archive from SQLite3
# # as prosody user
prosody:~$ cd prosody-hg/data
# # Having first verified there is nothing in Prosody table...
prosody:$ sqlite3 prosody.sqlite 'SELECT COUNT(*) FROM prosody;'
# # ...drop prosody table. All its data (roster etc) was until now stored on the filesystem.
prosody:$ sqlite3 prosody.sqlite 'DROP TABLE prosody;'
# # dump and massage the sqlite3 output, piping it into psql.
# # psql authenticates as the 'prosody' user and does not require the password.
prosody:$ sqlite3 prosody.sqlite .dump | \
grep -v 'BEGIN TRANSACTION;' | \
sed 's/PRAGMA foreign_keys=OFF;/BEGIN TRANSACTION; SET CONSTRAINTS ALL DEFERRED;/' | \
grep -v sqlite_sequence | \
awk '/CREATE TABLE/{gsub("`","\"");} 1' | \
awk '/CREATE UNIQUE INDEX/{gsub("`","\"");} 1' | \
sed 's/INTEGER PRIMARY KEY AUTOINCREMENT/SERIAL PRIMARY KEY/' | \
psql
# # manual step :(
# # fix the autoincrement.
prosody:$ sqlite3 prosody.sqlite 'SELECT COUNT(*) FROM prosodyarchive;'
# # use this number + 1 in:
prosody:$ echo 'ALTER SEQUENCE prosodyarchive_sort_id_seq RESTART WITH 123456;' | psql
Update Prosody config
In prosody.cfg.lua
:
storage = {
archive2 = "sql";
}
sql = { driver = "PostgreSQL", database = "prosody", username = "prosody", password = "here_some_password", host = "database.host.here" }