Compare commits

...

10 commits

27 changed files with 144 additions and 69 deletions

View file

@ -4,7 +4,7 @@
本家 Firefish のリポジトリは[こちら](https://git.joinfirefish.org/firefish/firefish)です。 本家 Firefish のリポジトリは[こちら](https://git.joinfirefish.org/firefish/firefish)です。
~~`main` ブランチではこのフォークに適用された変更のコミット履歴のみが、`history` ブランチでは本家 Firefish のコミットを含む完全なコミット履歴が閲覧できます。このフォークの機能について調べるには `main` ブランチを、コードの著者について調べるには `history` ブランチを参照してください。~~申し訳ありませんが、現在 `history` ブランチがきちんと整備されていません。再整備を行い、Misskey の最初のコミットから始まる)完全なコミット履歴を再公開する予定です。 `main` ブランチではこのフォークに適用された変更のコミット履歴のみが、`history` ブランチでは Misskey の最初のコミットから始まる完全なコミット履歴を確認できます。このフォークの機能について調べるには `main` ブランチを、コードの著者について調べるには `history` ブランチを参照してください。
## 各種説明 ## 各種説明

View file

@ -10,7 +10,3 @@ down:
.PHONY: up .PHONY: up
up: up:
podman-compose up --detach podman-compose up --detach
podman-compose exec db psql \
--user=firefish \
--dbname=firefish_db \
--command='CREATE EXTENSION pgroonga;'

View file

@ -14,3 +14,5 @@ services:
- "POSTGRES_DB=firefish_db" - "POSTGRES_DB=firefish_db"
ports: ports:
- "5432:5432" - "5432:5432"
volumes:
- "../neko/pgroonga.sql:/docker-entrypoint-initdb.d/pgroonga.sql:ro"

View file

@ -40,6 +40,7 @@ services:
- .config/docker.env - .config/docker.env
volumes: volumes:
- ./db:/var/lib/postgresql/data - ./db:/var/lib/postgresql/data
- ./neko/pgroonga.sql:/docker-entrypoint-initdb.d/pgroonga.sql:ro
networks: networks:
calcnet: calcnet:

View file

