Wiki.js на Pethost в один клик
Вики для команды или проекта: страницы в Markdown или визуальном редакторе, поиск, права доступа и провайдеры входа
Что произойдет
- Вы входите в Pethost или создаете аккаунт — с passkey, через GitHub или Google.
- Машины еще нет? Вы выбираете тариф, и мы готовим машину для вас. Ссылка ждет в вашем браузере, пока машина не будет готова.
- Окно «Новый проект» открывается на этом приложении. Вы заполняете то, что оно просит, и нажимаете «Создать проект»: Электронная почта, Пароль администратора.
- Через минуту-две приложение работает по своему адресу с HTTPS. Его секреты создаются случайно, а данные попадают в ночной бэкап.
- Это проект как любой другой: его compose.yaml, .env, логи и терминал — в панели, а ваш агент может его изменить, откатить или восстановить.
Первые шаги
Войдите с почтой и паролем администратора, которые вы указали: Wiki.js настраивается с ними до того, как начнёт отвечать, поэтому страницу установки больше никто не получит. Страницы создаются с главной; пользователи, группы и провайдеры входа — в Administration.
Что запускается
Шаблон — это этот compose.yaml и переменные, которые он пишет в .env проекта. Pethost запускает файл так, как он написан.
services:
wiki:
image: ghcr.io/requarks/wiki:2.5.315
restart: unless-stopped
environment:
DB_TYPE: postgres
DB_HOST: postgres
DB_PORT: "5432"
DB_USER: wiki
DB_PASS: ${POSTGRES_PASSWORD}
DB_NAME: wiki
SITE_URL: ${URL}
ADMIN_EMAIL: ${ADMIN_EMAIL}
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
# Wiki.js opens its setup page to whoever comes first. On the first start it runs once on
# port 3001, which nobody reaches, is set up there with the email and password given, and only
# then starts on 3000.
entrypoint: ["/bin/sh", "-c"]
command:
- |
installed=$$(node -e "
const { Client } = require('pg');
const db = new Client({ host: 'postgres', user: process.env.DB_USER, password: process.env.DB_PASS, database: process.env.DB_NAME });
db.connect().then(() => db.query('select count(*) from settings')).then((r) => console.log(r.rows[0].count > 0 ? 'yes' : 'no'), () => console.log('no')).then(() => process.exit(0));
")
if [ "$$installed" = no ]; then
sed 's/^port: 3000/port: 3001/' config.yml > /tmp/setup.yml
CONFIG_FILE=/tmp/setup.yml node server &
setup=$$!
node -e "
const body = JSON.stringify({ adminEmail: process.env.ADMIN_EMAIL, adminPassword: process.env.ADMIN_PASSWORD, adminPasswordConfirm: process.env.ADMIN_PASSWORD, siteUrl: process.env.SITE_URL, telemetry: false });
(async () => {
for (let i = 0; i < 180; i++) {
try {
const answer = await fetch('http://127.0.0.1:3001/finalize', { method: 'POST', headers: { 'content-type': 'application/json' }, body });
console.log('setup:', await answer.text());
return;
} catch { await new Promise((done) => setTimeout(done, 1000)); }
}
})();
"
sleep 3
kill $$setup
wait $$setup
fi
exec node server
volumes:
- content:/wiki/data/content
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_DB: wiki
POSTGRES_USER: wiki
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U wiki -d wiki"]
interval: 5s
timeout: 5s
retries: 10
start_period: 30s
volumes:
content:
db: