Hari ini, saya menemui kendala saat melakukan upgrade self-hosted asciinema server milik saya. Setelah mengikuti proses upgrade sesuai dokumentasi asciinema-server di GitHub, container phoenix
dan postgres
gagal berjalan dan selalu restart.
saya mencoba mencari informasi apa yang menyebabkan hal tersebut terjadi. Dari log container phoenix
, saya mendapati error berikut :
(DBConnection.ConnectionError) connection not available and request was dropped from queue after xxxxms. This means requests are coming in and your connection pool cannot serve them fast enough. You can address this by:
By tracking down slow queries and making sure they are running fast enough
Increasing the pool_size (albeit it increases resource consumption)
Allow requests to wait longer by increasing :queue_target and :queue_interval
See DBConnection.start_link/2 for more information
kemudian dari log postgreSQL container itu sendiri, saya mendapatkan error log yang kurang lebih menginformasikan bahwa file yang berada di volume postgresql
container tidak kompatible dengan yang sedang berjalan.:
FATAL: database files are incompatible with server
DETAIL: The data directory was initialized by PostgreSQL version 12, which is not compatible with this version 14
Dari informasi error yang saya dapatkan tersebut, saya memutuskan untuk:
- Melakukan downgrade sementara supaya saya bisa melakukan backup database yang sebelumnya.
- Menghapus dan menginstall kembali PostgreSQL yang sesuai dengan versi repositori masternya.
- Melakukan restore database yang telah saya backup dan berharap proses restore dapat berjalan dengan lancar.
Dan ternyata berhasil!
Proses penyelamatan
Masuk ke direktori asciinema-server
, dan hentikan semua container yang berkaitan dengan asciinema-server dengan menjalankan perintah docker-compose down
.
Download asciinema-server
docker image yang terbaru:
1docker pull asciinema/asciinema-server
Download config asciinema dari upstream dan lakukan merge ke branch milik Anda (jika belum dilakukan):
1git fetch origin
2git merge origin/master
3
4# Perintah dibawah optional, tergantung dengan cara installasi awal asciinema-server Anda
5git stash
6git stash pop
7git add .
8git commit -m "Local upgrade"
9git merge origin/master
Downgrade PostgreSQL dan lakukan backup
Setelah itu, edit docker-compose.yml
. Kembalikan postgresql
image dari versi 14
ke versi sebelumnya (di kasus saya, versi sebelumnya di versi 12
).
1version: '2'
2
3services:
4 postgres:
5 image: postgres:12-alpine
6 container_name: asciinema_postgres
7 ### bla bla bla
Hal ini perlu dilakukan supaya kita dapat melakukan dump database PostgreSQL.
Nyalakan PostgreSQL, tapi biarkan service asciinema-server lainnya tetap mati.
1docker-compose up -d postgres
Lakukan backup dengan menjalankan perintah berikut:
1docker exec -it <DOCKER_CONTAINER_ID> pg_dump postgres -U postgres > asciinemadump.sql
Catatan: informasi
DOCKER_CONTAINER_ID
bisa didapatkan dari perintahdocker ps
.
Setelah proses dump database selesai, matikan container postgresql tersebut dengan menjalankan perintah:
1docker-compose down
Hapus semua volume data yang digunakan oleh container postgresql yang lama (defaultnya ./volumes/postgres
). Sebaiknya anda melakukan backup direktori tersebut dengan cara memindahkan ke folder lain sebelum menghapusya secara permanen.
Jalankan PostgreSQL versi upstream
Setelah itu, hapus docker volume untuk PostgreSQL 12
dan gunakan PostgreSQL sesuai dengan versi dari upstream (v14
).
Edit kembali docker-compose.yml
dan kembalikan sesuai dengan versi upstream.
1version: '2'
2
3services:
4 postgres:
5 image: postgres:14-alpine
6 container_name: asciinema_postgres
7 ### bla bla bla
Nyalakan PostgreSQL 14
, tapi tetap biarkan service asciinema-server lainnya tetap mati dulu.
1docker-compose up -d postgres
Restore PostgreSQL backup
Setelah PostgreSQL yang sesuai dengan versi upstream berjalan, lakukan proses restore database yang sudah kita backup sebelumnya.
Copy file asciinemadump.sql
ke volume postgres (./volumes/postgres
) dan ubah file permission supaya user root
didalam container dapat membaca file tersebut.
Kemudian jalankan perintah berikut untuk melakukan restore database :
1docker exec -it <DOCKER_CONTAINER_ID> psql -d postgres -U postgres -f /var/lib/postgresql/data/asciinemadump.sql
Catatan:
DOCKER_CONTAINER_ID
Anda akan berbeda denganDOCKER_CONTAINER_ID
yang sebelumnya. Pastikan gunakan docker container ID yang benar.
Jalankan asciinema-server seperti biasa
Setelah itu, jalankan semua service asciinema-server seperti biasa dengan menjalankan perintah docker-compose up -d
. Seharusnya Anda sudah dapat menggakses self-hosted asciinema-server Anda kembali.