Nie znalazłem nigdzie w Internecie rozwiązania tego problemu. Celem moim jest posiadanie z punktu widzenia użytkownika nieprzerwanego dostępu do aplikacji, co czynię poprzez posiadanie 2 kont na Heroku, z 2 apkami z identycznym kodem i przełączaniem między nimi w połowie miesiąca (na drugą) i na początku (na pierwszą), takie jest moje założenie. W wersji free posiadanie 1 apki i nieprzerwanego dostępu (bez usypiania) jest niemożliwe, stąd moje kombinacje.
W związku z tym chcę wykonać kopię bazy danych z jednej apki na Heroku, na drugą, identyczną apkę na Heroku w określonym czasie (dlatego używam adnotacji @Scheduled). Jeśi użyję komendy: heroku pg:copy MY_APP1::DATABASE_URL DATABASE_URL --app MY_APP2 lokalnie na konsoli, wszystko się kopiuje poprawnie. Teraz chcę zautomatyzować tego taska.
Oto mój kod (coś w nim jest jeszcze nie tak):
@Scheduled(cron = "0 0/1 * * * *")
public void copyDatabaseToSecondApp() {
System.out.println("copyDatabaseToSecondApp()");
ProcessBuilder pb;
try {
pb = new ProcessBuilder("/bin/bash", "-c", "heroku pg:copy MY_APP1::DATABASE_URL DATABASE_URL --app MY_APP2");
pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
pb.start();
} catch (Exception e) {
System.out.println("copyException " + e.getMessage());
}
}
Oczywiście normalnie zmienię wartość tego crona aby działał zgodnie z założeniem z początku, teraz jest tylko do celów demonstracyjnych.
pb.start() mi zwraca "/bin/bash: heroku: command not found"
Skoro nie znaleziono, to próbowałem sudo snap install --classic heroku (tak zalecają na oficjalnej stronie: https://devcenter.heroku.com/articles/heroku-cli), ale tam wyskoczył błąd, że nie znaleziono sudo, chciałem zainstalować sudo, to że nie ma pobranych repozytoriów czy coś, chciałem je pobrać, to potem wyświetlił, że read only file system.
Jak więc naprawić, aby pb.start() poprawnie kopiował bazę z jednej aplikacji do drugiej?
Dzięki z góry!