feat(koi): hosted siyuan instance
This commit is contained in:
parent
fbd32e7003
commit
d204e99146
5 changed files with 251 additions and 0 deletions
|
@ -32,6 +32,7 @@
|
||||||
./containers/zond
|
./containers/zond
|
||||||
./containers/authentik
|
./containers/authentik
|
||||||
./containers/outline-wiki
|
./containers/outline-wiki
|
||||||
|
./containers/siyuan
|
||||||
./containers/teisu.nix
|
./containers/teisu.nix
|
||||||
./containers/bots/pcre-sub-bot.nix
|
./containers/bots/pcre-sub-bot.nix
|
||||||
./containers/bots/channel-logger-bot.nix
|
./containers/bots/channel-logger-bot.nix
|
||||||
|
|
63
hosts/koi/containers/siyuan/default.nix
Normal file
63
hosts/koi/containers/siyuan/default.nix
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
{ abs, pkgs, config, ... }@inputs:
|
||||||
|
|
||||||
|
let
|
||||||
|
secrets = import (abs "lib/secrets.nix");
|
||||||
|
trivial = import (abs "lib/trivial.nix") inputs;
|
||||||
|
|
||||||
|
UID = 1113;
|
||||||
|
context = trivial.storeDirectory ./image;
|
||||||
|
in {
|
||||||
|
imports = [
|
||||||
|
(secrets.declare [{
|
||||||
|
name = "siyuan-teidesu-authentik-env";
|
||||||
|
owner = "siyuan-teidesu";
|
||||||
|
}])
|
||||||
|
];
|
||||||
|
users.users.siyuan-teidesu = {
|
||||||
|
isNormalUser = true;
|
||||||
|
uid = UID;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.docker-siyuan-teidesu.serviceConfig.ExecStartPre = [
|
||||||
|
(pkgs.writeShellScript "build-siyuan" ''
|
||||||
|
docker build -t local/siyuan ${context}
|
||||||
|
'')
|
||||||
|
];
|
||||||
|
virtualisation.oci-containers.containers.siyuan-teidesu = {
|
||||||
|
image = "local/siyuan";
|
||||||
|
volumes = [
|
||||||
|
"/srv/siyuan-teidesu:/data"
|
||||||
|
];
|
||||||
|
cmd = [ "--workspace=/data" ];
|
||||||
|
environment = {
|
||||||
|
# we manage auth via authentik
|
||||||
|
SIYUAN_ACCESS_AUTH_CODE_BYPASS = "true";
|
||||||
|
};
|
||||||
|
user = builtins.toString UID;
|
||||||
|
};
|
||||||
|
|
||||||
|
virtualisation.oci-containers.containers.siyuan-teidesu-authentik = {
|
||||||
|
image = "ghcr.io/goauthentik/proxy";
|
||||||
|
environment = {
|
||||||
|
AUTHENTIK_HOST = "https://id.stupid.fish";
|
||||||
|
};
|
||||||
|
user = builtins.toString UID;
|
||||||
|
environmentFiles = [
|
||||||
|
(secrets.file config "siyuan-teidesu-authentik-env")
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
"d /srv/siyuan-teidesu 0700 ${builtins.toString UID} ${builtins.toString UID} -"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.nginx.virtualHosts."siyuan.tei.su" = {
|
||||||
|
forceSSL = true;
|
||||||
|
useACMEHost = "tei.su";
|
||||||
|
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://siyuan-teidesu-authentik.docker:9000$request_uri";
|
||||||
|
proxyWebsockets = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
60
hosts/koi/containers/siyuan/image/Dockerfile
Normal file
60
hosts/koi/containers/siyuan/image/Dockerfile
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
# based on https://github.com/siyuan-note/siyuan/blob/master/Dockerfile
|
||||||
|
FROM node:21 as NODE_BUILD
|
||||||
|
ARG COMMIT=3eec016723f52f3a679fb99854ae33e8fe20e42a
|
||||||
|
|
||||||
|
# fetch and patch
|
||||||
|
ADD *.patch /patches/
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y git jq && \
|
||||||
|
git clone https://github.com/siyuan-note/siyuan.git /go/src/github.com/siyuan-note/siyuan/ --depth=1 && \
|
||||||
|
cd /go/src/github.com/siyuan-note/siyuan/ && \
|
||||||
|
git fetch --depth=1 origin ${COMMIT} && \
|
||||||
|
git checkout ${COMMIT} && \
|
||||||
|
git submodule update --init --recursive && \
|
||||||
|
git apply /patches/license.patch
|
||||||
|
|
||||||
|
WORKDIR /go/src/github.com/siyuan-note/siyuan/
|
||||||
|
# the rest is pretty much the same as the official Dockerfile
|
||||||
|
|
||||||
|
RUN cd app && \
|
||||||
|
packageManager=$(jq -r '.packageManager' package.json) && \
|
||||||
|
if [ -n "$packageManager" ]; then \
|
||||||
|
npm install -g $packageManager; \
|
||||||
|
else \
|
||||||
|
echo "No packageManager field found in package.json"; \
|
||||||
|
npm install -g pnpm; \
|
||||||
|
fi && \
|
||||||
|
pnpm install --registry=http://registry.npmjs.org/ --silent && \
|
||||||
|
pnpm run build
|
||||||
|
RUN apt-get purge -y jq
|
||||||
|
RUN apt-get autoremove -y
|
||||||
|
RUN rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
FROM golang:alpine as GO_BUILD
|
||||||
|
WORKDIR /go/src/github.com/siyuan-note/siyuan/
|
||||||
|
COPY --from=NODE_BUILD /go/src/github.com/siyuan-note/siyuan/ /go/src/github.com/siyuan-note/siyuan/
|
||||||
|
ENV GO111MODULE=on
|
||||||
|
ENV CGO_ENABLED=1
|
||||||
|
RUN apk add --no-cache gcc musl-dev && \
|
||||||
|
cd kernel && go build --tags fts5 -v -ldflags "-s -w" && \
|
||||||
|
mkdir /opt/siyuan/ && \
|
||||||
|
mv /go/src/github.com/siyuan-note/siyuan/app/appearance/ /opt/siyuan/ && \
|
||||||
|
mv /go/src/github.com/siyuan-note/siyuan/app/stage/ /opt/siyuan/ && \
|
||||||
|
mv /go/src/github.com/siyuan-note/siyuan/app/guide/ /opt/siyuan/ && \
|
||||||
|
mv /go/src/github.com/siyuan-note/siyuan/app/changelogs/ /opt/siyuan/ && \
|
||||||
|
mv /go/src/github.com/siyuan-note/siyuan/kernel/kernel /opt/siyuan/ && \
|
||||||
|
find /opt/siyuan/ -name .git | xargs rm -rf
|
||||||
|
|
||||||
|
FROM alpine:latest
|
||||||
|
LABEL maintainer="Liang Ding<845765@qq.com>"
|
||||||
|
|
||||||
|
WORKDIR /opt/siyuan/
|
||||||
|
COPY --from=GO_BUILD /opt/siyuan/ /opt/siyuan/
|
||||||
|
RUN addgroup --gid 1113 siyuan && adduser --uid 1113 --ingroup siyuan --disabled-password siyuan && apk add --no-cache ca-certificates tzdata && chown -R siyuan:siyuan /opt/siyuan/
|
||||||
|
|
||||||
|
ENV TZ=Asia/Shanghai
|
||||||
|
ENV RUN_IN_CONTAINER=true
|
||||||
|
EXPOSE 6806
|
||||||
|
|
||||||
|
USER siyuan
|
||||||
|
ENTRYPOINT ["/opt/siyuan/kernel"]
|
121
hosts/koi/containers/siyuan/image/license.patch
Normal file
121
hosts/koi/containers/siyuan/image/license.patch
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
diff --git a/app/src/util/needSubscribe.ts b/app/src/util/needSubscribe.ts
|
||||||
|
index 6ba7848..329ef97 100644
|
||||||
|
--- a/app/src/util/needSubscribe.ts
|
||||||
|
+++ b/app/src/util/needSubscribe.ts
|
||||||
|
@@ -2,22 +2,9 @@ import {showMessage} from "../dialog/message";
|
||||||
|
import {getCloudURL} from "../config/util/about";
|
||||||
|
|
||||||
|
export const needSubscribe = (tip = window.siyuan.languages._kernel[29]) => {
|
||||||
|
- if (window.siyuan.user && (window.siyuan.user.userSiYuanProExpireTime === -1 || window.siyuan.user.userSiYuanProExpireTime > 0)) {
|
||||||
|
- return false;
|
||||||
|
- }
|
||||||
|
- if (tip) {
|
||||||
|
- if (tip === window.siyuan.languages._kernel[29] && window.siyuan.config.system.container === "ios") {
|
||||||
|
- showMessage(window.siyuan.languages._kernel[122]);
|
||||||
|
- } else {
|
||||||
|
- if (tip === window.siyuan.languages._kernel[29]) {
|
||||||
|
- tip = window.siyuan.languages._kernel[29].replace("${url}", getCloudURL("subscribe/siyuan"));
|
||||||
|
- }
|
||||||
|
- showMessage(tip);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- return true;
|
||||||
|
+ return false
|
||||||
|
};
|
||||||
|
|
||||||
|
export const isPaidUser = () => {
|
||||||
|
- return window.siyuan.user && (0 === window.siyuan.user.userSiYuanSubscriptionStatus || 1 === window.siyuan.user.userSiYuanOneTimePayStatus);
|
||||||
|
+ return true
|
||||||
|
};
|
||||||
|
diff --git a/kernel/model/cloud_service.go b/kernel/model/cloud_service.go
|
||||||
|
index 6623931..b9e03f0 100644
|
||||||
|
--- a/kernel/model/cloud_service.go
|
||||||
|
+++ b/kernel/model/cloud_service.go
|
||||||
|
@@ -33,7 +33,6 @@ import (
|
||||||
|
"github.com/siyuan-note/httpclient"
|
||||||
|
"github.com/siyuan-note/logging"
|
||||||
|
"github.com/siyuan-note/siyuan/kernel/conf"
|
||||||
|
- "github.com/siyuan-note/siyuan/kernel/task"
|
||||||
|
"github.com/siyuan-note/siyuan/kernel/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
@@ -223,37 +222,7 @@ func RefreshCheckJob() {
|
||||||
|
}
|
||||||
|
|
||||||
|
func refreshSubscriptionExpirationRemind() {
|
||||||
|
- if subscriptionExpirationReminded {
|
||||||
|
- return
|
||||||
|
- }
|
||||||
|
- subscriptionExpirationReminded = true
|
||||||
|
-
|
||||||
|
- if "ios" == util.Container {
|
||||||
|
- return
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- defer logging.Recover()
|
||||||
|
|
||||||
|
- if IsSubscriber() && -1 != Conf.GetUser().UserSiYuanProExpireTime {
|
||||||
|
- expired := int64(Conf.GetUser().UserSiYuanProExpireTime)
|
||||||
|
- now := time.Now().UnixMilli()
|
||||||
|
- if now >= expired { // 已经过期
|
||||||
|
- if now-expired <= 1000*60*60*24*2 { // 2 天内提醒 https://github.com/siyuan-note/siyuan/issues/7816
|
||||||
|
- task.AppendAsyncTaskWithDelay(task.PushMsg, 30*time.Second, util.PushErrMsg, Conf.Language(128), 0)
|
||||||
|
- }
|
||||||
|
- return
|
||||||
|
- }
|
||||||
|
- remains := int((expired - now) / 1000 / 60 / 60 / 24)
|
||||||
|
- expireDay := 15 // 付费订阅提前 15 天提醒
|
||||||
|
- if 2 == Conf.GetUser().UserSiYuanSubscriptionPlan {
|
||||||
|
- expireDay = 3 // 试用订阅提前 3 天提醒
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if 0 < remains && expireDay > remains {
|
||||||
|
- task.AppendAsyncTaskWithDelay(task.PushMsg, 7*time.Second, util.PushErrMsg, fmt.Sprintf(Conf.Language(127), remains), 0)
|
||||||
|
- return
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
func refreshUser() {
|
||||||
|
diff --git a/kernel/model/conf.go b/kernel/model/conf.go
|
||||||
|
index 3c3add3..a095512 100644
|
||||||
|
--- a/kernel/model/conf.go
|
||||||
|
+++ b/kernel/model/conf.go
|
||||||
|
@@ -836,22 +836,11 @@ func InitBoxes() {
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsSubscriber() bool {
|
||||||
|
- u := Conf.GetUser()
|
||||||
|
- return nil != u && (-1 == u.UserSiYuanProExpireTime || 0 < u.UserSiYuanProExpireTime) && 0 == u.UserSiYuanSubscriptionStatus
|
||||||
|
+ return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsPaidUser() bool {
|
||||||
|
- // S3/WebDAV data sync and backup are available for a fee https://github.com/siyuan-note/siyuan/issues/8780
|
||||||
|
-
|
||||||
|
- if IsSubscriber() {
|
||||||
|
- return true
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- u := Conf.GetUser()
|
||||||
|
- if nil == u {
|
||||||
|
- return false
|
||||||
|
- }
|
||||||
|
- return 1 == u.UserSiYuanOneTimePayStatus
|
||||||
|
+ return true
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
diff --git a/kernel/util/working.go b/kernel/util/working.go
|
||||||
|
index c77fe64..573ce64 100644
|
||||||
|
--- a/kernel/util/working.go
|
||||||
|
+++ b/kernel/util/working.go
|
||||||
|
@@ -44,7 +44,7 @@ import (
|
||||||
|
var Mode = "prod"
|
||||||
|
|
||||||
|
const (
|
||||||
|
- Ver = "3.1.6"
|
||||||
|
+ Ver = "100.3.1.6"
|
||||||
|
IsInsider = false
|
||||||
|
)
|
||||||
|
|
6
secrets/siyuan-teidesu-authentik-env.age
Normal file
6
secrets/siyuan-teidesu-authentik-env.age
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 sj88Xw K4t0UbmCo9hVvB3k0ut17zjnN/SrqjiCRokNy4CSvi4
|
||||||
|
b067KvwE3J3NrXY5ZANkoUdS0UTTbkWWrCpsWtS0eP8
|
||||||
|
--- 7cx4kHSwSvsAlAMvfM/lGr3B2QhmD6vhNdFSzLAnUuo
|
||||||
|
fÁÏr¹rx/E×!~ õZM×Tj¸€ì@'EcnV¤sÍqØy±q<k¬¼±k˜t™1þ w̤’~(? _bÝÐ8q ï¿•›„bˆÞgÄ4W.†óOâ,¹Çšùy‰º$Û9°(^
|
||||||
|
rÐ
|
Loading…
Reference in a new issue