dev: support Docker in the upgrading script

This commit is contained in:
naskya 2023-11-12 05:31:20 +09:00
parent 87d1b6a1e0
commit 5789fc2fae
Signed by: naskya
GPG key ID: 164DFF24E2D40139
8 changed files with 151 additions and 95 deletions

View file

@ -40,7 +40,5 @@ packages/backend/assets/instance.css
# dockerignore custom # dockerignore custom
.git .git
!.git/HEAD
!.git/refs
Dockerfile Dockerfile
docker-compose.yml docker-compose.yml

View file

@ -32,7 +32,7 @@ COPY packages/backend/native-utils/npm/linux-x64-musl/package.json packages/back
COPY packages/backend/native-utils/npm/linux-arm64-musl/package.json packages/backend/native-utils/npm/linux-arm64-musl/package.json COPY packages/backend/native-utils/npm/linux-arm64-musl/package.json packages/backend/native-utils/npm/linux-arm64-musl/package.json
# Configure pnpm, and install dev mode dependencies for compilation # Configure pnpm, and install dev mode dependencies for compilation
RUN corepack enable && corepack prepare pnpm@latest --activate && pnpm i RUN corepack enable && corepack prepare pnpm@latest --activate && pnpm install
# Copy in the rest of the native-utils rust files # Copy in the rest of the native-utils rust files
COPY packages/backend/native-utils packages/backend/native-utils/ COPY packages/backend/native-utils packages/backend/native-utils/
@ -42,15 +42,17 @@ RUN pnpm run --filter native-utils build
# Copy in the rest of the files to compile # Copy in the rest of the files to compile
COPY . ./ COPY . ./
# Create dummy .git/objects directory for `git rev-parse`
RUN mkdir .git/objects
# Write version info # Write version info
RUN bash -c 'NEW_COMMIT=$(git rev-parse --short HEAD) && sed -i -r "s/\"version\": \"([^+]+).*\",$/\"version\": \"\\1+neko:${NEW_COMMIT:0:7}\",/" package.json' ARG COMMIT_HASH
ENV COMMIT_HASH=${COMMIT_HASH}
RUN sed -i -r "s/\"version\": \"([^+]+).*\",$/\"version\": \"\\1+neko:${COMMIT_HASH}\",/" package.json
# Compile # Compile
RUN env NODE_ENV=production sh -c "pnpm run --filter '!native-utils' build && pnpm run gulp" RUN env NODE_ENV=production sh -c "pnpm run --filter '!native-utils' build && pnpm run gulp"
# Trim down the dependencies to only those for production # Trim down the dependencies to only those for production
RUN pnpm i --prod RUN pnpm install --prod
## Runtime container ## Runtime container
FROM node:20 FROM node:20
@ -60,8 +62,6 @@ WORKDIR /firefish
RUN apt-get update && apt-get install -y libvips-dev zip unzip tini ffmpeg RUN apt-get update && apt-get install -y libvips-dev zip unzip tini ffmpeg
COPY . ./ COPY . ./
# Remove .git
RUN rm -rf .git
COPY --from=build /firefish/packages/megalodon /firefish/packages/megalodon COPY --from=build /firefish/packages/megalodon /firefish/packages/megalodon

View file

