diff --git a/scripts/build.ps1 b/scripts/build.ps1 deleted file mode 100644 index 052b5c52..00000000 --- a/scripts/build.ps1 +++ /dev/null @@ -1,139 +0,0 @@ -# This script builds memos for all listed platforms. -# It's only for local builds. - -# Before using, setup a proper development environment as described here: -# * https://usememos.com/docs/contribution/development -# * https://github.com/usememos/memos/blob/main/docs/development.md - -# Requirements: -# * go -# * node.js -# * npm - -# Usage: -# ./scripts/build.ps1 -# -# Output: ./build/memos--[.exe] - -$goBuilds = @( - # "darwin/amd64" - # "darwin/arm64" - # "linux/amd64" - # "linux/arm64" - "windows/amd64" -) -$ldFlags = @( - "-s" # Omit symbol table and debug information - "-w" # Omit DWARF symbol table -) - -## - -foreach ($dir in @(".", "../")) { - if (Test-Path (Join-Path $dir ".gitignore")) { - $repoRoot = (Resolve-Path $dir).Path - break - } -} -if ([string]::IsNullOrWhiteSpace($repoRoot)) { - Write-Host -BackgroundColor red -ForegroundColor white "Could not find repository root." - Exit 1 -} - -Write-Host "Repository root: " -NoNewline -Write-Host $repoRoot -f Blue - -Push-Location -Set-Location "$repoRoot/web" - -if (-not (Get-Command pnpm -ErrorAction SilentlyContinue)) { - Write-Host "Installing pnpm..." -f DarkYellow - npm install -g pnpm - if (!$?) { - Write-Host -BackgroundColor red -ForegroundColor white "Could not install pnpm. See above." - Pop-Location - Exit 1 - } -} - -Write-Host "`nInstalling frontend dependencies..." -f DarkYellow -pnpm i --frozen-lockfile -if (!$?) { - Write-Host -BackgroundColor red -ForegroundColor white "Could not install frontend dependencies. See above." - Pop-Location - Exit 1 -} -Write-Host "Frontend dependencies installed!" -f green - -Write-Host "`nRemoving previous frontend build from ./build/dist ..." -f Magenta -Remove-Item "$repoRoot/build/dist" -Recurse -Force -ErrorAction SilentlyContinue -if (!$?) { - Write-Host -BackgroundColor red -ForegroundColor white "Could not remove frontend from ./build/dist. See above." - Pop-Location - Exit 1 -} - -Write-Host "`nBuilding frontend..." -f DarkYellow -$frontendTime = Measure-Command { - &pnpm build | Out-Host -} -if (!$?) { - Write-Host -BackgroundColor red -ForegroundColor white "Could not build frontend. See above." - Pop-Location - Exit 1 -} -else { - Write-Host "Frontend built!" -f green -} - -Write-Host "Moving frontend build to ./build/dist..." -f Magenta -Move-Item "$repoRoot/web/dist" "$repoRoot/build/" -Force -ErrorAction Stop -if (!$?) { - Write-Host -BackgroundColor red -ForegroundColor white "Could not move frontend build to ./build/dist. See above." - Pop-Location - Exit 1 -} - -Set-Location $repoRoot -Write-Host "`nBuilding backend..." -f DarkYellow - -$backendTime = Measure-Command { - foreach ($build in $goBuilds) { - $os, $arch = $build.Split("/") - $Env:CGO_ENABLED = 0 - $Env:GOOS = $os - $Env:GOARCH = $arch - - $output = [IO.Path]::Combine($repoRoot, "build", "memos-$os-$arch") - if ($os -eq "windows") { - $output += ".exe" - } - - Write-Host "Building $os/$arch to $output..." -f Blue - &go build -trimpath -o $output -ldflags="$($ldFlags -join " ")" ./bin/memos/main.go | Out-Host - if (!$?) { - Write-Host -BackgroundColor red -ForegroundColor white "'go build' failed for $build ($outputBinary)!. See above." - continue - } - } -} -Write-Host "Backend built!" -f green - -Write-Host "`nFrontend build took $($frontendTime.TotalSeconds) seconds." -f Cyan -Write-Host "Backend builds took $($backendTime.TotalSeconds) seconds." -f Cyan - -Write-Host "`nBuilds:" -f White -foreach ($build in $goBuilds) { - $output = [IO.Path]::Combine($repoRoot, "build", "memos-$os-$arch") - if ($os -eq "windows") { - $output = "$output.exe" - } - Write-Host $output -f White -} - -Write-Host -f Green "`nYou can test the build with" -NoNewline -Write-Host -f White "` ./build/memos--" -NoNewline -Write-Host -f DarkGray "`.exe" -NoNewline -Write-Host -f White " --mode demo" - -Set-Location -Path $repoRoot diff --git a/scripts/build.sh b/scripts/build.sh deleted file mode 100755 index f0308946..00000000 --- a/scripts/build.sh +++ /dev/null @@ -1,140 +0,0 @@ -#!/bin/bash -# This script builds memos for all listed platforms. -# It's only for local builds. - -# Before using, setup a proper development environment as described here: -# * https://usememos.com/docs/contribution/development -# * https://github.com/usememos/memos/blob/main/docs/development.md - -# Requirements: -# * go -# * node.js -# * npm - -# Usage: -# chmod +x ./scripts/build.sh -# ./scripts/build.sh -# -# Output: ./build/memos--[.exe] - -goBuilds=( - # "darwin/amd64" - # "darwin/arm64" - "linux/amd64" - # "linux/arm64" - # "windows/amd64" -) -ldFlags=( - "-s" # Omit symbol table and debug information - "-w" # Omit DWARF symbol table -) - -## - -find_repo_root() { - # Usage: find_repo_root ... - local looking_for="${1:-".gitignore"}" - shift - local default_dirs=("." "../") - local dirs=("${@:-${default_dirs[@]}}") - for dir in "${dirs[@]}"; do - if [ -f "$dir/$looking_for" ]; then - echo $(realpath "$dir") - return - fi - done -} - -repo_root=$(find_repo_root) -if [ -z "$repo_root" ]; then - echo -e "\033[0;31mRepository root not found! Exiting.\033[0m" - exit 1 -else - echo -e "Repository root: \033[0;34m$repo_root\033[0m" -fi - -pushd $repo_root -cd "$repo_root/web" - -if ! command -v pnpm &>/dev/null; then - echo -e "\n\033[35mInstalling pnpm...\033[0m" - npm install -g pnpm - if [ $? -ne 0 ]; then - echo -e "\033[0;31mFailed to install pnpm! Exiting.\033[0m" - popd - exit 1 - fi -fi - -echo -e "\n\033[33mInstalling frontend dependencies...\033[0m" -pnpm i --frozen-lockfile -if [ $? -ne 0 ]; then - echo -e "\033[0;31mFrontend dependencies failed to install! Exiting.\033[0m" - popd - exit 1 -fi -echo -e "\033[32mFrontend dependencies installed!\033[0m" - -echo -e "\n\033[35mRemoving previous frontend build from ./build/dist...\033[0m" -rm -rf $repo_root/build/dist -if [ $? -ne 0 ]; then - echo -e "\033[93mCould not remove frontend from ./build/dist.\033[0m" - popd - exit 1 -fi - -echo -e "\n\033[33mBuilding frontend...\033[0m" -pnpm build -if [ $? -ne 0 ]; then - echo -e "\033[0;31mFrontend build failed! Exiting.\033[0m" - popd - exit 1 -fi -echo -e "\033[32mFrontend built!\033[0m" - -cd $repo_root - -echo -e "\033[35mMoving frontend build to ./build/dist...\033[0m" -mv -f "$repo_root/web/dist" "$repo_root/build/" -if [ $? -ne 0 ]; then - echo -e "\033[0;31mFailed to move frontend build! Exiting.\033[0m" - popd - exit 1 -fi - -cd "$repo_root" -echo -e "\n\033[33mBuilding backend...\033[0m" - -for build in "${goBuilds[@]}"; do - os=$(echo $build | cut -d'/' -f1) - arch=$(echo $build | cut -d'/' -f2) - - output="$repo_root/build/memos-$os-$arch" - if [ "$os" = "windows" ]; then - output="$output.exe" - fi - - CGO_ENABLED=0 GOOS=$os GOARCH=$arch go build -trimpath -ldflags="${ldFlags[*]}" -o "$output" ./bin/memos/main.go - - echo -e "\033[34mBuilding $os/$arch to $output...\033[0m" - GOOS=$os GOARCH=$arch go build -ldflags="${ldFlags[*]}" -o "./build/memos-$os-$arch" ./bin/memos/main.go - if [ $? -ne 0 ]; then - echo -e "\033[0;31mgo build failed for $os/$arch($output)! See above.\033[0m" - fi -done - -echo -e "\033[32mBackend built!\033[0m" - -echo -e "\n\033[37mBuilds:\033[0m" -for build in "${goBuilds[@]}"; do - os=$(echo $build | cut -d'/' -f1) - arch=$(echo $build | cut -d'/' -f2) - output="$repo_root/build/memos-$os-$arch" - if [ "$os" = "windows" ]; then - output="$output.exe" - fi - echo -e "\033[37m$output\033[0m" -done -echo -e "\n\033[32mYou can test the build with \033[37m./build/memos--\033[0m\033[90m.exe\033[0m \033[37m--mode demo\033[0m" - -cd $repo_root diff --git a/scripts/docker-compose.dev.yaml b/scripts/docker-compose.dev.yaml deleted file mode 100644 index 05abbf9c..00000000 --- a/scripts/docker-compose.dev.yaml +++ /dev/null @@ -1,340 +0,0 @@ -# > Memos development environment < -# -# Available profiles: sqlite, mysql, postgres. -# Use `docker compose --profile PROFILE_NAME up` to launch only services within the profile. -# -# Services in the `tools` profile are used for running one-off tasks like linting, generating code, etc. -# -# Services started in all database profiles: -# Front-end: http://localhost:3001 -# API: http://localhost:8081 -# Adminer: http://localhost:8091 -# -# On Windows, run this before using docker-compose on a new terminal: -# $Env:HOME=$Env:USERPROFILE -# -# > Start Memos in development mode: -# docker compose -f ./scripts/docker-compose.dev.yaml --profile [sqlite|mysql|postgres] up --detach -# -# > Stop all services: -# docker compose -f ./scripts/docker-compose.dev.yaml --profile sqlite --profile postgres --profile mysql down -# -# > Remove related volumes: (all other files are mapped to ./air/docker/ directory) -# docker volume rm memos-dev_pnpm-store memos-dev_node-modules -# -# One-off tasks: -# > pnpm: -# docker compose -f ./scripts/docker-compose.dev.yaml run --rm pnpm [add|remove|update] [PACKAGE_NAME] [--save-dev] -# -# > buf: (run this after modifying .proto files) -# docker compose -f ./scripts/docker-compose.dev.yaml run --rm buf generate -# -# > go: -# docker compose -f ./scripts/docker-compose.dev.yaml run --rm go mod tidy -go=1.22 -# -# > golangci-lint: (run this before submitting Pull Requests affecting Go code) -# docker compose -f ./scripts/docker-compose.dev.yaml run --rm golangci-lint run -# -# > goimports: (run this if golangci-lint shows "File is not `goimports`-ed" -# docker compose -f ./scripts/docker-compose.dev.yaml run --rm goimports -local https://github.com/usememos/memos -w [FILE|.] -# -version: "3.0" -name: memos-dev -volumes: - # pnpm uses hard links and node_modules uses symlinks. - # Using volumes make things work properly on any host OS. - node-modules: - pnpm-store: -services: - web: - profiles: ["sqlite", "mysql", "postgres"] - image: node:20-alpine - ports: [3001:3001] - environment: - DEV_PROXY_SERVER: http://api:8081/ - NPM_CONFIG_UPDATE_NOTIFIER: false - working_dir: &web-working-dir /work/web - entrypoint: ["/bin/sh", "-c"] - command: ["corepack enable && pnpm i --frozen-lockfile && pnpm dev"] - tmpfs: &web-tmpfs /work/node_modules/:exec # avoid ERR_PNPM_LINKING_FAILED - volumes: &web-volumes - - node-modules:/work/web/node_modules - - pnpm-store:/work/web/.pnpm-store - - ../proto:/work/proto - - ../web:/work/web - - ../web/node_modules:/work/web/node_modules - healthcheck: - test: ["CMD", "wget", "-qO", "-", "http://localhost:3001"] - interval: 10s - timeout: 5s - - api: - profiles: ["sqlite"] - image: &api-image golang:1.22-alpine - ports: &api-ports [8081:8081] - environment: - MEMOS_DRIVER: sqlite - MEMOS_DATA: /var/opt/memos - working_dir: &api-working-dir /work - volumes: &api-volumes - - $HOME/go/pkg/:/go/pkg/ # Share go mod cache with host - - ../.air/docker/go-build:/root/.cache/go-build - - ../.air/docker/go/bin:/go/bin - - ../.air/docker/memosdata:/var/opt/memos - - ..:/work/ - configs: &api-configs - - source: air-entrypoint.sh - target: /usr/local/bin/entrypoint.sh - entrypoint: &api-entrypoint ["/bin/sh", "/usr/local/bin/entrypoint.sh"] - command: &api-command ["-c", "./scripts/.air.toml"] - healthcheck: &api-healthcheck - test: ["CMD", "wget", "-qO", "-", "http://localhost:8081/api/v1/ping"] - interval: 10s - timeout: 5s - - api-mysql: - profiles: ["mysql"] - depends_on: { mysql: { condition: service_healthy } } - hostname: api - environment: - { MEMOS_DRIVER: mysql, MEMOS_DSN: memos:memos@tcp(mysql)/memos } - image: *api-image - ports: *api-ports - working_dir: *api-working-dir - volumes: *api-volumes - configs: *api-configs - entrypoint: *api-entrypoint - command: *api-command - healthcheck: *api-healthcheck - - api-postgres: - profiles: ["postgres"] - depends_on: { postgres: { condition: service_healthy } } - hostname: api - environment: - MEMOS_DSN: "postgresql://memos:memos@postgres:5432/memos?sslmode=disable" - MEMOS_DRIVER: postgres - image: *api-image - ports: *api-ports - working_dir: *api-working-dir - volumes: *api-volumes - configs: *api-configs - entrypoint: *api-entrypoint - command: *api-command - healthcheck: *api-healthcheck - - mysql: - profiles: ["mysql"] - image: mysql - environment: - MYSQL_USER: memos - MYSQL_PASSWORD: memos - MYSQL_DATABASE: memos - MYSQL_ALLOW_EMPTY_PASSWORD: "yes" - volumes: [../.air/docker/mysql:/var/lib/mysql] - healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] - interval: 10s - timeout: 5s - - postgres: - profiles: ["postgres"] - image: postgres:alpine - hostname: postgres - volumes: [../.air/docker/postgres:/var/lib/postgresql/data] - environment: - { POSTGRES_DB: memos, POSTGRES_USER: memos, POSTGRES_PASSWORD: memos } - healthcheck: - test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] - interval: 10s - timeout: 5s - - pnpm: - profiles: ["tools"] - image: node:20-alpine - environment: { NPM_CONFIG_UPDATE_NOTIFIER: false } - working_dir: *web-working-dir - volumes: *web-volumes - tmpfs: *web-tmpfs - configs: - - source: pnpm-entrypoint.sh - target: /usr/local/bin/entrypoint.sh - entrypoint: ["sh", "/usr/local/bin/entrypoint.sh"] - - buf: - profiles: ["tools"] - image: bufbuild/buf - working_dir: /work/proto - command: generate - volumes: - - ../proto:/work/proto - - ../web/src/types/:/work/web/src/types/ - - go: - profiles: ["tools"] - image: *api-image - working_dir: *api-working-dir - volumes: *api-volumes - entrypoint: ["go"] - - goimports: - profiles: ["tools"] - image: *api-image - working_dir: *api-working-dir - volumes: *api-volumes - configs: - - source: goimports-entrypoint.sh - target: /usr/local/bin/entrypoint.sh - entrypoint: ["/bin/sh", "/usr/local/bin/entrypoint.sh"] - - golangci-lint: - profiles: ["tools"] - image: *api-image - working_dir: *api-working-dir - volumes: *api-volumes - configs: - - source: golangci-lint-entrypoint.sh - target: /usr/local/bin/entrypoint.sh - entrypoint: ["/bin/sh", "/usr/local/bin/entrypoint.sh"] - - adminer-mysql: - profiles: ["mysql"] - depends_on: { mysql: { condition: service_healthy } } - image: adminer - environment: &adminer-environment - ADMINER_DEFAULT_DRIVER: server # "server" is mysql - ADMINER_DEFAULT_SERVER: mysql - ADMINER_DEFAULT_USERNAME: memos - ADMINER_DEFAULT_PASSWORD: memos - ADMINER_DEFAULT_DB: memos - ADMINER_DESIGN: dracula # light: pepa-linha | https://www.adminer.org/#extras - ADMINER_PLUGINS: tables-filter table-structure edit-textarea dump-json # https://www.adminer.org/en/plugins/ - ports: &adminer-ports [127.0.0.1:8091:8080] - healthcheck: &adminer-healthcheck - test: 'php -r "exit(strpos(file_get_contents(\"http://localhost:8080/\"), \"Adminer\") !== false ? 0 : 1);"' - interval: 10s - timeout: 5s - configs: &adminer-configs - - source: adminer-index.php - target: /var/www/html/index.php - - adminer-postgres: - profiles: ["postgres"] - depends_on: { postgres: { condition: service_healthy } } - image: adminer - ports: *adminer-ports - healthcheck: *adminer-healthcheck - configs: *adminer-configs - environment: - <<: *adminer-environment - ADMINER_DEFAULT_DRIVER: pgsql - ADMINER_DEFAULT_SERVER: postgres - - adminer-sqlite: - profiles: ["sqlite"] - image: adminer - ports: *adminer-ports - healthcheck: *adminer-healthcheck - configs: *adminer-configs - environment: - <<: *adminer-environment - ADMINER_DEFAULT_PASSWORD: "" - ADMINER_DEFAULT_DRIVER: sqlite - ADMINER_DEFAULT_DB: /data/memos_dev.db - volumes: [../.air/docker/memosdata:/data] - -configs: - # Patched version of adminer index.php to fill the login form with default values - # and allow passwordless login whenever ADMINER_DEFAULT_DRIVER is sqlite. - adminer-index.php: - content: | -