From a6416f9ea6452e457b07e4cccd025147450e6b4b Mon Sep 17 00:00:00 2001 From: Alex Palaistras Date: Sat, 27 Nov 2021 17:37:46 +0000 Subject: [PATCH] Add service for WriteFreely This commit integrates WriteFreely as a systemd service, set up as a single-user instance by default (as is probably appropriate for a home-server setup); a default administrator is set up, and whoever is managing the home-server is expected to update the username and password after first login. Though WriteFreely expects to have a hostname set up for the instance, we do not listen on any specific hostname by default. It is expected, rather, that the `nginx-proxy-http` service is used with a drop-in for using the correct `writefreely` upstream. Configuration for this will continue to evolve as required. --- config/service/writefreely/Containerfile | 20 +++++++++++ .../container/config/config.ini.template | 29 ++++++++++++++++ .../writefreely/container/run-writefreely | 31 ++++++++++++++++++ config/service/writefreely/spec.bu | 10 ++++++ .../writefreely/systemd/writefreely.service | 20 +++++++++++ .../writefreely/writefreely.env.template | 5 +++ host/lhr01nuc/lhr01nuc.env.gpg | Bin 2610 -> 2643 bytes host/lhr01srv/lhr01srv.env.gpg | Bin 2607 -> 2643 bytes host/virtual/virtual.env | 3 ++ 9 files changed, 118 insertions(+) create mode 100644 config/service/writefreely/Containerfile create mode 100644 config/service/writefreely/container/config/config.ini.template create mode 100755 config/service/writefreely/container/run-writefreely create mode 100644 config/service/writefreely/spec.bu create mode 100644 config/service/writefreely/systemd/writefreely.service create mode 100644 config/service/writefreely/writefreely.env.template diff --git a/config/service/writefreely/Containerfile b/config/service/writefreely/Containerfile new file mode 100644 index 0000000..626200f --- /dev/null +++ b/config/service/writefreely/Containerfile @@ -0,0 +1,20 @@ +FROM docker.io/debian:bullseye-slim +ARG VERSION=0.13.1 + +RUN apt-get update -y && apt-get upgrade -y && \ + apt-get install -y --no-install-recommends curl ca-certificates gettext gosu + +ENV PACKAGE_URL https://github.com/writefreely/writefreely/releases/download/v${VERSION}/writefreely_${VERSION}_linux_amd64.tar.gz +RUN curl -L ${PACKAGE_URL} | tar -C /opt --no-same-owner -xvzf - && \ + mv /opt/writefreely/writefreely /bin/writefreely && chmod +x /bin/writefreely + +RUN apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false curl + +RUN addgroup --system --gid 10000 writefreely +RUN adduser --system --uid 10000 --ingroup writefreely --home /var/lib/writefreely writefreely + +COPY container/config /etc/writefreely +COPY container/run-writefreely /run-writefreely + +EXPOSE 8080 +ENTRYPOINT ["/run-writefreely"] diff --git a/config/service/writefreely/container/config/config.ini.template b/config/service/writefreely/container/config/config.ini.template new file mode 100644 index 0000000..90d3d41 --- /dev/null +++ b/config/service/writefreely/container/config/config.ini.template @@ -0,0 +1,29 @@ +[server] +bind = 0.0.0.0 +port = 8080 +templates_parent_dir = /opt/writefreely +static_parent_dir = /opt/writefreely +pages_parent_dir = /opt/writefreely +keys_parent_dir = /var/lib/writefreely + +[database] +type = sqlite3 +filename = /var/lib/writefreely/writefreely.db + +[app] +site_name = WriteFreely +site_description = +host = ${WRITEFREELY_SITE_HOST} +theme = ${WRITEFREELY_SITE_THEME} +editor = ${WRITEFREELY_EDITOR} +wf_modesty = true +single_user = ${WRITEFREELY_SINGLE_USER} +open_registration = false +open_deletion = false +user_invites = admin +min_username_len = 3 +max_blogs = 100 +federation = false +private = false +update_checks = false +disable_password_auth = false diff --git a/config/service/writefreely/container/run-writefreely b/config/service/writefreely/container/run-writefreely new file mode 100755 index 0000000..6eaf1ea --- /dev/null +++ b/config/service/writefreely/container/run-writefreely @@ -0,0 +1,31 @@ +#!/bin/sh + +# Create configuration file from collected templates. +envsubst < /etc/writefreely/config.ini.template > /etc/writefreely/config.ini +mkdir -p /var/lib/writefreely/keys + +# Initialize and run migrates on database if needed. New instances of WriteFreely will have a +# default administrator be created with a random password, which is echoed back to the system. It +# is intended that both the username and password are changed by whoever manages this instance. +if ! test -f /var/lib/writefreely/writefreely.db; then + writefreely -c /etc/writefreely/config.ini db init + ( + password="$(dd if=/dev/urandom | tr -dc '[:alnum:]' | head -c 50)" + writefreely -c /etc/writefreely/config.ini user add --admin "default:${password}" + echo "Created an administrator user with username 'default' and password '${password}'" + echo "Make sure to change this immediately after logging in for the first time!" + ) +fi + +writefreely -c /etc/writefreely/config.ini db migrate + +# Generate keys, if none have already been generated. +if test -z "$(ls -A /var/lib/writefreely/keys)"; then + writefreely -c /etc/writefreely/config.ini keys generate +fi + +# Correct permissions for data files. +chown -R writefreely:writefreely /var/lib/writefreely + +# Run entrypoint under specific user. +gosu writefreely /bin/writefreely -c /etc/writefreely/config.ini "$@" diff --git a/config/service/writefreely/spec.bu b/config/service/writefreely/spec.bu new file mode 100644 index 0000000..f2926f2 --- /dev/null +++ b/config/service/writefreely/spec.bu @@ -0,0 +1,10 @@ +variant: fcos +version: 1.3.0 +storage: + trees: + - path: /etc/systemd/system + local: service/writefreely/systemd/ +systemd: + units: + - name: writefreely.service + enabled: true diff --git a/config/service/writefreely/systemd/writefreely.service b/config/service/writefreely/systemd/writefreely.service new file mode 100644 index 0000000..227bfc5 --- /dev/null +++ b/config/service/writefreely/systemd/writefreely.service @@ -0,0 +1,20 @@ +[Unit] +Description=WriteFreely Federated Writing Application +Wants=container-build@%N.service container-volume@%N.service +After=container-build@%N.service container-volume@%N.service + +[Service] +Type=notify +NotifyAccess=all +SyslogIdentifier=%N +Restart=on-failure +Environment=PODMAN_SYSTEMD_UNIT=%n +ExecStart=/bin/podman run --replace --name %N --net internal --sdnotify=conmon \ + --env-file %E/coreos-home-server/%N/%N.env \ + --volume %N:/var/lib/%N:z \ + localhost/%N:latest +ExecStop=/bin/podman stop --ignore --time 10 %N +ExecStopPost=/bin/podman rm --ignore --force %N + +[Install] +WantedBy=multi-user.target diff --git a/config/service/writefreely/writefreely.env.template b/config/service/writefreely/writefreely.env.template new file mode 100644 index 0000000..8480b94 --- /dev/null +++ b/config/service/writefreely/writefreely.env.template @@ -0,0 +1,5 @@ +# Site options. +WRITEFREELY_SITE_HOST=${WRITEFREELY_SITE_HOST} +WRITEFREELY_SITE_THEME=write +WRITEFREELY_EDITOR=pad +WRITEFREELY_SINGLE_USER=true diff --git a/host/lhr01nuc/lhr01nuc.env.gpg b/host/lhr01nuc/lhr01nuc.env.gpg index 8755b686a8cabaa63314b991f8a51384221c22ac..58d9f2bea1991f41edd7095577e619e00bfb70d6 100644 GIT binary patch literal 2643 zcmV-Z3as^o0t^E@y8KTiHb4#m5B@VQe0(a9KcD4wCl&&`b6_G`xGHtazJ_(>-&-#c z73Lt4fJ7P6{=8!tY$W4RZ;a9%_A86gH4l;T$p5*!NY+tVXKvPIHI+bpj9bZQjK92! zE?x-D8v~t|_7&^fZ-Z$H6LpEZ?8`1F(3W=>W{<$R$tYi5>k)WCidkk;EFko{N3S9eo}P^doAtANfVQU*(NDriwi*(O)%~h z`2r$|FS>aTV%Q-3j#lm9r)>cN-mpF|*PI8}=TzJA#%f3}r}1&leBMZRF)ab=8FfAdf?eRX+dH!`v4N#8gG4R*JI%E^K|=tGCTUQ%;Gh;>Jvy(- zJe0}Sj=Gl6LdwJT-^$YK0lx&gv}m0lRtb0>e^8xvfDgVQRBg&`0W;RUR;0}iC>J+o z;RJx0mD2s%Cwi>`N!YpZGmeaaC!zuuUS0{u1_T%*n!1+Od^Zo$#1v0)L)R>JFj`Z# zgoCSf<|gZA>2YvHbkt-*m%raeP|;X2NcQzdz4a@g$?FKS=dB9t2zPo zmP945B$(x)a$gFOGQYOAmw7woPZNIHwjOn<8`U%q%+wRpYcn9II>6RYfTuyXvzYiI zBUjDPPn12|O1t=YY6o%DKZ2ivOJA(EY zk2OeR@itWf2GR`HYj{9nw%wzJq#fkj3KlVw96zI+O4?O+0FmB)a4FS#u#n(moVEDH zk@nm?%bxW-ATu79+ad0`s2kj2g%`Y3j*G>?&?ryc4#I$kam(?E_|`6Vt$*e5^m@Xkn4jy~pR8+VZ; zJEI7P3Cau%F)CJk*A5~~6=?1SCewR#fM({knjygpe@(>{^!C0YT&s$PCA4m&m1Di6 zao?)8&nftsG?D|G_vhfl*4+w|07!B5bd# zxd67`sg)}tC$s=ceGPcuCTT$8F%oN6b^a+2jq8iPdnclL+zHFiAul@7M+31DSVL}t_H^mV;tLub!l5nlPjO@3WmPMk~LA@FJC+)$FUZS{oK-a__u zvi!Tw`5x;`F_*=_*rIh;E*QN`DB3AI0uTWu5LqYCTpx$0L2(0&Yvzk}(%1FoPs#wq zvx&Z@cR9++FRjF~M}Ues_&~7=Gkx_j^DQb8)lo4zco@}Xg(-ob`qz}@+*SR-3htXt zpE0Y6kg1bma;hIo6oHwt9#XKz=;c<(yH2V;E5=;1Uh&BeeVSz%0={TTD&1MOgI{Q1&qVU%Sbd3_h z6_WN|aN#yb4fVWnQYb9DLuIhR%RWtA736K+%AsqNoV>@JQ*yH!@rupfZEll**D95$ z#_c$#ZxP;bL7*etzRo+Gar*+bGj`1}2N?4T(DvqZ+Q6>Tc;G#y3CZZT8Fxry;O?usx?>iEmS`a9GyGX&5J;-%oc|xqy6Stk4%i88hVZ_`^M^~3}dtt zA`^-irJLA(l(%_~4M|ghM9 zX#sOLSZD^cXBQC>st#?Jt#YHH5lG)bIbxc6Ypq=gJ*Yq zR`mnIK(Co{z<)UQh5A~JD-<~9SByVc+m98(=gy>-;W!)==E*aQiq^UJ0D=%u)m~%U ztsJQiC&21ZdFWO2a8(;-q|cajF*REb%J!M+x6j{&FNbH>VU|TH%9@|zQCJS;U52xT z?5Wq)@_bEL;eZ*$Vf8R*j%B-Iw90+!ft(#>lI0L_P-T`prs~i+iJZ)1;cXBF1_R$# zEgnCR08-iW$ zBl+vksDIDSbNf+h8rx5#-8f(k8ElGdQFtZPc0obd?o*e!q2zTymPX7+{>%9)=n>} zKEaC}M2K0+-mLVn+VpI>i}>%PQQ7yi*Y1TtGI(j?j*vQ3uG`y&I00nb9nwP+Vh{%@ zUcmhUTu1h&37I)c+8O&3G}I(CZ6y4NHuNY~fg%lcFYyPHL5~oo^lbQ3(NOA@J1Hf) zTRe7>N{Wtga^;sq4#BmQpif;XWu#x-Wv;|7V{;Z~Akl7*Eg9{i6B|aOj=5Z|2n)z_ BB4_{r literal 2610 zcmV-23eEL}0t^E@y8KTiHb4#m5C3jv+SR2a=cYP`HQb758oPOeqvXf?(QaWs+jsYb zOVNvmh&!hxw$Jh*a92^J?6EQ%I+I#dirr_(cobPfoC>=`p0#&bUzT)0Zj{W9L#k-c2xw!Sa2zGksu|pJ-+W2p2P&^tEaF_XsbsmB zYOt9Alok{Xs$vpg-XAww+b8ra&12HuFHo>J+7( z0#oct%m)cuEn`SymLWXZ`cR>~VS>csF6p}Nz!}pSD^DNb#^mo^7jf9rGp-h4C}?~s z&I+kN?GKFN^IW;KiDKUv-mN!AsT`*O*eL#G z59f%t5>z?}Yk4Fr7?JO+sYWou!)C)vBshxgws4b40Ek+b18`?;HlDls&XBptJ9hd6;slfBn z{U-X7_HANds*qqE(c|r31Rf1a$!~MQLg2mdC!1%{5!GY7aS+#B&v3+KdWt8+mZ_XrnwrCZ9_Qy3Ls6Id~{~_io@1V|y(@sx-Dhp8s zB%c?M7Kzr3M|1|t9?bfVu1wC?&bKeXN*mxVHr6E-s8`4*@%pOpblF~CN=q|LfzIGE zQC~H>spo~BYAVVb;GRbWt{`W-Z7=acv%ZBdKNRlbl$gsPQ&LZyg~i7_0`}U$s%&^| z>0>598^@PV#MGZ6$O=scpWa!Z(=KA>RO*4SuMOVmk7JMJzP6;s=dJmbzL#OrCsscS z?1O@~s@f$1jwpnL60gjPN&4n6Y;?ilAb3BK#=n@rP6;3NzzF`ACWB@4#hiyOsFZh6a33@<)h!JyatT9 z_j&Kb48H;m9AT0~?&tWOTzQxv>ef5mU}Ed4?Fb4mx;`!OpqD1qT5^?jZE2#{X(G?i z$ctXz8(TLL&SlgfvI*wyp`#^60n!e*pl~8YYik&Z8U{bnM|0_ZCjNnIWCz@LOi5jS zt07O$Boa82lO#$>xL=pO6`h{{l=9n~SOR{{nd>R{fCIWn{hGL53jJCUlp{;sA!$}| z)B7mZ4%Wuekx&IfdLg5>^4L0s?=YesCe)IcX)YgKl2?Dr?Bj(39Uy8+;t~4(IGn(L zL|O=EOn-!bb%T%&nfSnl1ZQB?hdOQa_hE{lKCU9B3FYz=yj?v1*1$yZ`dys|q-J1H z)>J3b46J3qaf>4p@44t=DmJg3-}=7D;GSRQxGcCP8!H(T2phvw>qC?g10)zSUD*WmaurXBG53~Ru$u8}b4BH|GaI+d8VRkxE2&}S z;6vs*@-*G7Wl`U-`do!>F5$KnJEx0_Hg^vX!#re=SDZbdH-j0iaM#^oD!Y^k4(K0H zwfC!c0QYNz8%LZKg`_kp<3U!6-x;mu=V98?Sy9$fxQv%0Gi9YgcCQ`Bz|qi{;52lD z$iqZ9MB?|a2Pj+yn%!AtL;!4`x93P>j}EPsguqoT;sno0bj6P)89PQbKbfg9GSZqb z8R@G2K<1XXPjvE7%@wJIs}jk1G2u^;4Y-P!W((1qZAku&no{ex$%b-EX?&T=1^K42 zXjc{CFsd~j26kL|F36SJ>6Bjg>YD)MrZ~4^kewaiuUaY_pWD~DC!c({-vwH3J%unz z2|d1{KpM(9LyuVT*Il(r8FJed$nOrno|(*jXPZ>)1lQV>4Fr;q)(Ic8tU<*5bTV^g z-UX`nSEEp+j7SZmi;?}SMlB!O-sYIuI7pPbR02%XhN`1n7t9X+x+PwCo?y^KP2fU@ zBvo1H^M2{IfS+}#(eAV)KY%*zDX_jWT(aF|8<&~x*=C)vnO?;4nE_!zHmeVk zHHO^0FW#=L181z7`uExe^S|?rFiyS|xYNAws4u7gv&Fl-^J<{i2F|tS2l8b!4{eq} zx~TFU<{3V#N9PT-F-QHQ2GNtYqQ)$6umQJ*0uPC!>~l8o8$5@_qJeZgWV+40Be=5@ zv2?gD6>%U;x?i~n)AskpZ=WSdnz0pJdW)nT^43L>(P=xR&{MLpRW#+mG<7SzJsN|6 z4aYN969}uz8}VJO@SsLimm!C$NmB~-`v6GT^8F_=44nBS1e@K`V~6ta`r+A6ECbJW z?{XHF*q5V=_3Nb9<1!;;LQ~&Hhl+6ToocYZBkNI%fqIYbu)}m6eGoG(+Kx*FH+IbKM$HWVeMrl z3UEGX8LGqY3neyM)k^(ct}MBQ%u)c6jX>(QkJ&yCC_ShP>k&UW#nFp$J>fIB2b-n- zBx#EVsWJAY55qNwM702%eR$j2fB@jpUsPq?IqM zgV1t&x!P9cUYZAOd~RuJGa8S1x}U|m#6Ji>uYHlI9XMGfJkb0YVIobkk_zp}(Jv&3J0 z%<}Jq+!KYRDzF8kl3iNo1^`qHTu>NjT-O%hqV;G}an0 zbMrvAV1=p0?iznn`g+_($}$|?UQ?^A(OoX7F<4l*1Oda+93BqMsbh1cLb8t!wFqy} zbJPZufK=18-*(`57>hIIuU|q@`X-nZo0N^d6vFz&s^A%N||4mg8xI(I3`w$No zl({j|GUxQKK&Gmn=LpR0sGt;gUAAwcFYdypuN-KHaeuBK#tCVy!Vx7NW&LfSuJpc?~X;B{v(D}HFRKe+sbs7Q^@tTEH& zm_`3eX-BXQb|4C(Pv&jWtv$pXP55EZRA2hW`0`h4OaLg&l%F$7s~(>UKT|J8DoZBF zIak73Mb2Zt!ditg^+=!js_dpt00jh{zDrhQR;G!XKh@7n@4rLC@S=vd&X2%_CN`^0 ziu-6M3}Z)0UH|~VK<0U8K*Bea@#lA!zlUL|mb)n}_eo?8D$?haREe1RY}fz(8irPS z$|nt(imn99V?L zw+Dv_@7i6FGyK&{S zF2FCEv5{sOOQ?7C(pN3qdmv21$`<4{0O-_9Vo$2utK0oI=L5rdbVUeZAT(cU1sp?K znxOO2`SKfb{qq+GY6k>yW0OBLcrq`_WjK6a&4ba>bFp+f)%iU091OWut1+r(ZjWED z^6K0|6uxMBZ>)%auB0<6j3Xa9d%?xL&k0N;1QVol=T?bkY>F}$%f{;pV=u*$I?xp` znqm4c)RCLRpmN{a+)Z?M&uvy6&zIe}o66R16GfV62U{AaJPn?tnbTHG2Pu!e82_PN zHQXs5x3WQ6WLPQ+<&0${79YMzQDrZr zQ)(?hrT$d^iYz_97Wmh1^I?0mFXafoaR{*Zl9vU_OXg;LEwJN^n$_7^JQj^90mH5d zqm2%U=bvuq)NtkE-qlLEYA^)WhHZQx}T@3`F^H8_uR+8KLn+vp!~Tm?_k(dGtlaF0B~#p7$KDFqr-g$lz@hq2SB`+HYd0xW}1j+hvW}~ zON-&?7ej7_fyg4v?`?j|usJ$Te-bzz1i}#}=y9FL2K+C!-V(3FyYIU_RKmIf^?X9(5=Gt#4?r%xBd~!y9QLtP z+=Zgln-RBCU-yKQ!YwY@@-TU9y8?lNzKomDY!dGoXGNj24G^NEPS0Z>KX7>)93^dZXfdK|$glnb9dHzkN9&gJYwS6-UZhXXk`=LB`-@~O1x3KA3TeFTFV7a;4Q}#Wuv&^A>aMO4d|B}4$Gu5X@|I4??$D3tMPn8 zY`km;2w=iyBGY@PUaiowlcZ>FjsC8^HyvOYwSD`Y!siC2V%ZbWl{-83Lg(d; zBl|<|_eCi3YjK5j0r9qeU>?7_^aE0uCy|okO6tX_LqOH67C18)lVv2)?ZsAAWf)mdh%0H(tA~5f z$OcP6Za(ts@Ew{WBd#{Gum%UHJXQu5&GAV1WscK?WPDBGK`<(h*`ece+L-{sBu3ru z=2%7e7Ij8NO|@V*R(%7#kQ>$O(M$|8gA B9jgEU literal 2607 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 diff --git a/host/virtual/virtual.env b/host/virtual/virtual.env index 860baae..071eb70 100644 --- a/host/virtual/virtual.env +++ b/host/virtual/virtual.env @@ -38,3 +38,6 @@ RSPAMD_CONTROLLER_PASSWORD=password # Configuration for RSS2Email. RSS2EMAIL_FROM=noreply@localhost RSS2EMAIL_TO=root@localhost + +# Configuration for WriteFreely. +WRITEFREELY_SITE_HOST=https://writefreely.localhost