@ -148,9 +148,33 @@
## Docker ユーザー ## Docker ユーザー
ToDo ([#ndqEd](https://code.naskya.net/decks/4wJQ3/tickets/ndqEd)) ### インストール
- Docker image とアップデートスクリプトを提供することを考えています ToDo ([#a3WPw](https://code.naskya.net/decks/4wJQ3/tickets/a3WPw))
- インストールスクリプトの提供を考えています
- 慣れている方向けの説明: [`docker.io/naskya/firefish`](https://hub.docker.com/r/naskya/firefish) を用いて Firefish をインストールし、以下のコマンドを用いて PGroonga の拡張機能を有効にしてください。
```bash
docker-compose exec db psql --command="CREATE EXTENSION pgroonga;" --dbname=firefish
```
### アップデート
重要なお知らせがある場合にはアップデートスクリプトを通じてお伝えするので、必ず `update.sh` を用いてアップデートしてください。
1. サーバーのバックアップを取る
2. `update.sh` を実行し、表示される指示に従う
```bash
./update.sh
```
3. サーバーを起動して動作を確認する
```bash
docker-compose up --detach
```
## 非 Docker ユーザー ## 非 Docker ユーザー

View file

@ -2,8 +2,7 @@ version: "3"
services: services:
web: web:
image: firefish image: docker.io/naskya/firefish
build: .
container_name: firefish_web container_name: firefish_web
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:

18
neko/update/docker.sh Normal file
View file

@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -eu
source neko/update/utils
pull() {
say "Pulling the image..."
docker pull docker.io/naskya/firefish
}
if ! pull; then
say "awawa, the image may not be compatible with your environment..."
say "Gonnya try building the image locally!"
COMMIT_HASH=$(git rev-parse --short HEAD)
docker build --tag docker.io/naskya/firefish --build-arg COMMIT="${COMMIT_HASH:0:7}" .
fi
say "Done!"

66
neko/update/native.sh Executable file
View file

@ -0,0 +1,66 @@
#!/usr/bin/env bash
set -eu
source neko/update/utils
# Confirm that the server is stopped
if [ $# != 1 ] || [ "$1" != "--skip-all-confirmations" ]; then
say "Did you stop your server?"
read -r -p "[Y/n] > " yn
case "${yn}" in
[Nn]|[Nn][Oo])
say "You must stop your server first!"
exit 1
;;
*)
say "uwu~ erai erai!\n"
;;
esac
fi
# write version info
say "Writing version info to package.json..."
COMMIT_HASH=$(git rev-parse --short HEAD)
running "sed -i -r 's/\"version\": \"([^+]+).*\",$/\"version\": \"\\1+neko:${COMMIT_HASH:0:7}\",/' package.json"
sed -i -r "s/\"version\": \"([^+]+).*\",$/\"version\": \"\\1+neko:${COMMIT_HASH:0:7}\",/" package.json
say "Done!\n"
# install dependencies
say "Upgrading dependencies..."
running "corepack prepare pnpm@latest --activate"
corepack prepare pnpm@latest --activate
running "pnpm install"
pnpm install
say "Done!\n"
# build
say "Start building Firefish."
say "It takes some time! Why not brew a cup of cofe?"
running "NODE_OPTIONS=\"--max_old_space_size=3072\" NODE_ENV=\"production\" pnpm run rebuild"
NODE_OPTIONS="--max_old_space_size=3072" NODE_ENV="production" pnpm run rebuild
say "Done! We're almost there.\n"
# prevent migration errors
if [ ! -f packages/backend/native-utils/built/index.js ]; then
say "Something went wrong orz... Gonnya try fixing that."
running "cp neko/index.js packages/backend/native-utils/built/index.js"
cp neko/index.js packages/backend/native-utils/built/index.js
else
say "It's going well so far!\n"
fi
# migrate
say "Database migration time!"
running "NODE_OPTIONS=\"--max_old_space_size=3072\" NODE_ENV=\"production\" pnpm run migrate"
NODE_OPTIONS="--max_old_space_size=3072" NODE_ENV="production" pnpm run migrate
say "Done!\n"

17
neko/update/utils Normal file
View file

@ -0,0 +1,17 @@
color() {
if [ -t 1 ]; then
tput setaf "${1:-7}"
fi
}
say() {
color 5 # magenta
echo -e "( ^-^) < $1"
color
}
running() {
color 3 # yellow
echo "[running] \$ $1"
color
}

View file

@ -1,45 +1,13 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -eu set -eu
function color { source neko/update/utils
if [[ -t 1 ]]; then
tput setaf ${1:-7}
fi
}
function say {
color 5 # magenta
echo -e "( ^-^) < $1"
color
}
function running {
color 3 # yellow
echo "[running] \$ $1"
color
}
say "Start upgrading Firefish!" say "Start upgrading Firefish!"
# Confirm that the server is stopped
if [[ $# != 1 ]] || [[ $1 != "--skip-all-confirmations" ]]; then
say "Did you stop your server?"
read -r -p "[Y/n] > " yn
case "${yn}" in
[Nn]|[Nn][Oo])
say "You must stop your server first!"
exit 1
;;
*)
say "uwu~ erai erai!\n"
;;
esac
fi
# Pull changes # Pull changes
## git pull ## git pull
OLD_COMMIT=$(git rev-parse --short HEAD) OLD_COMMIT=$(git rev-parse --short HEAD)
say "Currently we're on \`${OLD_COMMIT}\`"
say "Pulling changes from the remote repo..." say "Pulling changes from the remote repo..."
@ -50,11 +18,11 @@ running "git pull --ff --no-edit --autostash --strategy-option theirs"
git pull --ff --no-edit --autostash --strategy-option theirs git pull --ff --no-edit --autostash --strategy-option theirs
NEW_COMMIT=$(git rev-parse --short HEAD) NEW_COMMIT=$(git rev-parse --short HEAD)
say "Pulled successfully! Now we're on \`${NEW_COMMIT}\`\n" say "Pulled successfully!\n"
## check if the update script itself is updated ## check if the update script itself is updated
say "Checking if the update script itself has been changed by this update..." say "Checking if the update script itself has been modified by this update..."
if [[ $(git diff ${OLD_COMMIT} ${NEW_COMMIT} update.sh) != "" ]]; then if [ $(git diff "${OLD_COMMIT}" "${NEW_COMMIT}" update.sh) != "" ]; then
say "Oh meow, that seems to be the case." say "Oh meow, that seems to be the case."
say "I'm sorry to bother you, but please run this script again!" say "I'm sorry to bother you, but please run this script again!"
exit 1 exit 1
@ -65,8 +33,8 @@ fi
## show messages ## show messages
for message in neko/messages/*; do for message in neko/messages/*; do
file=$(basename -- "${message}") file=$(basename -- "${message}")
if [[ ! -f "neko/flags/${file}" ]]; then if [ ! -f "neko/flags/${file}" ]; then
if [[ $# != 1 ]] || [[ $1 != "--skip-all-confirmations" ]]; then if [ $# != 1 ] || [ "$1" != "--skip-all-confirmations" ]; then
say "There is an important notice!" say "There is an important notice!"
cat "${message}" cat "${message}"
say "Continue? (Are you ready for upgrading?)" say "Continue? (Are you ready for upgrading?)"
@ -88,51 +56,17 @@ for message in neko/messages/*; do
fi fi
done done
## write version info say "Do you use Docker?"
say "Writing version info to package.json..." read -r -p "[y/N] > " yn
running "sed -i -r 's/\"version\": \"([^+]+).*\",$/\"version\": \"\\1+neko:${NEW_COMMIT:0:7}\",/' package.json" case "${yn}" in
sed -i -r "s/\"version\": \"([^+]+).*\",$/\"version\": \"\\1+neko:${NEW_COMMIT:0:7}\",/" package.json [Yy]|[Yy][Ee][Ss])
./neko/update/docker.sh $@
say "Done!\n" ;;
*)
# Upgrade ./neko/update/native.sh $@
## install dependencies ;;
say "Upgrading dependencies..." esac
running "corepack prepare pnpm@latest --activate"
corepack prepare pnpm@latest --activate
running "pnpm install"
pnpm install
say "Done!\n"
## build
say "Start building Firefish."
say "It takes some time! Why not brew a cup of cofe?"
running "NODE_OPTIONS=\"--max_old_space_size=3072\" NODE_ENV=\"production\" pnpm run rebuild"
NODE_OPTIONS="--max_old_space_size=3072" NODE_ENV="production" pnpm run rebuild
say "Done! We're almost there.\n"
## prevent migration errors
if [[ ! -f packages/backend/native-utils/built/index.js ]]; then
say "Something went wrong orz... Gonnya try fixing that."
running "cp neko/index.js packages/backend/native-utils/built/index.js"
cp neko/index.js packages/backend/native-utils/built/index.js
else
say "It's going well so far!\n"
fi
## migrate
say "Database migration time!"
running "NODE_OPTIONS=\"--max_old_space_size=3072\" NODE_ENV=\"production\" pnpm run migrate"
NODE_OPTIONS="--max_old_space_size=3072" NODE_ENV="production" pnpm run migrate
say "Done!\n"
# Done # Done
say "Enjoy your sabakan life~" say "Enjoy your sabakan life~"