mirror of
https://github.com/thomiceli/opengist.git
synced 2024-12-22 20:42:40 +00:00
Add Vitepress docs (#326)
* Add vitepress for docs * some fix * Use vitepress and update docs * Use vitepress and update docs * Update README.md * Add favicon * Add docs by @jiriks74 Co-authored-by: jiriks74 <jiri@stefka.eu> --------- Co-authored-by: jiriks74 <jiri@stefka.eu>
This commit is contained in:
parent
678fb9938c
commit
6d31ef9732
29 changed files with 1300 additions and 1498 deletions
47
.github/workflows/docs.yml
vendored
Normal file
47
.github/workflows/docs.yml
vendored
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
name: Build / Deploy docs
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-deploy:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
|
||||||
|
- name: Install JS dependencies
|
||||||
|
run: |
|
||||||
|
npm install vitepress@1.3.4 tailwindcss@3.4.10
|
||||||
|
|
||||||
|
- name: Build docs
|
||||||
|
run: |
|
||||||
|
cd docs
|
||||||
|
npx tailwindcss -i .vitepress/theme/style.css -o .vitepress/theme/theme.css -c .vitepress/tailwind.config.js
|
||||||
|
npm run docs:build
|
||||||
|
|
||||||
|
- name: Deploy to server
|
||||||
|
uses: appleboy/scp-action@master
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.SERVER_HOST }}
|
||||||
|
username: ${{ secrets.SERVER_USERNAME }}
|
||||||
|
key: ${{ secrets.SERVER_SSH_KEY }}
|
||||||
|
source: "docs/.vitepress/dist/*"
|
||||||
|
target: ${{ secrets.SERVER_PATH }}
|
||||||
|
|
||||||
|
- name: Update remote docs
|
||||||
|
uses: appleboy/ssh-action@master
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.SERVER_HOST }}
|
||||||
|
username: ${{ secrets.SERVER_USERNAME }}
|
||||||
|
key: ${{ secrets.SERVER_SSH_KEY }}
|
||||||
|
script: |
|
||||||
|
${{ secrets.UPDATE_DOCS }}
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -7,3 +7,5 @@ public/assets/*
|
||||||
public/manifest.json
|
public/manifest.json
|
||||||
opengist
|
opengist
|
||||||
build/
|
build/
|
||||||
|
docs/.vitepress/dist/
|
||||||
|
docs/.vitepress/cache/
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
# Opengist
|
# Opengist
|
||||||
|
|
||||||
<img height="108px" src="https://raw.githubusercontent.com/thomiceli/opengist/a9dd531f676d01b93bb6bd70751a69382ca563b0/public/opengist.svg" alt="Opengist" align="right" />
|
<img height="108px" src="https://raw.githubusercontent.com/thomiceli/opengist/master/public/opengist.svg" alt="Opengist" align="right" />
|
||||||
|
|
||||||
Opengist is a **self-hosted** pastebin **powered by Git**. All snippets are stored in a Git repository and can be
|
Opengist is a **self-hosted** pastebin **powered by Git**. All snippets are stored in a Git repository and can be
|
||||||
read and/or modified using standard Git commands, or with the web interface.
|
read and/or modified using standard Git commands, or with the web interface.
|
||||||
It is similiar to [GitHub Gist](https://gist.github.com/), but open-source and could be self-hosted.
|
It is similiar to [GitHub Gist](https://gist.github.com/), but open-source and could be self-hosted.
|
||||||
|
|
||||||
[Documentation](/docs) • [Discord](https://discord.gg/9Pm3X5scZT) • [Demo](https://demo.opengist.io)
|
[Home Page](https://opengist.io) • [Documentation](https://opengist.io/docs) • [Discord](https://discord.gg/9Pm3X5scZT) • [Demo](https://demo.opengist.io)
|
||||||
|
|
||||||
|
|
||||||
![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/thomiceli/opengist?sort=semver)
|
![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/thomiceli/opengist?sort=semver)
|
||||||
|
@ -103,11 +103,11 @@ Opengist is now running on port 6157, you can browse http://localhost:6157
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
To create and run a development environment, see [run-development.md](/docs/contributing/run-development.md).
|
To create and run a development environment, see [run-development.md](/docs/contributing/development.md).
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
The documentation is available in [/docs](/docs) directory.
|
The documentation is available at [https://opengist.io/](https://opengist.io/) or in the [/docs](/docs) directory.
|
||||||
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
89
docs/.vitepress/config.mts
Normal file
89
docs/.vitepress/config.mts
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
import {defineConfig} from 'vitepress'
|
||||||
|
|
||||||
|
// https://vitepress.dev/reference/site-config
|
||||||
|
export default defineConfig({
|
||||||
|
title: "Opengist",
|
||||||
|
description: "Documention for Opengist",
|
||||||
|
rewrites: {
|
||||||
|
'index.md': 'index.md',
|
||||||
|
'introduction.md': 'docs/index.md',
|
||||||
|
':path(.*)': 'docs/:path'
|
||||||
|
},
|
||||||
|
themeConfig: {
|
||||||
|
// https://vitepress.dev/reference/default-theme-config
|
||||||
|
logo: 'https://raw.githubusercontent.com/thomiceli/opengist/master/public/opengist.svg',
|
||||||
|
logoLink: '/',
|
||||||
|
nav: [
|
||||||
|
{ text: 'Demo', link: 'https://demo.opengist.io' },
|
||||||
|
{ text: 'Translate', link: 'https://tr.opengist.io' }
|
||||||
|
],
|
||||||
|
|
||||||
|
sidebar: {
|
||||||
|
'/docs/': [
|
||||||
|
{
|
||||||
|
text: '', items: [
|
||||||
|
{text: 'Introduction', link: '/docs'},
|
||||||
|
{text: 'Installation', link: '/docs/installation', items: [
|
||||||
|
{text: 'Docker', link: '/docs/installation/docker'},
|
||||||
|
{text: 'Binary', link: '/docs/installation/binary'},
|
||||||
|
{text: 'Source', link: '/docs/installation/source'},
|
||||||
|
],
|
||||||
|
collapsed: true
|
||||||
|
},
|
||||||
|
{text: 'Update', link: '/docs/update'},
|
||||||
|
], collapsed: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Configuration', base: '/docs/configuration', items: [
|
||||||
|
{text: 'Configure Opengist', link: '/configure'},
|
||||||
|
{text: 'Admin panel', link: '/admin-panel'},
|
||||||
|
{text: 'OAuth Providers', link: '/oauth-providers'},
|
||||||
|
{text: 'Custom assets', link: '/custom-assets'},
|
||||||
|
{text: 'Custom links', link: '/custom-links'},
|
||||||
|
{text: 'Cheat Sheet', link: '/cheat-sheet'},
|
||||||
|
], collapsed: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Usage', base: '/docs/usage', items: [
|
||||||
|
{text: 'Init via Git', link: '/init-via-git'},
|
||||||
|
{text: 'Embed Gist', link: '/embed'},
|
||||||
|
{text: 'Gist as JSON', link: '/gist-json'},
|
||||||
|
{text: 'Import Gists from Github', link: '/import-from-github-gist'},
|
||||||
|
{text: 'Git push options', link: '/git-push-options'},
|
||||||
|
], collapsed: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Administration', base: '/docs/administration', items: [
|
||||||
|
{text: 'Run with systemd', link: '/run-with-systemd'},
|
||||||
|
{text: 'Reverse proxy', items: [
|
||||||
|
{text: 'Nginx', link: '/nginx-reverse-proxy'},
|
||||||
|
{text: 'Traefik', link: '/traefik-reverse-proxy'},
|
||||||
|
], collapsed: true},
|
||||||
|
{text: 'Fail2ban', link: '/fail2ban-setup'},
|
||||||
|
{text: 'Healthcheck', link: '/healthcheck'},
|
||||||
|
], collapsed: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Contributing', base: '/docs/contributing', items: [
|
||||||
|
{text: 'Community', link: '/community'},
|
||||||
|
{text: 'Development', link: '/development'},
|
||||||
|
], collapsed: false
|
||||||
|
},
|
||||||
|
|
||||||
|
]},
|
||||||
|
|
||||||
|
socialLinks: [
|
||||||
|
{icon: 'github', link: 'https://github.com/thomiceli/opengist'}
|
||||||
|
],
|
||||||
|
editLink: {
|
||||||
|
pattern: 'https://github.com/thomiceli/opengist/edit/stable/docs/:path'
|
||||||
|
},
|
||||||
|
// @ts-ignore
|
||||||
|
lastUpdated: true,
|
||||||
|
|
||||||
|
},
|
||||||
|
head: [
|
||||||
|
['link', {rel: 'icon', href: '/favicon.svg'}],
|
||||||
|
],
|
||||||
|
ignoreDeadLinks: true
|
||||||
|
})
|
37
docs/.vitepress/tailwind.config.js
vendored
Normal file
37
docs/.vitepress/tailwind.config.js
vendored
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
const colors = require('tailwindcss/colors')
|
||||||
|
|
||||||
|
/** @type {import('tailwindcss').Config} */
|
||||||
|
module.exports = {
|
||||||
|
content: [
|
||||||
|
"./.vitepress/theme/*.vue",
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
colors: {
|
||||||
|
transparent: 'transparent',
|
||||||
|
current: 'currentColor',
|
||||||
|
white: colors.white,
|
||||||
|
black: colors.black,
|
||||||
|
gray: {
|
||||||
|
50: "#EEEFF1",
|
||||||
|
100: "#DEDFE3",
|
||||||
|
200: "#BABCC5",
|
||||||
|
300: "#999CA8",
|
||||||
|
400: "#75798A",
|
||||||
|
500: "#585B68",
|
||||||
|
600: "#464853",
|
||||||
|
700: "#363840",
|
||||||
|
800: "#232429",
|
||||||
|
900: "#131316"
|
||||||
|
},
|
||||||
|
indigo: colors.indigo,
|
||||||
|
|
||||||
|
},
|
||||||
|
extend: {
|
||||||
|
borderWidth: {
|
||||||
|
'1': '1px',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: [],
|
||||||
|
darkMode: 'class',
|
||||||
|
}
|
101
docs/.vitepress/theme/Home.vue
Normal file
101
docs/.vitepress/theme/Home.vue
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
<script>
|
||||||
|
import { withBase } from 'vitepress';
|
||||||
|
import './theme.css'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
return { withBase };
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<main class="home">
|
||||||
|
<header class="hero">
|
||||||
|
<div class="mx-auto max-w-7xl px-6 lg:px-8">
|
||||||
|
<div class="mx-auto lg:text-center">
|
||||||
|
<img class="rotating h-36 mx-auto my-8 " src="https://raw.githubusercontent.com/thomiceli/opengist/master/public/opengist.svg" alt="" >
|
||||||
|
<a target="_blank" href="https://github.com/thomiceli/opengist/releases" class="inline-flex items-center rounded-full bg-indigo-100 hover:bg-indigo-200 px-4 py-1.5 text-lg font-medium text-indigo-700">
|
||||||
|
<span class="pr-1">Released 1.7.4</span>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="m4.5 19.5 15-15m0 0H8.25m11.25 0v11.25" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
<h1 class="mt-5 text-4xl font-bold tracking-tight sm:text-5xl">Opengist</h1>
|
||||||
|
<h2 class="mt-4 text-xl">Self-hosted pastebin powered by Git, open-source alternative to Github Gist.</h2>
|
||||||
|
</div>
|
||||||
|
<div class="space-x-2 my-12">
|
||||||
|
<a href="/docs" class="rounded-md bg-indigo-600 mt-6 px-5 py-3 text-xl font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Docs</a>
|
||||||
|
<a target="_blank" href="https://demo.opengist.io" class="rounded-md bg-indigo-400 mt-6 px-5 py-3 text-xl border-white font-semibold text-white shadow-sm hover:bg-indigo-300 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">Live demo</a>
|
||||||
|
<a target="_blank" href="https://github.com/thomiceli/opengist" class="rounded-md bg-gray-800 mt-6 px-3 py-3 text-xl dark:border dark:border-1 dark:border-gray-400 font-semibold text-white shadow-sm hover:bg-gray-700 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">
|
||||||
|
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 16 16" class="w-7 h-auto inline" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"></path></svg>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="border border-1 mt-6 px-5 py-3 rounded-md shadow-sm ">
|
||||||
|
<code class="select-all ">docker run --name <span class="text-indigo-700 dark:text-indigo-300 font-bold">opengist</span> -p <span class="text-indigo-700 dark:text-indigo-300 font-bold">6157</span>:6157 -v "<span class="text-indigo-700 dark:text-indigo-300 font-bold">$HOME/.opengist</span>:/opengist" ghcr.io/thomiceli/opengist:1</code>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="relative w-full sm:max-w-7xl mx-auto overflow-auto">
|
||||||
|
<img class="block w-[200vw] max-w-none sm:w-full h-auto" :src="withBase('/opengist-demo.png')" alt="demo-opengist-screenshot" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<style>
|
||||||
|
@-webkit-keyframes rotating /* Safari and Chrome */ {
|
||||||
|
from {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
-o-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
-o-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes rotating {
|
||||||
|
from {
|
||||||
|
-ms-transform: rotate(0deg);
|
||||||
|
-moz-transform: rotate(0deg);
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
-o-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
-ms-transform: rotate(360deg);
|
||||||
|
-moz-transform: rotate(360deg);
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
-o-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.home {
|
||||||
|
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rotating {
|
||||||
|
-webkit-animation: rotating 8s linear infinite;
|
||||||
|
-moz-animation: rotating 4s linear infinite;
|
||||||
|
-ms-animation: rotating 4s linear infinite;
|
||||||
|
-o-animation: rotating 4s linear infinite;
|
||||||
|
animation: rotating 12s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
16
docs/.vitepress/theme/Layout.vue
Normal file
16
docs/.vitepress/theme/Layout.vue
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<script setup>
|
||||||
|
import { useData } from 'vitepress'
|
||||||
|
import Home from './Home.vue'
|
||||||
|
import DefaultTheme from 'vitepress/theme'
|
||||||
|
|
||||||
|
const { Layout } = DefaultTheme
|
||||||
|
const { frontmatter } = useData()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Layout>
|
||||||
|
<template v-if="frontmatter.layout === 'home'" #home-hero-after>
|
||||||
|
<Home />
|
||||||
|
</template>
|
||||||
|
</Layout>
|
||||||
|
</template>
|
12
docs/.vitepress/theme/index.ts
Normal file
12
docs/.vitepress/theme/index.ts
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import { h } from 'vue'
|
||||||
|
import type { Theme } from 'vitepress'
|
||||||
|
import DefaultTheme from 'vitepress/theme'
|
||||||
|
import Layout from "./Layout.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
...DefaultTheme,
|
||||||
|
Layout,
|
||||||
|
enhanceApp({ app, router, siteData }) {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
} satisfies Theme
|
147
docs/.vitepress/theme/style.css
Normal file
147
docs/.vitepress/theme/style.css
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
/**
|
||||||
|
* Customize default theme styling by overriding CSS variables:
|
||||||
|
* https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Colors
|
||||||
|
*
|
||||||
|
* Each colors have exact same color scale system with 3 levels of solid
|
||||||
|
* colors with different brightness, and 1 soft color.
|
||||||
|
*
|
||||||
|
* - `XXX-1`: The most solid color used mainly for colored text. It must
|
||||||
|
* satisfy the contrast ratio against when used on top of `XXX-soft`.
|
||||||
|
*
|
||||||
|
* - `XXX-2`: The color used mainly for hover state of the button.
|
||||||
|
*
|
||||||
|
* - `XXX-3`: The color for solid background, such as bg color of the button.
|
||||||
|
* It must satisfy the contrast ratio with pure white (#ffffff) text on
|
||||||
|
* top of it.
|
||||||
|
*
|
||||||
|
* - `XXX-soft`: The color used for subtle background such as custom container
|
||||||
|
* or badges. It must satisfy the contrast ratio when putting `XXX-1` colors
|
||||||
|
* on top of it.
|
||||||
|
*
|
||||||
|
* The soft color must be semi transparent alpha channel. This is crucial
|
||||||
|
* because it allows adding multiple "soft" colors on top of each other
|
||||||
|
* to create a accent, such as when having inline code block inside
|
||||||
|
* custom containers.
|
||||||
|
*
|
||||||
|
* - `default`: The color used purely for subtle indication without any
|
||||||
|
* special meanings attched to it such as bg color for menu hover state.
|
||||||
|
*
|
||||||
|
* - `brand`: Used for primary brand colors, such as link text, button with
|
||||||
|
* brand theme, etc.
|
||||||
|
*
|
||||||
|
* - `tip`: Used to indicate useful information. The default theme uses the
|
||||||
|
* brand color for this by default.
|
||||||
|
*
|
||||||
|
* - `warning`: Used to indicate warning to the users. Used in custom
|
||||||
|
* container, badges, etc.
|
||||||
|
*
|
||||||
|
* - `danger`: Used to show error, or dangerous message to the users. Used
|
||||||
|
* in custom container, badges, etc.
|
||||||
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--vp-c-default-1: var(--vp-c-gray-1);
|
||||||
|
--vp-c-default-2: var(--vp-c-gray-2);
|
||||||
|
--vp-c-default-3: var(--vp-c-gray-3);
|
||||||
|
--vp-c-default-soft: var(--vp-c-gray-soft);
|
||||||
|
|
||||||
|
--vp-c-brand-1: var(--vp-c-indigo-1);
|
||||||
|
--vp-c-brand-2: var(--vp-c-indigo-2);
|
||||||
|
--vp-c-brand-3: var(--vp-c-indigo-3);
|
||||||
|
--vp-c-brand-soft: var(--vp-c-indigo-soft);
|
||||||
|
|
||||||
|
--vp-c-tip-1: var(--vp-c-brand-1);
|
||||||
|
--vp-c-tip-2: var(--vp-c-brand-2);
|
||||||
|
--vp-c-tip-3: var(--vp-c-brand-3);
|
||||||
|
--vp-c-tip-soft: var(--vp-c-brand-soft);
|
||||||
|
|
||||||
|
--vp-c-warning-1: var(--vp-c-yellow-1);
|
||||||
|
--vp-c-warning-2: var(--vp-c-yellow-2);
|
||||||
|
--vp-c-warning-3: var(--vp-c-yellow-3);
|
||||||
|
--vp-c-warning-soft: var(--vp-c-yellow-soft);
|
||||||
|
|
||||||
|
--vp-c-danger-1: var(--vp-c-red-1);
|
||||||
|
--vp-c-danger-2: var(--vp-c-red-2);
|
||||||
|
--vp-c-danger-3: var(--vp-c-red-3);
|
||||||
|
--vp-c-danger-soft: var(--vp-c-red-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component: Button
|
||||||
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--vp-button-brand-border: transparent;
|
||||||
|
--vp-button-brand-text: var(--vp-c-white);
|
||||||
|
--vp-button-brand-bg: var(--vp-c-brand-3);
|
||||||
|
--vp-button-brand-hover-border: transparent;
|
||||||
|
--vp-button-brand-hover-text: var(--vp-c-white);
|
||||||
|
--vp-button-brand-hover-bg: var(--vp-c-brand-2);
|
||||||
|
--vp-button-brand-active-border: transparent;
|
||||||
|
--vp-button-brand-active-text: var(--vp-c-white);
|
||||||
|
--vp-button-brand-active-bg: var(--vp-c-brand-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component: Home
|
||||||
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--vp-home-hero-name-color: transparent;
|
||||||
|
--vp-home-hero-name-background: -webkit-linear-gradient(
|
||||||
|
120deg,
|
||||||
|
#0f0513 30%,
|
||||||
|
#7e8b90
|
||||||
|
);
|
||||||
|
|
||||||
|
--vp-home-hero-image-background-image: linear-gradient(
|
||||||
|
-45deg,
|
||||||
|
#bd34fe 50%,
|
||||||
|
#47caff 50%
|
||||||
|
);
|
||||||
|
--vp-home-hero-image-filter: blur(44px);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 640px) {
|
||||||
|
:root {
|
||||||
|
--vp-home-hero-image-filter: blur(56px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 960px) {
|
||||||
|
:root {
|
||||||
|
--vp-home-hero-image-filter: blur(68px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component: Custom Block
|
||||||
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--vp-custom-block-tip-border: transparent;
|
||||||
|
--vp-custom-block-tip-text: var(--vp-c-text-1);
|
||||||
|
--vp-custom-block-tip-bg: var(--vp-c-brand-soft);
|
||||||
|
--vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component: Algolia
|
||||||
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
.DocSearch {
|
||||||
|
--docsearch-primary-color: var(--vp-c-brand-1) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content img {
|
||||||
|
padding-left: 20px;
|
||||||
|
height: 108px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
48
docs/administration/traefik-reverse-proxy.md
Normal file
48
docs/administration/traefik-reverse-proxy.md
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
# Use Traefik as a reverse proxy
|
||||||
|
|
||||||
|
You can set up Traefik in two ways:
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Using Docker labels</summary>
|
||||||
|
|
||||||
|
Add these labels to your `docker-compose.yml` file:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
labels:
|
||||||
|
- traefik.http.routers.opengist.rule=Host(`opengist.example.com`) # Change to your subdomain
|
||||||
|
# Uncomment the line below if you run Opengist in a subdirectory
|
||||||
|
# - traefik.http.routers.app1.rule=PathPrefix(`/opengist{regex:$$|/.*}`) # Change opentist in the regex to yuor subdirectory name
|
||||||
|
- traefik.http.routers.opengist.entrypoints=websecure # Change to the name of your 443 port entrypoint
|
||||||
|
- traefik.http.routers.opengist.tls.certresolver=lets-encrypt # Change to certresolver's name
|
||||||
|
- traefik.http.routers.opengist.service=opengist
|
||||||
|
- traefik.http.services.opengist.loadBalancer.server.port=6157
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
<details>
|
||||||
|
<summary>Using a <code>yml</code> file</summary>
|
||||||
|
|
||||||
|
> [!Note]
|
||||||
|
> Don't forget to change the `<server-address>` to your server's IP
|
||||||
|
|
||||||
|
`traefik_dynamic.yml`
|
||||||
|
```yml
|
||||||
|
http:
|
||||||
|
routers:
|
||||||
|
opengist:
|
||||||
|
entrypoints: websecure
|
||||||
|
rule: Host(`opengist.example.com`) # Comment this line and uncomment the line below if using a subpath
|
||||||
|
# rule: PathPrefix(`/opengist{regex:$$|/.*}`) # Change opentist in the regex to yuor subdirectory name
|
||||||
|
# middlewares:
|
||||||
|
# - opengist-fail2ban
|
||||||
|
service: opengist
|
||||||
|
tls:
|
||||||
|
certresolver: lets-encrypt
|
||||||
|
services:
|
||||||
|
opengist:
|
||||||
|
loadbalancer:
|
||||||
|
servers:
|
||||||
|
- url: "http://<server-address>:6157"
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
53
docs/configuration/admin-panel.md
Normal file
53
docs/configuration/admin-panel.md
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
# Admin panel
|
||||||
|
|
||||||
|
The first user created on your Opengist instance has access to the Admin panel.
|
||||||
|
|
||||||
|
To access the Admin panel:
|
||||||
|
|
||||||
|
1. Log in
|
||||||
|
2. Click your username in the upper right corner
|
||||||
|
3. Select `Admin`
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### General
|
||||||
|
|
||||||
|
Here you can see some basic information, like Opengist version, alongside some stats.
|
||||||
|
|
||||||
|
You can also start some actions like forcing synchronization of gists,
|
||||||
|
starting garbage collection, etc.
|
||||||
|
|
||||||
|
### Users
|
||||||
|
|
||||||
|
Here you can see your users and delete them.
|
||||||
|
|
||||||
|
### Gists
|
||||||
|
|
||||||
|
Here you can see all the gists and some basic information about them. You also have an option
|
||||||
|
to delete them.
|
||||||
|
|
||||||
|
|
||||||
|
### Invitations
|
||||||
|
|
||||||
|
Here you can create invitation links with some options like limiting the number of signed up
|
||||||
|
users or setting an expiration date.
|
||||||
|
|
||||||
|
> [!Note]
|
||||||
|
> Invitation links override the `Disable signup` option but not the `Disable login form` option.
|
||||||
|
>
|
||||||
|
> Users will see only the OAuth providers when `Disable login form` is enabled.
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
Here you can change a limited number of settings without restarting the instance.
|
||||||
|
|
||||||
|
- Disable signup
|
||||||
|
- Forbid the creation of new accounts.
|
||||||
|
- Require login
|
||||||
|
- Enforce users to be logged in to see gists.
|
||||||
|
- Allow individual gists without login
|
||||||
|
- Allow individual gists to be viewed and downloaded without login, while requiring login for discovering gists.
|
||||||
|
- Disable login form
|
||||||
|
- Forbid logging in via the login form to force using OAuth providers instead.
|
||||||
|
- Disable Gravatar
|
||||||
|
- Disable the usage of Gravatar as an avatar provider.
|
|
@ -1,3 +1,7 @@
|
||||||
|
---
|
||||||
|
aside: false
|
||||||
|
---
|
||||||
|
|
||||||
# Configuration Cheat Sheet
|
# Configuration Cheat Sheet
|
||||||
|
|
||||||
| YAML Config Key | Environment Variable | Default value | Description |
|
| YAML Config Key | Environment Variable | Default value | Description |
|
||||||
|
|
|
@ -27,7 +27,7 @@ Usage via command line :
|
||||||
./opengist --config /path/to/config.yml
|
./opengist --config /path/to/config.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
You can start by copying and/or modifying the provided [config.yml](/config.yml) file.
|
You can start by copying and/or modifying the provided [config.yml](https://github.com/thomiceli/opengist/blob/stable/config.yml) file.
|
||||||
|
|
||||||
|
|
||||||
## Configuration via Environment Variables
|
## Configuration via Environment Variables
|
|
@ -52,11 +52,11 @@ If you want your custom page to integrate well into the existing theme, you can
|
||||||
</header>
|
</header>
|
||||||
<main>
|
<main>
|
||||||
<h3 class="text-xl font-bold leading-tight mt-4">Sub-Heading</h3>
|
<h3 class="text-xl font-bold leading-tight mt-4">Sub-Heading</h3>
|
||||||
<p class="mt-4 ml-1"><!-- content --></p>
|
<p class="mt-4 ml-1"><!-- my content --></p>
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{ template "footer" . }}
|
{{ template "footer" . }}
|
||||||
```
|
```
|
||||||
|
|
||||||
You can adjust above as needed. Opengist uses Tailwind CSS classes.
|
You can adjust above as needed. Opengist uses TailwindCSS classes.
|
||||||
|
|
|
@ -2,51 +2,76 @@
|
||||||
|
|
||||||
Opengist can be configured to use OAuth to authenticate users, with GitHub, Gitea, or OpenID Connect.
|
Opengist can be configured to use OAuth to authenticate users, with GitHub, Gitea, or OpenID Connect.
|
||||||
|
|
||||||
## Github
|
## GitHub
|
||||||
|
|
||||||
* Add a new OAuth app in your [GitHub account settings](https://github.com/settings/applications/new)
|
* Add a new OAuth app in your [GitHub account settings](https://github.com/settings/applications/new)
|
||||||
* Set 'Authorization callback URL' to `http://opengist.url/oauth/github/callback`
|
* Set 'Authorization callback URL' to `http://opengist.url/oauth/github/callback`
|
||||||
* Copy the 'Client ID' and 'Client Secret' and add them to the [configuration](/docs/configuration/cheat-sheet.md) :
|
* Copy the 'Client ID' and 'Client Secret' and add them to the [configuration](cheat-sheet.md) :
|
||||||
```yaml
|
```yaml
|
||||||
github.client-key: <key>
|
github.client-key: <key>
|
||||||
github.secret: <secret>
|
github.secret: <secret>
|
||||||
```
|
```
|
||||||
|
```shell
|
||||||
|
OG_GITHUB_CLIENT_KEY=<key>
|
||||||
|
OG_GITHUB_SECRET=<secret>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## GitLab
|
## GitLab
|
||||||
|
|
||||||
* Add a new OAuth app in Application settings from the [GitLab instance](https://gitlab.com/-/user_settings/applications)
|
* Add a new OAuth app in Application settings from the [GitLab instance](https://gitlab.com/-/user_settings/applications)
|
||||||
* Set 'Redirect URI' to `http://opengist.url/oauth/gitlab/callback`
|
* Set 'Redirect URI' to `http://opengist.url/oauth/gitlab/callback`
|
||||||
* Copy the 'Client ID' and 'Client Secret' and add them to the [configuration](/docs/configuration/cheat-sheet.md) :
|
* Copy the 'Client ID' and 'Client Secret' and add them to the [configuration](cheat-sheet.md) :
|
||||||
```yaml
|
```yaml
|
||||||
gitlab.client-key: <key>
|
gitlab.client-key: <key>
|
||||||
gitlab.secret: <secret>
|
gitlab.secret: <secret>
|
||||||
# URL of the GitLab instance. Default: https://gitlab.com/
|
# URL of the GitLab instance. Default: https://gitlab.com/
|
||||||
gitlab.url: https://gitlab.com/
|
gitlab.url: https://gitlab.com/
|
||||||
```
|
```
|
||||||
|
```shell
|
||||||
|
OG_GITLAB_CLIENT_KEY=<key>
|
||||||
|
OG_GITLAB_SECRET=<secret>
|
||||||
|
# URL of the GitLab instance. Default: https://gitlab.com/
|
||||||
|
OG_GITLAB_URL=https://gitlab.com/
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Gitea
|
## Gitea
|
||||||
|
|
||||||
* Add a new OAuth app in Application settings from the [Gitea instance](https://gitea.com/user/settings/applications)
|
* Add a new OAuth app in Application settings from the [Gitea instance](https://gitea.com/user/settings/applications)
|
||||||
* Set 'Redirect URI' to `http://opengist.url/oauth/gitea/callback`
|
* Set 'Redirect URI' to `http://opengist.url/oauth/gitea/callback`
|
||||||
* Copy the 'Client ID' and 'Client Secret' and add them to the [configuration](/docs/configuration/cheat-sheet.md) :
|
* Copy the 'Client ID' and 'Client Secret' and add them to the [configuration](cheat-sheet.md) :
|
||||||
```yaml
|
```yaml
|
||||||
gitea.client-key: <key>
|
gitea.client-key: <key>
|
||||||
gitea.secret: <secret>
|
gitea.secret: <secret>
|
||||||
# URL of the Gitea instance. Default: https://gitea.com/
|
# URL of the Gitea instance. Default: https://gitea.com/
|
||||||
gitea.url: http://localhost:3000
|
gitea.url: http://localhost:3000
|
||||||
```
|
```
|
||||||
|
```shell
|
||||||
|
OG_GITEA_CLIENT_KEY=<key>
|
||||||
|
OG_GITEA_SECRET=<secret>
|
||||||
|
# URL of the Gitea instance. Default: https://gitea.com/
|
||||||
|
OG_GITEA_URL=http://localhost:3000
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## OpenID Connect
|
## OpenID Connect
|
||||||
|
|
||||||
* Add a new OAuth app in Application settings of your OIDC provider
|
* Add a new OAuth app in Application settings of your OIDC provider
|
||||||
* Set 'Redirect URI' to `http://opengist.url/oauth/openid-connect/callback`
|
* Set 'Redirect URI' to `http://opengist.url/oauth/openid-connect/callback`
|
||||||
* Copy the 'Client ID', 'Client Secret', and the discovery endpoint, and add them to the [configuration](/docs/configuration/cheat-sheet.md) :
|
* Copy the 'Client ID', 'Client Secret', and the discovery endpoint, and add them to the [configuration](cheat-sheet.md) :
|
||||||
```yaml
|
```yaml
|
||||||
oidc.client-key: <key>
|
oidc.client-key: <key>
|
||||||
oidc.secret: <secret>
|
oidc.secret: <secret>
|
||||||
# Discovery endpoint of the OpenID provider. Generally something like http://auth.example.com/.well-known/openid-configuration
|
# Discovery endpoint of the OpenID provider. Generally something like http://auth.example.com/.well-known/openid-configuration
|
||||||
oidc.discovery-url: http://auth.example.com/.well-known/openid-configuration
|
oidc.discovery-url: http://auth.example.com/.well-known/openid-configuration
|
||||||
```
|
```
|
||||||
|
```shell
|
||||||
|
OG_OIDC_CLIENT_KEY=<key>
|
||||||
|
OG_OIDC_SECRET=<secret>
|
||||||
|
# Discovery endpoint of the OpenID provider. Generally something like http://auth.example.com/.well-known/openid-configuration
|
||||||
|
OG_OIDC_DISCOVERY_URL=http://auth.example.com/.well-known/openid-configuration
|
||||||
|
```
|
||||||
|
|
6
docs/contributing/community.md
Normal file
6
docs/contributing/community.md
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# Community
|
||||||
|
|
||||||
|
The following is a list of resources made by happy users of Opengist. Feel free to make a PR add your own!
|
||||||
|
|
||||||
|
- [Aetherinox/opengist-debian](https://github.com/Aetherinox/opengist-debian) - A Debian package for Opengist
|
||||||
|
- [How to Install Opengist on Your Synology NAS](https://mariushosting.com/how-to-install-opengist-on-your-synology-nas/) - A guide to install Opengist on a Synology NAS
|
|
@ -1,54 +1,4 @@
|
||||||
# Opengist
|
---
|
||||||
|
layout: home
|
||||||
Opengist is a **self-hosted** pastebin **powered by Git**. All snippets are stored in a Git repository and can be
|
navbar: false
|
||||||
read and/or modified using standard Git commands, or with the web interface.
|
---
|
||||||
It is similiar to [GitHub Gist](https://gist.github.com/), but open-source and could be self-hosted.
|
|
||||||
|
|
||||||
Written in [Go](https://go.dev), Opengist aims to be fast and easy to deploy.
|
|
||||||
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
* Create public, unlisted or private snippets
|
|
||||||
* [Init](/docs/usage/init-via-git.md) / Clone / Pull / Push snippets **via Git** over HTTP or SSH
|
|
||||||
* Syntax highlighting ; markdown & CSV support
|
|
||||||
* Search code in snippets ; browse users snippets, likes and forks
|
|
||||||
* Embed snippets in other websites
|
|
||||||
* Revisions history
|
|
||||||
* Like / Fork snippets
|
|
||||||
* Editor with indentation mode & size ; drag and drop files
|
|
||||||
* Download raw files or as a ZIP archive
|
|
||||||
* Retrieve snippet data/metadata via a JSON API
|
|
||||||
* OAuth2 login with GitHub, GitLab, Gitea, and OpenID Connect
|
|
||||||
* Avatars via Gravatar or OAuth2 providers
|
|
||||||
* Light/Dark mode
|
|
||||||
* Responsive UI
|
|
||||||
* Enable or disable signups
|
|
||||||
* Restrict or unrestrict snippets visibility to anonymous users
|
|
||||||
* Admin panel :
|
|
||||||
* delete users/gists;
|
|
||||||
* clean database/filesystem by syncing gists
|
|
||||||
* run `git gc` for all repositories
|
|
||||||
* SQLite database
|
|
||||||
* Logging
|
|
||||||
* Docker support
|
|
||||||
|
|
||||||
|
|
||||||
## System requirements
|
|
||||||
|
|
||||||
[Git](https://git-scm.com/download) is obviously required to run Opengist, as it's the main feature of the app.
|
|
||||||
Version **2.28** or later is recommended as the app has not been tested with older Git versions and some features would not work.
|
|
||||||
|
|
||||||
[OpenSSH](https://www.openssh.com/) suite if you wish to use Git over SSH.
|
|
||||||
|
|
||||||
|
|
||||||
## Components
|
|
||||||
|
|
||||||
* Backend Web Framework: [Echo](https://echo.labstack.com/)
|
|
||||||
* ORM: [GORM](https://gorm.io/)
|
|
||||||
* Frontend libraries:
|
|
||||||
* [Tailwind CSS](https://tailwindcss.com/)
|
|
||||||
* [CodeMirror](https://codemirror.net/)
|
|
||||||
* [Day.js](https://day.js.org/)
|
|
||||||
* [highlight.js](https://highlightjs.org/)
|
|
||||||
* and [others](/package.json)
|
|
||||||
|
|
|
@ -1,74 +1,7 @@
|
||||||
# Installation
|
# Install Opengist
|
||||||
|
|
||||||
## With Docker
|
There are several ways to install Opengist, depending on your preferences and your environment.
|
||||||
|
|
||||||
Docker [images](https://github.com/thomiceli/opengist/pkgs/container/opengist) are available for each release :
|
- [Docker](installation/docker.md)
|
||||||
|
- [Source](installation/source.md)
|
||||||
```shell
|
- [Binary](installation/binary.md)
|
||||||
docker pull ghcr.io/thomiceli/opengist:1
|
|
||||||
```
|
|
||||||
|
|
||||||
It can be used in a `docker-compose.yml` file :
|
|
||||||
|
|
||||||
1. Create a `docker-compose.yml` file with the following content
|
|
||||||
2. Run `docker compose up -d`
|
|
||||||
3. Opengist is now running on port 6157, you can browse http://localhost:6157
|
|
||||||
|
|
||||||
```yml
|
|
||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
opengist:
|
|
||||||
image: ghcr.io/thomiceli/opengist:1
|
|
||||||
container_name: opengist
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "6157:6157" # HTTP port
|
|
||||||
- "2222:2222" # SSH port, can be removed if you don't use SSH
|
|
||||||
volumes:
|
|
||||||
- "$HOME/.opengist:/opengist"
|
|
||||||
```
|
|
||||||
|
|
||||||
You can define which user/group should run the container and own the files by setting the `UID` and `GID` environment
|
|
||||||
variables :
|
|
||||||
|
|
||||||
```yml
|
|
||||||
services:
|
|
||||||
opengist:
|
|
||||||
# ...
|
|
||||||
environment:
|
|
||||||
UID: 1001
|
|
||||||
GID: 1001
|
|
||||||
```
|
|
||||||
|
|
||||||
## Via binary
|
|
||||||
|
|
||||||
Download the archive for your system from the release page [here](https://github.com/thomiceli/opengist/releases/latest), and extract it.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
# example for linux amd64
|
|
||||||
wget https://github.com/thomiceli/opengist/releases/download/v1.7.4/opengist1.7.4-linux-amd64.tar.gz
|
|
||||||
|
|
||||||
tar xzvf opengist1.7.4-linux-amd64.tar.gz
|
|
||||||
cd opengist
|
|
||||||
chmod +x opengist
|
|
||||||
./opengist # with or without `--config config.yml`
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## From source
|
|
||||||
|
|
||||||
Requirements:
|
|
||||||
* [Git](https://git-scm.com/downloads) (2.28+)
|
|
||||||
* [Go](https://go.dev/doc/install) (1.22+)
|
|
||||||
* [Node.js](https://nodejs.org/en/download/) (16+)
|
|
||||||
* [Make](https://linux.die.net/man/1/make) (optional, but easier)
|
|
||||||
|
|
||||||
```shell
|
|
||||||
git clone https://github.com/thomiceli/opengist
|
|
||||||
cd opengist
|
|
||||||
make
|
|
||||||
./opengist
|
|
||||||
```
|
|
||||||
|
|
||||||
Opengist is now running on port 6157, you can browse http://localhost:6157
|
|
||||||
|
|
14
docs/installation/binary.md
Normal file
14
docs/installation/binary.md
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# Install from binary
|
||||||
|
|
||||||
|
Download the archive for your system from the release page [here](https://github.com/thomiceli/opengist/releases/latest), and extract it.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# example for linux amd64
|
||||||
|
wget https://github.com/thomiceli/opengist/releases/download/v1.7.4/opengist1.7.4-linux-amd64.tar.gz
|
||||||
|
|
||||||
|
tar xzvf opengist1.7.4-linux-amd64.tar.gz
|
||||||
|
cd opengist
|
||||||
|
chmod +x opengist
|
||||||
|
./opengist # with or without `--config config.yml`
|
||||||
|
```
|
||||||
|
|
43
docs/installation/docker.md
Normal file
43
docs/installation/docker.md
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
# Install with Docker
|
||||||
|
|
||||||
|
Docker [images](https://github.com/thomiceli/opengist/pkgs/container/opengist) are available for each release :
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker pull ghcr.io/thomiceli/opengist:1
|
||||||
|
```
|
||||||
|
|
||||||
|
It can be used in a `docker-compose.yml` file :
|
||||||
|
|
||||||
|
1. Create a `docker-compose.yml` file with the following content
|
||||||
|
2. Run `docker compose up -d`
|
||||||
|
3. Opengist is now running on port 6157, you can browse http://localhost:6157
|
||||||
|
|
||||||
|
```yml
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
opengist:
|
||||||
|
image: ghcr.io/thomiceli/opengist:1
|
||||||
|
container_name: opengist
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "6157:6157" # HTTP port
|
||||||
|
- "2222:2222" # SSH port, can be removed if you don't use SSH
|
||||||
|
volumes:
|
||||||
|
- "$HOME/.opengist:/opengist"
|
||||||
|
environment:
|
||||||
|
# OG_LOG_LEVEL: info
|
||||||
|
# other configuration options
|
||||||
|
```
|
||||||
|
|
||||||
|
You can define which user/group should run the container and own the files by setting the `UID` and `GID` environment
|
||||||
|
variables :
|
||||||
|
|
||||||
|
```yml
|
||||||
|
services:
|
||||||
|
opengist:
|
||||||
|
# ...
|
||||||
|
environment:
|
||||||
|
UID: 1001
|
||||||
|
GID: 1001
|
||||||
|
```
|
19
docs/installation/source.md
Normal file
19
docs/installation/source.md
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# Installation from source
|
||||||
|
|
||||||
|
Requirements:
|
||||||
|
* [Git](https://git-scm.com/downloads) (2.28+)
|
||||||
|
* [Go](https://go.dev/doc/install) (1.22+)
|
||||||
|
* [Node.js](https://nodejs.org/en/download/) (16+)
|
||||||
|
* [Make](https://linux.die.net/man/1/make) (optional, but easier)
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git clone https://github.com/thomiceli/opengist
|
||||||
|
cd opengist
|
||||||
|
|
||||||
|
git checkout v1.7.4 # optional, to checkout the latest release
|
||||||
|
|
||||||
|
make
|
||||||
|
./opengist
|
||||||
|
```
|
||||||
|
|
||||||
|
Opengist is now running on port 6157, you can browse http://localhost:6157
|
55
docs/introduction.md
Normal file
55
docs/introduction.md
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
# Opengist
|
||||||
|
|
||||||
|
<img height="108px" src="https://raw.githubusercontent.com/thomiceli/opengist/master/public/opengist.svg" alt="Opengist" align="right" />
|
||||||
|
|
||||||
|
Opengist is a **self-hosted** pastebin **powered by Git**. All snippets are stored in a Git repository and can be
|
||||||
|
read and/or modified using standard Git commands, or with the web interface.
|
||||||
|
It is similiar to [GitHub Gist](https://gist.github.com/), but open-source and could be self-hosted.
|
||||||
|
|
||||||
|
Written in [Go](https://go.dev), Opengist aims to be fast and easy to deploy.
|
||||||
|
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* Create public, unlisted or private snippets
|
||||||
|
* [Init](usage/init-via-git.md) / Clone / Pull / Push snippets **via Git** over HTTP or SSH
|
||||||
|
* Syntax highlighting ; markdown & CSV support
|
||||||
|
* Search code in snippets ; browse users snippets, likes and forks
|
||||||
|
* Embed snippets in other websites
|
||||||
|
* Revisions history
|
||||||
|
* Like / Fork snippets
|
||||||
|
* Editor with indentation mode & size ; drag and drop files
|
||||||
|
* Download raw files or as a ZIP archive
|
||||||
|
* Retrieve snippet data/metadata via a JSON API
|
||||||
|
* OAuth2 login with GitHub, GitLab, Gitea, and OpenID Connect
|
||||||
|
* Avatars via Gravatar or OAuth2 providers
|
||||||
|
* Light/Dark mode
|
||||||
|
* Responsive UI
|
||||||
|
* Enable or disable signups
|
||||||
|
* Restrict or unrestrict snippets visibility to anonymous users
|
||||||
|
* Admin panel :
|
||||||
|
* delete users/gists;
|
||||||
|
* clean database/filesystem by syncing gists
|
||||||
|
* run `git gc` for all repositories
|
||||||
|
* SQLite database
|
||||||
|
* Logging
|
||||||
|
* Docker support
|
||||||
|
|
||||||
|
|
||||||
|
## System requirements
|
||||||
|
|
||||||
|
[Git](https://git-scm.com/download) is obviously required to run Opengist, as it's the main feature of the app.
|
||||||
|
Version **2.28** or later is recommended as the app has not been tested with older Git versions and some features would not work.
|
||||||
|
|
||||||
|
[OpenSSH](https://www.openssh.com/) suite if you wish to use Git over SSH.
|
||||||
|
|
||||||
|
|
||||||
|
## Components
|
||||||
|
|
||||||
|
* Backend Web Framework: [Echo](https://echo.labstack.com/)
|
||||||
|
* ORM: [GORM](https://gorm.io/)
|
||||||
|
* Frontend libraries:
|
||||||
|
* [TailwindCSS](https://tailwindcss.com/)
|
||||||
|
* [CodeMirror](https://codemirror.net/)
|
||||||
|
* [Day.js](https://day.js.org/)
|
||||||
|
* and [others](/package.json)
|
17
docs/public/favicon.svg
Normal file
17
docs/public/favicon.svg
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 27.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 500 500" style="enable-background:new 0 0 500 500;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{fill:#FFFFFF;}
|
||||||
|
</style>
|
||||||
|
<g id="document" transform="scale(1.6666666666666667 1.6666666666666667) translate(150.0 150.0)">
|
||||||
|
<path class="st0" d="M131.3,24.3c13.7-71-33.9-139.5-106.4-152.9C-47.7-142-117.6-95.3-131.3-24.3s33.9,139.5,106.4,152.9 C47.7,142,117.6,95.3,131.3,24.3z"/>
|
||||||
|
<path class="st0" d="M128.9,0c0,55.7-36.8,103-88,119.8c0.2-1.2,0.3-2.5,0.3-4c0.1-22.3,0.2-36.2,0.2-52.8 c0-11.7-0.2-18.1-0.2-18.1c1.8,0,21.1-6,29.9-12.1S89.2,15.1,90.5-1.4c1.3-16.6-6-36.2-12.4-47.8C65.3-72.4,54.7-86.6,45.4-94.5 c-9.3-7.8-16.1-6.1-22.1-1.4S8.5-76.9,2.2-71.2c-3,2.8-10.6,12-20.4,3.3C-21-70.3-38-93.6-48.5-90.6c-13.1,3.7-28.1,27.3-35.1,43.8 c-9,21-10.8,33.6-6.1,63.5c4.7,29.9,7.5,60,11.8,76.4c1,4,2.3,7.4,4,10.4c-33.2-22.8-55-60.7-55-103.5 c0-69.7,57.7-126.3,128.9-126.3S128.9-69.7,128.9,0z"/>
|
||||||
|
<path d="M0-145c-81.8,0-148.1,64.9-148.1,145S-81.8,145,0,145S148.1,80.1,148.1,0S81.8-145,0-145z M40.9,119.8 c0.2-1.2,0.3-2.5,0.3-4c0.1-22.3,0.2-36.2,0.2-52.8c0-11.7-0.2-18.1-0.2-18.1c1.8,0,21.1-6,29.9-12.1S89.2,15.1,90.5-1.4 c1.3-16.6-6-36.2-12.4-47.8C65.3-72.4,54.7-86.6,45.4-94.5c-9.3-7.8-16.1-6.1-22.1-1.4S8.5-76.9,2.2-71.2c-3,2.8-10.6,12-20.4,3.3 C-21-70.3-38-93.6-48.5-90.6c-13.1,3.7-28.1,27.3-35.1,43.8c-9,21-10.8,33.6-6.1,63.5c4.7,29.9,7.5,60,11.8,76.4 c1,4,2.3,7.4,4,10.4c-33.2-22.8-55-60.7-55-103.5c0-69.7,57.7-126.3,128.9-126.3S128.9-69.7,128.9,0 C128.9,55.7,92.1,103,40.9,119.8z"/>
|
||||||
|
<path class="st0" d="M-102.8-7.2l91.2-9.4l-0.3-7l-91.2,9.4L-102.8-7.2z"/>
|
||||||
|
<path class="st0" d="M12-17.3c0.8-9.6-6.5-18-16.3-18.8s-18.4,6.4-19.2,16S-17-2.1-7.2-1.3S11.2-7.7,12-17.3z"/>
|
||||||
|
<path class="st0" d="M62.9-24.6c0.8-9.6-6.5-18-16.3-18.8c-9.8-0.8-18.4,6.4-19.2,16c-0.8,9.6,6.5,18,16.3,18.8S62.1-15,62.9-24.6z "/>
|
||||||
|
<path class="st0" d="M-11.8-16.8l67.6-7.3l-0.5-6.3l-67.5,7.3L-11.8-16.8z"/>
|
||||||
|
<path class="st0" d="M53.1-23.6l49.5-12.2l-0.6-6.3L52.5-29.9L53.1-23.6z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
BIN
docs/public/opengist-demo.png
Normal file
BIN
docs/public/opengist-demo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 MiB |
|
@ -1,4 +1,4 @@
|
||||||
# Update
|
# Update Opengist
|
||||||
|
|
||||||
## Make a backup
|
## Make a backup
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@ chmod +x opengist
|
||||||
Stop the running instance; then pull the last changes from the master branch, and build the new version.
|
Stop the running instance; then pull the last changes from the master branch, and build the new version.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
git switch master
|
||||||
git pull
|
git pull
|
||||||
make
|
make
|
||||||
./opengist
|
./opengist
|
||||||
|
|
|
@ -39,4 +39,4 @@ To http://localhost:6157/init
|
||||||
* [new branch] master -> master
|
* [new branch] master -> master
|
||||||
```
|
```
|
||||||
|
|
||||||
https://github.com/thomiceli/opengist/assets/27960254/3fe1a0ba-b638-4928-83a1-f38e46fea066
|
<video controls="controls" src="https://github.com/thomiceli/opengist/assets/27960254/3fe1a0ba-b638-4928-83a1-f38e46fea066" />
|
1894
package-lock.json
generated
1894
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -4,7 +4,10 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "node_modules/.bin/vite -c public/vite.config.js",
|
"dev": "node_modules/.bin/vite -c public/vite.config.js",
|
||||||
"build": "node_modules/.bin/vite -c public/vite.config.js build",
|
"build": "node_modules/.bin/vite -c public/vite.config.js build",
|
||||||
"preview": "node_modules/.bin/vite -c public/vite.config.js preview"
|
"preview": "node_modules/.bin/vite -c public/vite.config.js preview",
|
||||||
|
"docs:dev": "vitepress dev docs",
|
||||||
|
"docs:build": "vitepress build docs",
|
||||||
|
"docs:preview": "vitepress preview docs"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@codemirror/commands": "^6.2.2",
|
"@codemirror/commands": "^6.2.2",
|
||||||
|
|
Loading…
Reference in a new issue