@ -17,6 +17,7 @@
- pnpm - pnpm
- shellcheck - shellcheck
- sea-orm-cli - sea-orm-cli
- cargo
2. コンテナを起動し、PGroonga を有効化する 2. コンテナを起動し、PGroonga を有効化する
@ -62,6 +63,36 @@ make debug
make pre-commit make pre-commit
``` ```
### コミットメッセージ
コミットメッセージの書き方に厳密な規則はありませんが、私は以下のようにコミットメッセージを書いているのである程度それに則ってもらえると助かります。でも適当で大丈夫です(更新を取り込む際にコミットメッセージが書き換えられる場合もありますが、ご了承ください)。
コミットメッセージは英語で書き、場合によっては冠詞などを適度に省いて短く収めてください。長い説明が必要な場合には、以下の規則で 1 行目にざっくりとしたコミットメッセージを書いてから 2 つ改行して(つまり 1 行空けて)詳細説明を続けてください。
コミットメッセージの頭文字は大文字にせず、動詞から始める場合には現在形を用いてください。例えば、`feat: Added xxxxx` とはせずに `feat: add xxxxx` としてください。
1. 重大な不具合の緊急修正: `hotfix: 不具合の内容`
- プログラム自体が起動しなくなったり投稿が一切できなくなるなどの重大な不具合を回避するための更新には `hotfix:` を頭につけます。
2. ドキュメントのみの更新: `docs: 更新の概要`
- 内容がドキュメントの更新のみの場合、`docs:` を頭につけます。たとえ更新内容が誤字の訂正であったとしても `fix: typo` ではなく `docs: fix typo` とします。
3. 翻訳の更新: `locale: 更新の概要`
- `locales/` 以下のファイルをいじった場合のコミットなどがこれに該当します。
4. コンテナイメージに関する更新: `container: 更新の概要`
- `Dockerfile``docker-compose.yml` の更新など、Podman/Docker のユーザー以外には一切影響しない更新がこれに該当します。
5. Firefish のプログラム本体には変更を加えない更新: `dev: 更新の概要`
- アップデートスクリプトや Makefile の更新など、プログラム本体への変更は加えない場合には `dev:` を頭につけます。
- `packages.json`, `packages/`, `locales/` に変更を全く加えていないコミットは大体これに該当します。
- 開発とは全く関係無い場合には `meta:` を用いてもよいです。
6. 不具合の修正: `fix: 不具合の内容`
7. 機能の追加: `feat: 更新の概要`
8. パフォーマンスの向上のための再設計: `perf: 再設計の概要`
9. Web クライアントの見た目の変更: `style: 更新の概要`
10. プログラムの再設計: `refactor: 再設計の概要`
11. その他の雑務: `chore: 更新の概要`
- コードのフォーマットや非常に小規模なプログラムの書き換え(一箇所の `||``??` に書き換えるなど)や依存パッケージの更新がこれに該当します。
更新が本当に小規模な場合には `:` の直前に `(minor)` を入れても良いです(例: `docs (minor): fix typo in README.md`)が、ほとんどの場合にこれは使う必要がありません。
## 注意事項 ## 注意事項
データベースのマイグレーションを伴う変更を加える場合にはマイグレーションのファイルを [`packages/backend/migration-neko`](https://code.naskya.net/naskya/firefish/source-by/main/packages/backend/migration-neko) の下に作成し、マイグレーションを打ち消す SQL クエリを [`neko/revert.sql`](https://code.naskya.net/naskya/firefish/source-by/main/neko/revert.sql) の**一番上に**追記してください。 データベースのマイグレーションを伴う変更を加える場合にはマイグレーションのファイルを [`packages/backend/migration-neko`](https://code.naskya.net/naskya/firefish/source-by/main/packages/backend/migration-neko) の下に作成し、マイグレーションを打ち消す SQL クエリを [`neko/revert.sql`](https://code.naskya.net/naskya/firefish/source-by/main/neko/revert.sql) の**一番上に**追記してください。

View file

@ -49,7 +49,7 @@
2. このリポジトリを複製し、リポジトリのディレクトリに移る 2. このリポジトリを複製し、リポジトリのディレクトリに移る
```bash ```bash
git clone https://code.naskya.net/naskya/firefish git clone --branch=main https://code.naskya.net/naskya/firefish
cd firefish cd firefish
``` ```
@ -144,7 +144,7 @@ x86_64 アーキテクチャの Linux のマシン上では、[`registry.code.na
1. このリポジトリを複製し、リポジトリのディレクトリに移る 1. このリポジトリを複製し、リポジトリのディレクトリに移る
```bash ```bash
git clone https://code.naskya.net/naskya/firefish git clone --branch=main https://code.naskya.net/naskya/firefish
cd firefish cd firefish
``` ```

View file

@ -25,7 +25,7 @@
5. 元々 Firefish がインストールされていたディレクトリ (e.g., `./firefish`) と同じ名前でこのリポジトリをクローンする 5. 元々 Firefish がインストールされていたディレクトリ (e.g., `./firefish`) と同じ名前でこのリポジトリをクローンする
```bash ```bash
git clone https://code.naskya.net/naskya/firefish firefish git clone --branch=main https://code.naskya.net/naskya/firefish firefish
``` ```
6. 必要なファイルを元のディレクトリからコピーする 6. 必要なファイルを元のディレクトリからコピーする
@ -136,7 +136,7 @@ Docker を使う場合には以下の `podman`, `podman-compose`, `--podman` を
4. 元々 Firefish がインストールされていたディレクトリ (e.g., `./firefish`) と同じ名前でこのリポジトリをクローンする 4. 元々 Firefish がインストールされていたディレクトリ (e.g., `./firefish`) と同じ名前でこのリポジトリをクローンする
```bash ```bash
git clone https://code.naskya.net/naskya/firefish firefish git clone --branch=main https://code.naskya.net/naskya/firefish firefish
``` ```
5. 必要なファイルを元のディレクトリからコピーする 5. 必要なファイルを元のディレクトリからコピーする

View file

@ -266,9 +266,11 @@ if (!nativeBinding) {
} }
const { const {
EnvConfig,
readEnvironmentConfig,
readServerConfig,
stringToAcct, stringToAcct,
acctToString, acctToString,
config,
getFullApAccount, getFullApAccount,
isSelfHost, isSelfHost,
extractHost, extractHost,
@ -286,9 +288,11 @@ const {
nativeInitIdGenerator, nativeInitIdGenerator,
} = nativeBinding; } = nativeBinding;
module.exports.EnvConfig = EnvConfig;
module.exports.readEnvironmentConfig = readEnvironmentConfig;
module.exports.readServerConfig = readServerConfig;
module.exports.stringToAcct = stringToAcct; module.exports.stringToAcct = stringToAcct;
module.exports.acctToString = acctToString; module.exports.acctToString = acctToString;
module.exports.config = config;
module.exports.getFullApAccount = getFullApAccount; module.exports.getFullApAccount = getFullApAccount;
module.exports.isSelfHost = isSelfHost; module.exports.isSelfHost = isSelfHost;
module.exports.extractHost = extractHost; module.exports.extractHost = extractHost;

1
neko/pgroonga.sql Normal file
View file

@ -0,0 +1 @@
CREATE EXTENSION pgroonga;

View file

@ -27,7 +27,7 @@
"clean": "pnpm node ./scripts/clean-built.mjs", "clean": "pnpm node ./scripts/clean-built.mjs",
"clean-cargo": "pnpm node ./scripts/clean-cargo.mjs", "clean-cargo": "pnpm node ./scripts/clean-cargo.mjs",
"clean-npm": "pnpm node ./scripts/clean-npm.mjs", "clean-npm": "pnpm node ./scripts/clean-npm.mjs",
"clean-all": "pnpm run clean && pnpm run claen-cargo && pnpm run clean-npm", "clean-all": "pnpm run clean && pnpm run clean-cargo && pnpm run clean-npm",
"cleanall": "pnpm run clean-all" "cleanall": "pnpm run clean-all"
}, },
"resolutions": { "resolutions": {

View file

@ -0,0 +1,28 @@
#[cfg_attr(feature = "napi", napi_derive::napi)]
pub struct EnvConfig {
pub only_queue: bool,
pub only_server: bool,
pub no_daemons: bool,
pub disable_clustering: bool,
pub verbose: bool,
pub with_log_time: bool,
pub quiet: bool,
pub slow: bool,
}
#[cfg_attr(feature = "napi", napi_derive::napi)]
pub fn read_environment_config() -> EnvConfig {
let node_env = std::env::var("NODE_ENV").unwrap_or_default().to_lowercase();
let is_testing = node_env == "test" || node_env == "testing";
EnvConfig {
only_queue: std::env::var("MK_ONLY_QUEUE").is_ok(),
only_server: std::env::var("MK_ONLY_SERVER").is_ok(),
no_daemons: is_testing || std::env::var("MK_NO_DAEMONS").is_ok(),
disable_clustering: is_testing || std::env::var("MK_DISABLE_CLUSTERING").is_ok(),
verbose: std::env::var("MK_VERBOSE").is_ok(),
with_log_time: std::env::var("MK_WITH_LOG_TIME").is_ok(),
quiet: is_testing || std::env::var("MK_QUIET").is_ok(),
slow: std::env::var("MK_SLOW").is_ok(),
}
}

View file

@ -0,0 +1,2 @@
pub mod environment;
pub mod server;

View file

@ -0,0 +1,54 @@
use serde::Deserialize;
use serde_yaml;
use std::env;
use std::fs;
#[derive(Debug, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "napi", napi_derive::napi(object))]
pub struct ServerConfig {
pub url: String,
pub db: DbConfig,
pub redis: RedisConfig,
pub cache_server: Option<RedisConfig>,
}
#[derive(Debug, PartialEq, Deserialize)]
#[cfg_attr(feature = "napi", napi_derive::napi(object))]
pub struct DbConfig {
pub host: String,
pub port: u32,
pub db: String,
pub user: String,
pub pass: String,
}
#[derive(Debug, PartialEq, Deserialize)]
#[cfg_attr(feature = "napi", napi_derive::napi(object))]
pub struct RedisConfig {
pub host: String,
pub port: u32,
pub user: Option<String>,
pub pass: Option<String>,
pub tls: Option<TlsConfig>,
#[serde(default)]
pub db: u32,
#[serde(default)]
pub prefix: String,
}
#[derive(Debug, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "napi", napi_derive::napi(object))]
pub struct TlsConfig {
pub host: String,
pub reject_unauthorized: bool,
}
#[cfg_attr(feature = "napi", napi_derive::napi)]
pub fn read_server_config() -> ServerConfig {
let cwd = env::current_dir().unwrap();
let yml = fs::File::open(cwd.join("../../.config/default.yml"))
.expect("Failed to open '.config/default.yml'");
serde_yaml::from_reader(yml).expect("Failed to parse yaml")
}

View file

@ -1,3 +1,4 @@
pub mod config;
pub mod database; pub mod database;
pub mod macros; pub mod macros;
pub mod model; pub mod model;

View file

@ -1,4 +1,3 @@
#[derive(Clone, Eq, PartialEq, Debug)]
#[cfg_attr(feature = "napi", napi_derive::napi(object))] #[cfg_attr(feature = "napi", napi_derive::napi(object))]
pub struct Acct { pub struct Acct {
pub username: String, pub username: String,

View file

@ -1,20 +0,0 @@
use serde::Deserialize;
use serde_yaml;
use std::env;
use std::fs;
/// TODO: add more fields
#[derive(Debug, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "napi", napi_derive::napi(object))]
pub struct Config {
pub url: String,
}
#[cfg_attr(feature = "napi", napi_derive::napi)]
pub fn config() -> Config {
let cwd = env::current_dir().unwrap();
let yml = fs::File::open(cwd.join("../../.config/default.yml"))
.expect("Failed to open '.config/default.yml'");
serde_yaml::from_reader(yml).expect("Failed to parse yaml")
}

View file

@ -1,11 +1,11 @@
use crate::util::config::config; use crate::config::server::read_server_config;
use idna; use idna;
use url::Url; use url::Url;
#[cfg_attr(feature = "napi", napi_derive::napi)] #[cfg_attr(feature = "napi", napi_derive::napi)]
pub fn get_full_ap_account(username: String, host: Option<String>) -> String { pub fn get_full_ap_account(username: String, host: Option<String>) -> String {
if host.is_none() { if host.is_none() {
format!("{}@{}", username, extract_host(config().url)) format!("{}@{}", username, extract_host(read_server_config().url))
} else { } else {
format!("{}@{}", username, to_puny(host.unwrap())) format!("{}@{}", username, to_puny(host.unwrap()))
} }
@ -14,7 +14,7 @@ pub fn get_full_ap_account(username: String, host: Option<String>) -> String {
#[cfg_attr(feature = "napi", napi_derive::napi)] #[cfg_attr(feature = "napi", napi_derive::napi)]
pub fn is_self_host(host: Option<String>) -> bool { pub fn is_self_host(host: Option<String>) -> bool {
if let Some(x) = host { if let Some(x) = host {
extract_host(config().url) == to_puny(x) extract_host(read_server_config().url) == to_puny(x)
} else { } else {
true true
} }

View file

@ -1,5 +1,4 @@
pub mod acct; pub mod acct;
pub mod config;
pub mod convert_host; pub mod convert_host;
pub mod convert_to_hidden_post; pub mod convert_to_hidden_post;
pub mod escape_sql; pub mod escape_sql;

View file

@ -3,7 +3,7 @@ import chalk from "chalk";
import Xev from "xev"; import Xev from "xev";
import Logger from "@/services/logger.js"; import Logger from "@/services/logger.js";
import { envOption } from "../env.js"; import { envOption } from "@/config/index.js";
// for typeorm // for typeorm
import "reflect-metadata"; import "reflect-metadata";

View file

@ -10,7 +10,7 @@ import semver from "semver";
import Logger from "@/services/logger.js"; import Logger from "@/services/logger.js";
import loadConfig from "@/config/load.js"; import loadConfig from "@/config/load.js";
import type { Config } from "@/config/types.js"; import type { Config } from "@/config/types.js";
import { envOption } from "@/env.js"; import { envOption } from "@/config/index.js";
import { showMachineInfo } from "@/misc/show-machine-info.js"; import { showMachineInfo } from "@/misc/show-machine-info.js";
import { db, initDb } from "@/db/postgre.js"; import { db, initDb } from "@/db/postgre.js";

View file

@ -1,3 +1,5 @@
import load from "./load.js"; import load from "./load.js";
import { readEnvironmentConfig } from "native-utils/built/index.js";
export default load(); export default load();
export const envOption = readEnvironmentConfig();

View file

@ -1,25 +0,0 @@
const envOption = {
onlyQueue: false,
onlyServer: false,
noDaemons: false,
disableClustering: false,
verbose: false,
withLogTime: false,
quiet: false,
slow: false,
};
for (const key of Object.keys(envOption) as (keyof typeof envOption)[]) {
if (
process.env[
`MK_${key.replace(/[A-Z]/g, (letter) => `_${letter}`).toUpperCase()}`
]
)
envOption[key] = true;
}
if (process.env.NODE_ENV === "test") envOption.disableClustering = true;
if (process.env.NODE_ENV === "test") envOption.quiet = true;
if (process.env.NODE_ENV === "test") envOption.noDaemons = true;
export { envOption };

View file

@ -5,7 +5,7 @@ import config from "@/config/index.js";
import type { DriveFile } from "@/models/entities/drive-file.js"; import type { DriveFile } from "@/models/entities/drive-file.js";
import type { IActivity } from "@/remote/activitypub/type.js"; import type { IActivity } from "@/remote/activitypub/type.js";
import type { Webhook, webhookEventTypes } from "@/models/entities/webhook.js"; import type { Webhook, webhookEventTypes } from "@/models/entities/webhook.js";
import { envOption } from "../env.js"; import { envOption } from "@/config/index.js";
import processDeliver from "./processors/deliver.js"; import processDeliver from "./processors/deliver.js";
import processInbox from "./processors/inbox.js"; import processInbox from "./processors/inbox.js";

View file

@ -44,9 +44,9 @@ async function translateCommitMsg(msg: string, targetLang: Language) {
if (targetLang.startsWith("ja")) { if (targetLang.startsWith("ja")) {
const prefixes = { const prefixes = {
container: "コンテナ (Podman/Docker)",
chore: "雑務", chore: "雑務",
dev: "開発", dev: "開発",
docker: "Docker",
docs: "ドキュメント", docs: "ドキュメント",
feat: "新機能", feat: "新機能",
fix: "修正", fix: "修正",

View file

@ -20,7 +20,7 @@ import { fetchMeta } from "@/misc/fetch-meta.js";
import { genIdenticon } from "@/misc/gen-identicon.js"; import { genIdenticon } from "@/misc/gen-identicon.js";
import { createTemp } from "@/misc/create-temp.js"; import { createTemp } from "@/misc/create-temp.js";
import { stringToAcct } from "native-utils/built/index.js"; import { stringToAcct } from "native-utils/built/index.js";
import { envOption } from "@/env.js"; import { envOption } from "@/config/index.js";
import megalodon, { MegalodonInterface } from "megalodon"; import megalodon, { MegalodonInterface } from "megalodon";
import activityPub from "./activitypub.js"; import activityPub from "./activitypub.js";
import nodeinfo from "./nodeinfo.js"; import nodeinfo from "./nodeinfo.js";

View file

@ -2,7 +2,7 @@ import cluster from "node:cluster";
import chalk from "chalk"; import chalk from "chalk";
import { default as convertColor } from "color-convert"; import { default as convertColor } from "color-convert";
import { format as dateFormat } from "date-fns"; import { format as dateFormat } from "date-fns";
import { envOption } from "@/env.js"; import { envOption } from "@/config/index.js";
import config from "@/config/index.js"; import config from "@/config/index.js";
import * as SyslogPro from "syslog-pro"; import * as SyslogPro from "syslog-pro";

View file

@ -10,7 +10,7 @@ OLD_COMMIT=$(git rev-parse --short HEAD)
say 'Pulling changes from the remote repo...' say 'Pulling changes from the remote repo...'
run 'git checkout -- package.json packages/backend/assets' run 'git checkout -- package.json packages/backend/assets'
run 'git pull --ff --no-edit --autostash --strategy-option theirs' run 'git pull --ff --no-edit --autostash --strategy-option theirs origin main'
NEW_COMMIT=$(git rev-parse --short HEAD) NEW_COMMIT=$(git rev-parse --short HEAD)