Move SealShare from GitHub to Gitea only
docker / test (8.5) (push) Successful in 2m13s
linter / quality (push) Successful in 1m8s
tests / ci (8.5) (push) Successful in 2m7s
docker / build-and-push (push) Failing after 9m54s
docker / release (push) Has been skipped

The workflows live in .gitea/workflows. The Docker workflow logs in to
the Gitea container registry with REGISTRY_TOKEN (Gitea's job token cannot
publish packages yet), publishes gitea.nonameweb.ch/nonameweb/sealshare
with a registry build cache, and makes the release on Gitea with the
version's section of the changelog as its notes.

The README, the website's quick start, both compose files and the image
label point to Gitea; the changelog announces the new image name and
links Gitea. GiteaOnlyTest keeps GitHub and ghcr.io out.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V9NnLxnPp8vaaurb3Z1MFy
This commit is contained in:
Andreas Reinhold / reini
2026-09-13 13:59:07 +02:00
co-authored by Claude Opus 5
parent 606cc766f2
commit d860a16551
12 changed files with 82 additions and 33 deletions
+1 -1
View File
@@ -21,7 +21,7 @@ docker-compose*.yml
Dockerfile
# CI/CD
.github
.gitea
# Testing
tests
+1 -1
View File
@@ -8,4 +8,4 @@
CHANGELOG.md export-ignore
README.md export-ignore
.github/workflows/browser-tests.yml export-ignore
.gitea export-ignore
@@ -73,19 +73,21 @@ jobs:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GitHub Container Registry
if: github.event_name != 'pull_request'
# Gitea's job token cannot publish packages yet: REGISTRY_TOKEN is an access token with
# package write rights, owned by the account that pushes (gitea.actor).
- name: Log in to the Gitea container registry
if: gitea.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
registry: gitea.nonameweb.ch
username: ${{ gitea.actor }}
password: ${{ secrets.REGISTRY_TOKEN }}
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}
images: gitea.nonameweb.ch/nonameweb/sealshare
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
@@ -98,21 +100,27 @@ jobs:
with:
context: .
platforms: linux/amd64,linux/arm64
push: ${{ github.event_name != 'pull_request' }}
push: ${{ gitea.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
cache-from: type=registry,ref=gitea.nonameweb.ch/nonameweb/sealshare:buildcache
cache-to: ${{ gitea.event_name != 'pull_request' && 'type=registry,ref=gitea.nonameweb.ch/nonameweb/sealshare:buildcache,mode=max' || '' }}
release:
runs-on: ubuntu-latest
needs: build-and-push
if: startsWith(github.ref, 'refs/tags/v')
if: startsWith(gitea.ref, 'refs/tags/v')
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
- name: Take the release notes from the changelog
run: |
version="${{ gitea.ref_name }}"
awk -v heading="## [${version#v}]" 'index($0, heading) == 1 { found = 1; next } found && /^## \[/ { exit } found { print }' CHANGELOG.md > release-notes.md
test -s release-notes.md
- name: Create the Gitea release
uses: https://gitea.com/actions/gitea-release-action@v1
with:
generate_release_notes: true
body_path: release-notes.md
@@ -44,4 +44,4 @@ jobs:
# commit_options: '--no-verify'
# file_pattern: |
# **/*
# !.github/workflows/*
# !.gitea/workflows/*
+3 -6
View File
@@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- SealShare moved from GitHub to Gitea: the source is at https://gitea.nonameweb.ch/noNameWEB/SealShare, and the Docker image is published as `gitea.nonameweb.ch/nonameweb/sealshare`. Images at `ghcr.io/surtic86/sealshare` are no longer updated — change `image:` in your `docker-compose.yml` to the new name to keep receiving releases.
- The interface is rebuilt on [Livewire Material](https://gitea.nonameweb.ch/noNameWEB/livewire-material), a Material 3 Expressive component library, replacing Mary UI and DaisyUI. Every page — upload, share created, download, sign-in, settings, admin and the setup wizard — uses its components, in a colour scheme generated from SealShare's indigo.
- The theme follows the system's light or dark setting until a user picks Light, Dark or System in Settings → Appearance, or from the account menu. A theme chosen in 1.x is kept.
- A floating toolbar centred at the bottom of every page replaces the sidebar and header layouts. Signed-in users reach Upload and the admin pages from it, and Settings, the theme and Log out from its account menu. The site's name and logo head the upload and download pages.
@@ -105,9 +106,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Dark themed UI built with Livewire, Alpine.js, Tailwind CSS and DaisyUI.
- Docker images published to `ghcr.io/surtic86/sealshare`, served by FrankenPHP via Laravel Octane.
[Unreleased]: https://github.com/surtic86/SealShare/compare/v2.0.0...HEAD
[2.0.0]: https://github.com/surtic86/SealShare/compare/v1.2.0...v2.0.0
[1.2.0]: https://github.com/surtic86/SealShare/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/surtic86/SealShare/compare/v1.0.1...v1.1.0
[1.0.1]: https://github.com/surtic86/SealShare/compare/v1.0.0...v1.0.1
[1.0.0]: https://github.com/surtic86/SealShare/releases/tag/v1.0.0
[Unreleased]: https://gitea.nonameweb.ch/noNameWEB/SealShare/compare/v2.0.0...main
[2.0.0]: https://gitea.nonameweb.ch/noNameWEB/SealShare/releases/tag/v2.0.0
+2 -2
View File
@@ -41,7 +41,7 @@ RUN npm run build
FROM dunglas/frankenphp:php8.5-alpine AS production
LABEL maintainer="surtic86"
LABEL org.opencontainers.image.source="https://github.com/surtic86/SealShare"
LABEL org.opencontainers.image.source="https://gitea.nonameweb.ch/noNameWEB/SealShare"
LABEL org.opencontainers.image.description="Self-hosted encrypted file sharing"
# Install required PHP extensions
@@ -84,7 +84,7 @@ COPY --from=vendor /app/vendor ./vendor
COPY --from=assets /app/public/build ./public/build
# Remove dev/build files and stale cache not needed in production
RUN rm -rf node_modules tests .github docker/dev.Dockerfile docker/dev-entrypoint.sh .env .env.example \
RUN rm -rf node_modules tests .gitea docker/dev.Dockerfile docker/dev-entrypoint.sh .env .env.example \
bootstrap/cache/*.php \
&& mkdir -p storage/app/shares storage/app/public storage/framework/cache \
storage/framework/sessions storage/framework/testing storage/framework/views \
+3 -3
View File
@@ -68,11 +68,11 @@ The app is available at `http://localhost:8000` with Vite HMR on port `5173`.
```bash
mkdir sealshare && cd sealshare
curl -O https://raw.githubusercontent.com/surtic86/SealShare/main/docker-compose.example.yml
curl -O https://gitea.nonameweb.ch/noNameWEB/SealShare/raw/branch/main/docker-compose.example.yml
cp docker-compose.example.yml docker-compose.yml
# Generate an app key and paste it into docker-compose.yml
docker run --rm ghcr.io/surtic86/sealshare:latest php artisan key:generate --show
docker run --rm gitea.nonameweb.ch/nonameweb/sealshare:latest php artisan key:generate --show
# Edit docker-compose.yml — set APP_KEY, APP_URL, and SERVER_NAME
# Then start:
@@ -114,7 +114,7 @@ Behind a reverse proxy, raise its request body limit and read timeout as well (n
### Manual (without Docker)
```bash
git clone https://github.com/surtic86/SealShare.git
git clone https://gitea.nonameweb.ch/noNameWEB/SealShare.git
cd SealShare
composer install --no-dev --optimize-autoloader
+2 -2
View File
@@ -18,7 +18,7 @@ services:
# SealShare Application (FrankenPHP/Octane)
# ------------------------------------------
app:
image: ghcr.io/surtic86/sealshare:latest
image: gitea.nonameweb.ch/nonameweb/sealshare:latest
restart: unless-stopped
ports:
- "80:80" # HTTP
@@ -71,7 +71,7 @@ services:
# Scheduler - Runs cleanup for expired shares
# ------------------------------------------
scheduler:
image: ghcr.io/surtic86/sealshare:latest
image: gitea.nonameweb.ch/nonameweb/sealshare:latest
restart: unless-stopped
entrypoint: ["php", "artisan", "schedule:work"]
volumes:
+2 -2
View File
@@ -1,6 +1,6 @@
services:
app:
image: ghcr.io/surtic86/sealshare:latest
image: gitea.nonameweb.ch/nonameweb/sealshare:latest
build:
context: .
dockerfile: Dockerfile
@@ -47,7 +47,7 @@ services:
retries: 3
scheduler:
image: ghcr.io/surtic86/sealshare:latest
image: gitea.nonameweb.ch/nonameweb/sealshare:latest
build:
context: .
dockerfile: Dockerfile
+44
View File
@@ -0,0 +1,44 @@
<?php
/*
* SealShare lives on Gitea only: the source at gitea.nonameweb.ch/noNameWEB/SealShare and the image
* at gitea.nonameweb.ch/nonameweb/sealshare. The changelog keeps its history, and the website's
* comparison sources link other projects' repositories, so neither is checked.
*/
test('the project points to Gitea, not GitHub, for its source, image and workflows', function () {
$files = [
'README.md',
'Dockerfile',
'.dockerignore',
'.gitattributes',
'docker-compose.yml',
'docker-compose.example.yml',
...array_map(fn (string $path): string => str($path)->after(base_path().'/')->toString(), glob(base_path('.gitea/workflows/*.yml'))),
];
foreach ($files as $file) {
expect(file_get_contents(base_path($file)))->not->toMatch('/github|ghcr\.io/i', "{$file} still refers to GitHub");
}
expect(base_path('.github'))->not->toBeDirectory()
->and(glob(base_path('.gitea/workflows/*.yml')))->not->toBeEmpty();
});
test('the website installs SealShare from Gitea', function () {
preg_match('/<section[^>]*id="install".*?<\/section>/s', file_get_contents(base_path('website/index.html')), $install);
expect($install[0])->not->toMatch('/github|ghcr\.io/i')
->toContain('gitea.nonameweb.ch/nonameweb/sealshare:latest')
->toContain('https://gitea.nonameweb.ch/noNameWEB/SealShare/raw/branch/main/docker-compose.example.yml');
});
test('images are published to the Gitea registry and releases are made on Gitea', function () {
$workflow = file_get_contents(base_path('.gitea/workflows/docker.yml'));
expect($workflow)
->toContain('registry: gitea.nonameweb.ch')
->toContain('images: gitea.nonameweb.ch/nonameweb/sealshare')
->toContain('password: ${{ secrets.REGISTRY_TOKEN }}')
->toContain('uses: https://gitea.com/actions/gitea-release-action@v1');
});
+2 -2
View File
@@ -547,11 +547,11 @@
<div class="code">
<div class="code__bar"><svg class="icon" aria-hidden="true"><use href="#i-terminal"/></svg><span>Production, with Docker Compose</span></div>
<pre><code>mkdir sealshare &amp;&amp; cd sealshare
curl -O https://raw.githubusercontent.com/surtic86/SealShare/main/docker-compose.example.yml
curl -O https://gitea.nonameweb.ch/noNameWEB/SealShare/raw/branch/main/docker-compose.example.yml
cp docker-compose.example.yml docker-compose.yml
<span class="comment"># Generate an app key and paste it into docker-compose.yml</span>
docker run --rm ghcr.io/surtic86/sealshare:latest php artisan key:generate --show
docker run --rm gitea.nonameweb.ch/nonameweb/sealshare:latest php artisan key:generate --show
<span class="comment"># Edit docker-compose.yml — set APP_KEY, APP_URL, and SERVER_NAME</span>
<span class="comment"># Then start:</span>