Fix imported file ownership in the generated PikaPods migration script
The generated migrate-from-pikapods.sh (services/mattermost.sh's existing "Migrating from an existing Mattermost instance?" prompt on fresh installs) already correctly parameterizes PROJECT_DIR/MM_CONTAINER/DB_CONTAINER per instance — no bug there. What it missed: after rsync/cp-ing files in from the export, it never touched ownership, so the imported ./data landed owned by whoever ran the script instead of the fixed UID 2000 mattermost/mattermost-team-edition runs as. Every file write then failed with permission denied — confirmed live as the actual cause of a client-side "stream closed" error on image/file uploads after a real migration. Adds chown -R 2000:2000 ./data right after the copy step, and a root check up front since chowning to an arbitrary UID needs it (docker/psql access already implied running as root in practice, just never enforced explicitly). Usage lines updated to say `sudo` to match. Verified by reconstructing the exact generated script from the real source heredocs (head + variable substitution + body, the same three pieces the actual cat/cat>> sequence produces) and syntax-checking the result — root check and chown both land in the right place, and PROJECT_DIR/MM_CONTAINER/DB_CONTAINER still resolve correctly per instance.
This commit is contained in:
+15
-2
@@ -788,7 +788,7 @@ MD
|
|||||||
# before running.
|
# before running.
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# ./migrate-from-pikapods.sh <path-to-sql-dump> <path-to-files-dir>
|
# sudo ./migrate-from-pikapods.sh <path-to-sql-dump> <path-to-files-dir>
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
MIGRATE_HEAD
|
MIGRATE_HEAD
|
||||||
@@ -803,13 +803,18 @@ MIGRATE_VARS
|
|||||||
|
|
||||||
cat >> "$DIR/migrate-from-pikapods.sh" << 'MIGRATE_BODY'
|
cat >> "$DIR/migrate-from-pikapods.sh" << 'MIGRATE_BODY'
|
||||||
set -uo pipefail
|
set -uo pipefail
|
||||||
|
|
||||||
|
# Needed for the chown to UID 2000 near the end (an ordinary user generally
|
||||||
|
# can't chown files to an arbitrary UID that isn't their own).
|
||||||
|
[ "${EUID:-$(id -u)}" -eq 0 ] || { echo "Run as root: sudo $0 ..."; exit 1; }
|
||||||
|
|
||||||
cd "$PROJECT_DIR" || exit 1
|
cd "$PROJECT_DIR" || exit 1
|
||||||
|
|
||||||
SQL_DUMP="${1:-}"
|
SQL_DUMP="${1:-}"
|
||||||
FILES_DIR="${2:-}"
|
FILES_DIR="${2:-}"
|
||||||
|
|
||||||
if [ -z "$SQL_DUMP" ] || [ -z "$FILES_DIR" ]; then
|
if [ -z "$SQL_DUMP" ] || [ -z "$FILES_DIR" ]; then
|
||||||
echo "Usage: $0 <path-to-sql-dump> <path-to-files-dir>"
|
echo "Usage: sudo $0 <path-to-sql-dump> <path-to-files-dir>"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
[ -f "$SQL_DUMP" ] || { echo "SQL dump not found: $SQL_DUMP"; exit 1; }
|
[ -f "$SQL_DUMP" ] || { echo "SQL dump not found: $SQL_DUMP"; exit 1; }
|
||||||
@@ -856,6 +861,14 @@ echo "Copying files into ./data..."
|
|||||||
mkdir -p ./data
|
mkdir -p ./data
|
||||||
rsync -a "$FILES_DIR"/ ./data/ 2>/dev/null || cp -a "$FILES_DIR"/. ./data/
|
rsync -a "$FILES_DIR"/ ./data/ 2>/dev/null || cp -a "$FILES_DIR"/. ./data/
|
||||||
|
|
||||||
|
# mattermost/mattermost-team-edition runs as fixed UID/GID 2000 — an SFTP'd
|
||||||
|
# copy from elsewhere lands owned by whoever ran this script instead, and
|
||||||
|
# every file write then fails with "permission denied" until this is
|
||||||
|
# fixed. Confirmed live: this is what broke image/file uploads with a
|
||||||
|
# client-side "stream closed" error after a migration.
|
||||||
|
echo "Fixing ownership on imported files (mattermost image expects UID/GID 2000)..."
|
||||||
|
chown -R 2000:2000 ./data
|
||||||
|
|
||||||
echo "Starting Mattermost..."
|
echo "Starting Mattermost..."
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user