mirror of
https://github.com/d0zingcat/ghost-docker.git
synced 2026-05-13 15:09:34 +00:00
Add migration script for Ghost CLI -> Docker installs
- This script handles the copy of both assets and the MySQL database from an existing install to a new Docker based install - Its currently been tested on the "happy path" of a Ghost CLI install and works
This commit is contained in:
16
.github/workflows/shellcheck.yml
vendored
Normal file
16
.github/workflows/shellcheck.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
name: "ShellCheck"
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
shellcheck:
|
||||||
|
name: ShellCheck
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Run ShellCheck
|
||||||
|
run: find . -type f -name "*.sh" -exec shellcheck {} +
|
||||||
@@ -6,7 +6,7 @@ set -u
|
|||||||
if [ -n "$MYSQL_MULTIPLE_DATABASES" ]; then
|
if [ -n "$MYSQL_MULTIPLE_DATABASES" ]; then
|
||||||
echo "Creating multiple databases: $MYSQL_MULTIPLE_DATABASES"
|
echo "Creating multiple databases: $MYSQL_MULTIPLE_DATABASES"
|
||||||
|
|
||||||
for db in $(echo $MYSQL_MULTIPLE_DATABASES | tr ',' ' '); do
|
for db in $(echo "$MYSQL_MULTIPLE_DATABASES" | tr ',' ' '); do
|
||||||
echo "Creating database: $db"
|
echo "Creating database: $db"
|
||||||
mysql -u root -p"$MYSQL_ROOT_PASSWORD" <<-EOSQL
|
mysql -u root -p"$MYSQL_ROOT_PASSWORD" <<-EOSQL
|
||||||
CREATE DATABASE IF NOT EXISTS \`$db\`;
|
CREATE DATABASE IF NOT EXISTS \`$db\`;
|
||||||
|
|||||||
117
scripts/migrate.sh
Normal file
117
scripts/migrate.sh
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Check we're running as root
|
||||||
|
if [[ "$EUID" -ne 0 ]]
|
||||||
|
then
|
||||||
|
echo "Sorry, this script must be run as root!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "WARNING: This script is currently in beta, please ensure you have a backup of your current installation!"
|
||||||
|
|
||||||
|
read -rp 'Are you sure you want to continue? (y/n): ' confirm
|
||||||
|
|
||||||
|
if [[ "x${confirm}" != "xy" ]]
|
||||||
|
then
|
||||||
|
echo "Aborting..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if we have jq installed
|
||||||
|
if [[ ! $(which jq) ]]
|
||||||
|
then
|
||||||
|
echo "jq is not installed, please install it first"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Prompt for current installation location
|
||||||
|
read -rp 'Current installation location: ' current_location
|
||||||
|
|
||||||
|
if [[ -z "$current_location" ]]
|
||||||
|
then
|
||||||
|
echo "Current installation location is required"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Start some safety checks
|
||||||
|
|
||||||
|
# Check whether we can find a Ghost-CLI installation
|
||||||
|
if [[ ! -f "${current_location}/.ghost-cli" ]]
|
||||||
|
then
|
||||||
|
echo "Could not find a Ghost-CLI installation at ${current_location}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check whether we can find a Ghost installation
|
||||||
|
if [[ ! -d "${current_location}/content" ]]
|
||||||
|
then
|
||||||
|
echo "Could not find a Ghost installation at ${current_location}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f "${PWD}/.env" ]]
|
||||||
|
then
|
||||||
|
echo "Ensure you have a .env file setup for the new installation before continuing"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -rp 'MySQL user to export the current database (must have permission to run mysqldump - defaults to root): ' mysql_user
|
||||||
|
mysql_user=${mysql_user:-root}
|
||||||
|
|
||||||
|
# Stop current installation
|
||||||
|
read -rp 'This script is about to stop the current installation whilst it migrates to the new installation. Are you sure you want to continue? (y/n): ' confirm
|
||||||
|
|
||||||
|
if [[ "x${confirm}" != "xy" ]]
|
||||||
|
then
|
||||||
|
echo "Aborting..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
systemctl stop nginx
|
||||||
|
systemctl disable nginx
|
||||||
|
|
||||||
|
systemctl stop "ghost_$(jq -r < "${current_location}/.ghost-cli" '.name')"
|
||||||
|
systemctl disable "ghost_$(jq -r < "${current_location}/.ghost-cli" '.name')"
|
||||||
|
|
||||||
|
# Create new installation directory
|
||||||
|
# TODO: Ensure this is safe?
|
||||||
|
mkdir -p "${PWD}/data/ghost/"
|
||||||
|
|
||||||
|
# Copy current installations content dir
|
||||||
|
rsync -qHPva "${current_location}/content/" "${PWD}/data/ghost/"
|
||||||
|
|
||||||
|
echo "Fixing user permissions..."
|
||||||
|
chown -R 1000:1000 "${PWD}/data/ghost/"
|
||||||
|
|
||||||
|
# Starting MySQL container to import the database
|
||||||
|
docker compose up db -d
|
||||||
|
|
||||||
|
# Dump MySQL database to data dir so we can import it
|
||||||
|
echo "This script is about to dump the MySQL database, please enter the MySQL password for ${mysql_user} when prompted"
|
||||||
|
mysqldump -u "${mysql_user}" -p --host="$(jq -r < "${current_location}"/config.production.json '.database.connection.host')" "$(jq -r < "${current_location}"/config.production.json '.database.connection.database')" > "$PWD"/data/ghost_import.sql
|
||||||
|
|
||||||
|
# We do this _after_ the dump since the user will likely take time to input their password anyway
|
||||||
|
# Wait for MySQL container to be ready
|
||||||
|
echo "Waiting for new MySQL container to be ready..."
|
||||||
|
timeout=120
|
||||||
|
counter=0
|
||||||
|
until [ "$(docker compose ps db --format json | jq -r '.Health')" = "healthy" ] || [ $counter -eq $timeout ]; do
|
||||||
|
echo -n "."
|
||||||
|
sleep 1
|
||||||
|
((counter++)) || true
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $counter -eq $timeout ]; then
|
||||||
|
echo " Timeout waiting for MySQL to be ready"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo " MySQL is ready!"
|
||||||
|
echo "Importing database..."
|
||||||
|
docker compose exec -T db sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" $MYSQL_DATABASE' < "${PWD}/data/ghost_import.sql"
|
||||||
|
|
||||||
|
# Starting Ghost container
|
||||||
|
echo "Starting Ghost and Caddy containers..."
|
||||||
|
docker compose up ghost caddy -d
|
||||||
Reference in New Issue
Block a user